From 52147675d75526cc2d9de00014119faf418fc4fc Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Mon, 29 Dec 2008 13:20:33 +0000 Subject: [PATCH 01/68] Fixed ArgumentException when MSHelpServices GetSlotFromString method returns an invalid slot index. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3732 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../src/Commands/ShowErrorHelpCommand.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/AddIns/Misc/HtmlHelp2/Project/src/Commands/ShowErrorHelpCommand.cs b/src/AddIns/Misc/HtmlHelp2/Project/src/Commands/ShowErrorHelpCommand.cs index 80d6e86d4b..553d909ad8 100644 --- a/src/AddIns/Misc/HtmlHelp2/Project/src/Commands/ShowErrorHelpCommand.cs +++ b/src/AddIns/Misc/HtmlHelp2/Project/src/Commands/ShowErrorHelpCommand.cs @@ -4,6 +4,7 @@ // // $Revision: 3555 $ // + using MSHelpServices; using System; using System.Collections.Generic; @@ -15,7 +16,7 @@ using ICSharpCode.SharpDevelop.Gui; namespace HtmlHelp2.Commands { /// - /// Description of ShowErrorHelpCommand + /// Shows help information for an error in the Errors window. /// public class ShowErrorHelpCommand : AbstractMenuCommand { @@ -27,8 +28,7 @@ namespace HtmlHelp2.Commands ICSharpCode.SharpDevelop.Gui.TaskView view = (ICSharpCode.SharpDevelop.Gui.TaskView)Owner; // Search all selected tasks - foreach (Task t in new List(view.SelectedTasks)) - { + foreach (Task t in new List(view.SelectedTasks)) { string code = t.BuildError.ErrorCode; if (string.IsNullOrEmpty(code)) @@ -38,8 +38,7 @@ namespace HtmlHelp2.Commands MSHelpServices.IHxTopic topic; // If HtmlHelp2 AddIn is initialised correctly we can start! - if (HtmlHelp2.Environment.HtmlHelp2Environment.SessionIsInitialized) - { + if (HtmlHelp2.Environment.HtmlHelp2Environment.SessionIsInitialized) { // Get the topic IHxIndex index = HtmlHelp2.Environment.HtmlHelp2Environment.GetIndex(""); if (index == null) { @@ -47,6 +46,10 @@ namespace HtmlHelp2.Commands return; } int indexSlot = index.GetSlotFromString(code); + if (indexSlot <= 0) { + MessageService.ShowErrorFormatted("No help available for {0}!", code); + return; + } IHxTopicList list = index.GetTopicsFromSlot(indexSlot); if (list == null) { MessageService.ShowErrorFormatted("No help available for {0}!", code); @@ -62,9 +65,7 @@ namespace HtmlHelp2.Commands MessageService.ShowErrorFormatted("No help available for {0}!", code); return; } - } - else // Otherwise we have to show an Error message ... - { + } else { // Otherwise we have to show an Error message ... LoggingService.Error("Couldn't initialize help database"); return; } From 759f7933a2657d3390437f2a0e8666230a8a28bb Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 29 Dec 2008 18:24:29 +0000 Subject: [PATCH 02/68] Fixed SD2-1488: Tooltips not visible on secondary monitor git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3733 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Util/TipPainter.cs | 47 ++++++------------- 1 file changed, 14 insertions(+), 33 deletions(-) diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Util/TipPainter.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Util/TipPainter.cs index acfd1afdea..cb2bb2f144 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Util/TipPainter.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Util/TipPainter.cs @@ -15,7 +15,6 @@ namespace ICSharpCode.TextEditor.Util { const float HorizontalBorder = 2; const float VerticalBorder = 1; - static RectangleF workingArea = RectangleF.Empty; //static StringFormat centerTipFormat = CreateTipStringFormat(); @@ -24,19 +23,22 @@ namespace ICSharpCode.TextEditor.Util return GetTipSize(control, graphics, new TipText (graphics, font, description)); } + static Rectangle GetWorkingArea(Control control) + { + Form ownerForm = control.FindForm(); + if (ownerForm.Owner != null) { + ownerForm = ownerForm.Owner; + } + + return Screen.GetWorkingArea(ownerForm); + } + public static Size GetTipSize(Control control, Graphics graphics, TipSection tipData) { Size tipSize = Size.Empty; SizeF tipSizeF = SizeF.Empty; - if (workingArea == RectangleF.Empty) { - Form ownerForm = control.FindForm(); - if (ownerForm.Owner != null) { - ownerForm = ownerForm.Owner; - } - - workingArea = Screen.GetWorkingArea(ownerForm); - } + RectangleF workingArea = GetWorkingArea(control); PointF screenLocation = control.PointToScreen(Point.Empty); @@ -68,14 +70,7 @@ namespace ICSharpCode.TextEditor.Util Size tipSize = Size.Empty; SizeF tipSizeF = SizeF.Empty; - if (workingArea == RectangleF.Empty) { - Form ownerForm = control.FindForm(); - if (ownerForm.Owner != null) { - ownerForm = ownerForm.Owner; - } - - workingArea = Screen.GetWorkingArea(ownerForm); - } + RectangleF workingArea = GetWorkingArea(control); PointF screenLocation = p; @@ -110,14 +105,7 @@ namespace ICSharpCode.TextEditor.Util PointF screenLocation = control.PointToScreen(Point.Empty); - if (workingArea == RectangleF.Empty) { - Form ownerForm = control.FindForm(); - if (ownerForm.Owner != null) { - ownerForm = ownerForm.Owner; - } - - workingArea = Screen.GetWorkingArea(ownerForm); - } + RectangleF workingArea = GetWorkingArea(control); SizeF maxLayoutSize = new SizeF(workingArea.Right - screenLocation.X - HorizontalBorder * 2, workingArea.Bottom - screenLocation.Y - VerticalBorder * 2); @@ -163,14 +151,7 @@ namespace ICSharpCode.TextEditor.Util PointF screenLocation = control.PointToScreen(new Point(control.Width, 0)); - if (workingArea == RectangleF.Empty) { - Form ownerForm = control.FindForm(); - if (ownerForm.Owner != null) { - ownerForm = ownerForm.Owner; - } - - workingArea = Screen.GetWorkingArea(ownerForm); - } + RectangleF workingArea = GetWorkingArea(control); SizeF maxLayoutSize = new SizeF(screenLocation.X - HorizontalBorder * 2, workingArea.Bottom - screenLocation.Y - VerticalBorder * 2); From 08b5ca93e2e536ec00ff9023696cd084b1bad610 Mon Sep 17 00:00:00 2001 From: Christian Hornung Date: Mon, 29 Dec 2008 20:30:54 +0000 Subject: [PATCH 03/68] Fixed SD2-1496 - ArgumentOutOfRange exception when generating event handler in forms designer. The Reparse method did not update the class part that comes from the primary file. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3734 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../AbstractDesignerGenerator.cs | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs index 073753fa25..86b28908be 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs @@ -289,9 +289,27 @@ namespace ICSharpCode.FormsDesigner protected void Reparse() { - // get new initialize components - ParseInformation info = ParserService.ParseFile(this.ViewContent.DesignerCodeFile.FileName, this.ViewContent.DesignerCodeFileContent, false); + // Reparse primary file to update currentClassPart + ParseInformation info = ParserService.ParseFile(this.ViewContent.PrimaryFileName, this.ViewContent.PrimaryFileContent, false); ICompilationUnit cu = info.BestCompilationUnit; + foreach (IClass c in cu.Classes) { + if (FormsDesignerSecondaryDisplayBinding.BaseClassIsFormOrControl(c)) { + if (FormsDesignerSecondaryDisplayBinding.GetInitializeComponents(c) != null) { + this.currentClassPart = c; + break; + } + } + } + + // Reparse designer code file to update initializeComponents, + // completeClass and formClass + if (this.ViewContent.DesignerCodeFile != this.ViewContent.PrimaryFile) { + // Actual parsing is only necessary if the designer code file + // is not the same as the primary file. Otherwise we just + // reuse the parse info from above. + info = ParserService.ParseFile(this.ViewContent.DesignerCodeFile.FileName, this.ViewContent.DesignerCodeFileContent, false); + } + cu = info.BestCompilationUnit; foreach (IClass c in cu.Classes) { if (FormsDesignerSecondaryDisplayBinding.BaseClassIsFormOrControl(c)) { this.initializeComponents = FormsDesignerSecondaryDisplayBinding.GetInitializeComponents(c); @@ -338,6 +356,8 @@ namespace ICSharpCode.FormsDesigner { Reparse(); + LoggingService.Debug("Forms designer: AbstractDesignerGenerator.InsertComponentEvent: eventMethodName=" + eventMethodName); + foreach (IMethod method in completeClass.Methods) { if (method.Name == eventMethodName) { file = method.DeclaringType.CompilationUnit.FileName; @@ -362,6 +382,7 @@ namespace ICSharpCode.FormsDesigner file = currentClassPart.CompilationUnit.FileName; int line = GetEventHandlerInsertionLine(currentClassPart); + LoggingService.Debug("-> Inserting new event handler at line " + line.ToString(System.Globalization.CultureInfo.InvariantCulture)); int offset = this.viewContent.PrimaryFileDocument.GetLineSegment(line - 1).Offset; From 363aced49832e305b083b30de88c3177a6da45cd Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 29 Dec 2008 22:53:10 +0000 Subject: [PATCH 04/68] Fixed SD2-1499: Parser null reference exception when parsing an incomplete VB.NET class git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3735 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Parser/VBNet/Parser.cs | 16 ++++++++-------- .../Project/Src/Parser/VBNet/VBNET.ATG | 16 ++++++++-------- .../Parser/GlobalScope/TypeDeclarationTests.cs | 8 ++++++++ 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs index 29dd214f20..4551eda142 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs @@ -580,7 +580,7 @@ newType.Templates); out typeRef); #line 443 "VBNET.ATG" - newType.BaseTypes.Add(typeRef); + SafeAdd(newType, newType.BaseTypes, typeRef); } while (la.kind == 123) { TypeImplementsClause( @@ -695,7 +695,7 @@ newType); out typeRef, false); #line 497 "VBNET.ATG" - newType.BaseTypes.Add(typeRef); + SafeAdd(newType, newType.BaseTypes, typeRef); } EndOfStmt(); @@ -975,7 +975,7 @@ out List baseInterfaces) { out type); #line 1570 "VBNET.ATG" - baseInterfaces.Add(type); + if (type != null) baseInterfaces.Add(type); while (la.kind == 12) { lexer.NextToken(); @@ -984,7 +984,7 @@ out type); out type); #line 1574 "VBNET.ATG" - baseInterfaces.Add(type); + if (type != null) baseInterfaces.Add(type); } EndOfStmt(); } @@ -1223,7 +1223,7 @@ out List bases) { out type); #line 1554 "VBNET.ATG" - bases.Add(type); + if (type != null) bases.Add(type); while (la.kind == 12) { lexer.NextToken(); TypeName( @@ -1231,7 +1231,7 @@ out type); out type); #line 1557 "VBNET.ATG" - bases.Add(type); + if (type != null) bases.Add(type); } EndOfStmt(); } @@ -2512,7 +2512,7 @@ out List handlesClause) { out name); #line 1543 "VBNET.ATG" - handlesClause.Add(name); + if (name != null) handlesClause.Add(name); while (la.kind == 12) { lexer.NextToken(); EventMemberSpecifier( @@ -2520,7 +2520,7 @@ out name); out name); #line 1544 "VBNET.ATG" - handlesClause.Add(name); + if (name != null) handlesClause.Add(name); } } diff --git a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG index 16f6c08f75..1392e53695 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG +++ b/src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG @@ -440,7 +440,7 @@ NonModuleDeclaration attributes> TypeParameterList EndOfStmt (. newType.BodyStartLocation = t.Location; .) - [ ClassBaseType (. newType.BaseTypes.Add(typeRef); .) ] + [ ClassBaseType (. SafeAdd(newType, newType.BaseTypes, typeRef); .) ] { TypeImplementsClause (. newType.BaseTypes.AddRange(baseInterfaces); .) } ClassBody "End" "Class" (. newType.EndLocation = t.EndLocation; .) @@ -494,7 +494,7 @@ NonModuleDeclaration attributes> newType.Type = ClassType.Enum; .) Identifier (. newType.Name = t.val; .) - [ "As" NonArrayTypeName (. newType.BaseTypes.Add(typeRef); .) ] + [ "As" NonArrayTypeName (. SafeAdd(newType, newType.BaseTypes, typeRef); .) ] EndOfStmt (. newType.BodyStartLocation = t.Location; .) EnumBody @@ -1540,8 +1540,8 @@ HandlesClause handlesClause> handlesClause = new List(); string name; .) = - "Handles" EventMemberSpecifier (. handlesClause.Add(name); .) - { "," EventMemberSpecifier (. handlesClause.Add(name); .) } + "Handles" EventMemberSpecifier (. if (name != null) handlesClause.Add(name); .) + { "," EventMemberSpecifier (. if (name != null) handlesClause.Add(name); .) } . /* 7.8. */ @@ -1551,10 +1551,10 @@ InterfaceBase bases> bases = new List(); .) = "Inherits" - TypeName (. bases.Add(type); .) + TypeName (. if (type != null) bases.Add(type); .) { "," - TypeName (. bases.Add(type); .) + TypeName (. if (type != null) bases.Add(type); .) } EndOfStmt . @@ -1567,11 +1567,11 @@ TypeImplementsClause baseInterfaces> .) = "Implements" TypeName (. - baseInterfaces.Add(type); + if (type != null) baseInterfaces.Add(type); .) { "," TypeName - (. baseInterfaces.Add(type); .) + (. if (type != null) baseInterfaces.Add(type); .) } EndOfStmt . diff --git a/src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs b/src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs index 9106d94914..d97a2e633a 100644 --- a/src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs +++ b/src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs @@ -196,6 +196,14 @@ public abstract class MyClass : MyBase, Interface1, My.Test.Interface2 Assert.AreEqual(2, td.EndLocation.Line, "end line"); } + [Test] + public void VBNetMissingBaseClassTest() + { + // SD2-1499: test that this invalid code doesn't crash + TypeDeclaration td = ParseUtilVBNet.ParseGlobal("public class test inherits", true); + Assert.AreEqual(0, td.BaseTypes.Count); + } + [Test] public void VBNetEnumWithBaseClassDeclarationTest() { From a3cabc08a161e427431b23765abe6ee2dfc08601 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 31 Dec 2008 10:47:16 +0000 Subject: [PATCH 05/68] StyleCop's tools options panel now handles spaces in the settings file path. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3736 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/AddIns/Misc/SourceAnalysis/Src/AnalysisIdeOptionsPanel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AddIns/Misc/SourceAnalysis/Src/AnalysisIdeOptionsPanel.cs b/src/AddIns/Misc/SourceAnalysis/Src/AnalysisIdeOptionsPanel.cs index 7e58ced0cd..0798683007 100644 --- a/src/AddIns/Misc/SourceAnalysis/Src/AnalysisIdeOptionsPanel.cs +++ b/src/AddIns/Misc/SourceAnalysis/Src/AnalysisIdeOptionsPanel.cs @@ -62,7 +62,7 @@ namespace MattEverson.SourceAnalysis void ModifyStyleCopSettingsClick(object sender, EventArgs e) { var executable = Path.Combine(StyleCopWrapper.FindStyleCopPath(), "StyleCopSettingsEditor.exe"); - var parameters = StyleCopWrapper.GetMasterSettingsFile(); + var parameters = "\"" + StyleCopWrapper.GetMasterSettingsFile() + "\""; if (!File.Exists(executable)) { LoggingService.Debug("StyleCopSettingsEditor.exe: " + executable); From e8fcd7c0203e0a5247e395ab2337d4f6659c90a3 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Fri, 2 Jan 2009 15:14:04 +0000 Subject: [PATCH 06/68] The Python forms designer (currently disabled) now has limited support for designing very basic forms. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3738 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Python/PyWalker/MainForm.cs | 2 +- .../Python/PyWalker/ResolveWalker.cs | 77 +++---- .../Project/PythonBinding.csproj | 4 +- .../Project/Src/IComponentCreator.cs | 28 ++- .../Src/PythonControlFieldExpression.cs | 125 +++++++++++ .../Project/Src/PythonDesignerGenerator.cs | 38 +++- .../Project/Src/PythonDesignerLoader.cs | 33 ++- .../PythonBinding/Project/Src/PythonForm.cs | 1 + .../Project/Src/PythonFormVisitor.cs | 33 --- .../Project/Src/PythonFormWalker.cs | 196 ++++++++++++++++++ .../Project/Src/PythonFormWalkerException.cs | 21 ++ .../Src/PythonFormsDesignerDisplayBinding.cs | 11 +- .../PythonBinding/Project/Src/PythonParser.cs | 33 +-- .../Test/AddInFileTestFixture.cs | 40 ++++ .../Designer/GenerateSimpleFormTestFixture.cs | 3 +- ...rgeFindsInitializeComponentsTestFixture.cs | 8 +- .../Test/Designer/LoadFormTestFixtureBase.cs | 62 +++++- .../Designer/LoadSimpleFormTestFixture.cs | 67 +++++- .../Test/Designer/LoadTextBoxTestFixture.cs | 92 ++++++++ .../Test/Designer/MergeFormTestFixture.cs | 42 ++-- ...ingInitializeComponentMethodTestFixture.cs | 70 +++++++ ...LineAfterInitializeComponentTestFixture.cs | 87 ++++++++ ...PythonDesignerLoaderProviderTestFixture.cs | 2 +- .../PythonDesignerLoaderTestFixture.cs | 4 +- .../TextBoxNotAddedToFormTestFixture.cs | 73 +++++++ ...ditorIndentPassedToGeneratorTestFixture.cs | 85 ++++++++ .../Test/Designer/UnknownTypeTestFixture.cs | 46 ++++ .../FormsDesignerDisplayBindingTestFixture.cs | 4 +- .../Parsing/IronPythonParserTestFixture.cs | 68 ------ .../Test/PythonBinding.Tests.csproj | 9 +- .../Test/Utils/AddedComponent.cs | 54 +++++ .../Test/Utils/CreatedInstance.cs | 69 ++++++ .../Utils/DerivedPythonDesignerGenerator.cs | 8 +- 33 files changed, 1275 insertions(+), 220 deletions(-) create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonControlFieldExpression.cs delete mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormVisitor.cs create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormWalker.cs create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormWalkerException.cs create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadTextBoxTestFixture.cs create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/MissingInitializeComponentMethodTestFixture.cs create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/NoNewLineAfterInitializeComponentTestFixture.cs create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextBoxNotAddedToFormTestFixture.cs create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextEditorIndentPassedToGeneratorTestFixture.cs create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/UnknownTypeTestFixture.cs delete mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Test/Parsing/IronPythonParserTestFixture.cs create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/AddedComponent.cs create mode 100644 src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/CreatedInstance.cs diff --git a/src/AddIns/BackendBindings/Python/PyWalker/MainForm.cs b/src/AddIns/BackendBindings/Python/PyWalker/MainForm.cs index 2cfbdb61ca..756e88b79c 100644 --- a/src/AddIns/BackendBindings/Python/PyWalker/MainForm.cs +++ b/src/AddIns/BackendBindings/Python/PyWalker/MainForm.cs @@ -48,7 +48,7 @@ namespace PyWalker PythonAst ast = parser.ParseFile(false); if (sink.Errors.Count == 0) { ResolveWalker walker = new ResolveWalker(this); - walker.Walk(ast); + ast.Walk(walker); } else { walkerOutputTextBox.Text += "\r\n"; foreach (PythonCompilerError error in sink.Errors) { diff --git a/src/AddIns/BackendBindings/Python/PyWalker/ResolveWalker.cs b/src/AddIns/BackendBindings/Python/PyWalker/ResolveWalker.cs index e127423cf9..1da2736ef9 100644 --- a/src/AddIns/BackendBindings/Python/PyWalker/ResolveWalker.cs +++ b/src/AddIns/BackendBindings/Python/PyWalker/ResolveWalker.cs @@ -31,49 +31,43 @@ namespace PyWalker public override bool Walk(AndExpression node) { writer.WriteLine("And"); - return true; + return base.Walk(node); } public override bool Walk(AssertStatement node) { writer.WriteLine("Assert"); - return true; + return base.Walk(node); } - //public override bool Walk(AugAssignStatement node) - //{ - // writer.WriteLine("AugAssert"); - // return true; - //} - public override bool Walk(Arg node) { writer.WriteLine("Arg: " + node.Name.ToString()); - return true; + return base.Walk(node); } -// public override bool Walk(AssignStatement node) -// { -// writer.WriteLine("Assign"); -// return true; -// } + public override bool Walk(AssignmentStatement node) + { + writer.WriteLine("AssignmentStatement"); + return base.Walk(node); + } public override bool Walk(BackQuoteExpression node) { writer.WriteLine("BackQuote"); - return true; + return base.Walk(node); } public override bool Walk(BinaryExpression node) { writer.WriteLine("Binary"); - return true; + return base.Walk(node); } public override bool Walk(BreakStatement node) { writer.WriteLine("Breaks"); - return true; + return base.Walk(node); } public override bool Walk(ClassDefinition node) @@ -83,121 +77,109 @@ namespace PyWalker } else { writer.WriteLine("Class: " + node.Name.ToString()); } - return true; + return base.Walk(node); } public override bool Walk(ConditionalExpression node) { writer.WriteLine("ConditionalExpression"); - return true; + return base.Walk(node); } public override bool Walk(ConstantExpression node) { writer.WriteLine("ConstantExpression"); - return true; + return base.Walk(node); } public override bool Walk(ContinueStatement node) { writer.WriteLine("Continue"); - return true; + return base.Walk(node); } public override bool Walk(PrintStatement node) { writer.WriteLine("PrintStatement"); - return true; + return base.Walk(node); } public override bool Walk(FunctionDefinition node) { writer.WriteLine("FunctionDefinition"); - return true; + return base.Walk(node); } public override bool Walk(CallExpression node) { writer.WriteLine("Call"); - return true; + return base.Walk(node); } public override bool Walk(DictionaryExpression node) { writer.WriteLine("Dict"); - return true; + return base.Walk(node); } public override bool Walk(DottedName node) { writer.WriteLine("DottedName"); - return true; + return base.Walk(node); } public override bool Walk(ExpressionStatement node) { writer.WriteLine("Expr"); - return true; + return base.Walk(node); } -// public override bool Walk(FieldExpression node) -// { -// writer.WriteLine("Field: " + node.Name.ToString()); -// return true; -// } - public override bool Walk(GlobalStatement node) { writer.WriteLine("Global"); - return true; + return base.Walk(node); } public override bool Walk(NameExpression node) { writer.WriteLine("Name: " + node.Name); - return true; + return base.Walk(node); } public override bool Walk(FromImportStatement node) { writer.WriteLine("FromImport: " + node.Root.MakeString()); - return true; + return base.Walk(node); } public override bool Walk(ImportStatement node) { writer.WriteLine("Import: " + GetImports(node.Names)); - return true; + return base.Walk(node); } public override bool Walk(UnaryExpression node) { writer.WriteLine("Unary"); - return true; + return base.Walk(node); } public override bool Walk(SuiteStatement node) { writer.WriteLine("Suite"); - return true; + return base.Walk(node); } -// public override bool Walk(GlobalSuite node) -// { -// writer.WriteLine("GlobalSuite"); -// return true; -// } - public override bool Walk(ErrorExpression node) { writer.WriteLine("Error"); - return true; + return base.Walk(node); } public override bool Walk(IfStatement node) { writer.WriteLine("If"); - return true; + return base.Walk(node); } string GetImports(IList names) @@ -222,6 +204,5 @@ namespace PyWalker } return s.ToString(); } - } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj b/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj index 8a8c959bbd..fbf8798beb 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj @@ -86,13 +86,15 @@ + - + + diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/IComponentCreator.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/IComponentCreator.cs index 88d1b18edd..05455d0c58 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/IComponentCreator.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/IComponentCreator.cs @@ -6,13 +6,19 @@ // using System; +using System.Collections; using System.ComponentModel; namespace ICSharpCode.PythonBinding { /// - /// Interface that creates an IComponent given a type. Used by the PythonFormVisitor - /// class so it can be wired up to a IDesignerHost + /// Interface that can: + /// + /// 1) Create an IComponent given a type. + /// 2) Create a new object given its type name. + /// + /// Used by the PythonFormVisitor class so it can be wired up to an + /// IDesignerHost and an IDesignerSerializationManager. /// public interface IComponentCreator { @@ -22,5 +28,23 @@ namespace ICSharpCode.PythonBinding /// The type of the component to be created. /// The component name. IComponent CreateComponent(Type componentClass, string name); + + /// + /// Adds a component to the component creator. + /// + void Add(IComponent component, string name); + + /// + /// Creates a new instance of the object given its type. + /// + /// Arguments passed to the type's constructor. + /// Name of the object. + /// If set to true then the is added to the design container. + object CreateInstance(Type type, ICollection arguments, string name, bool addToContainer); + + /// + /// Gets the type given its name. + /// + Type GetType(string typeName); } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonControlFieldExpression.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonControlFieldExpression.cs new file mode 100644 index 0000000000..2a57b161bb --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonControlFieldExpression.cs @@ -0,0 +1,125 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using System.Text; +using IronPython.Compiler.Ast; + +namespace ICSharpCode.PythonBinding +{ + /// + /// Represents a member field expression in a Control or Form: + /// + /// self._textBox1 + /// self._textBox1.Name + /// + public class PythonControlFieldExpression + { + string memberName = String.Empty; + string fullMemberName = String.Empty; + + PythonControlFieldExpression(string memberName, string fullMemberName) + { + this.memberName = memberName; + this.fullMemberName = fullMemberName; + } + + public string MemberName { + get { return memberName; } + } + + public string FullMemberName { + get { return fullMemberName; } + } + + /// + /// Creates a PythonControlField from a member expression: + /// + /// self._textBox1 + /// self._textBox1.Name + /// + public static PythonControlFieldExpression Create(MemberExpression expression) + { + string memberName = expression.Name.ToString(); + string fullMemberName = PythonControlFieldExpression.GetMemberName(expression); + return new PythonControlFieldExpression(memberName, fullMemberName); + } + + /// + /// Gets the variable name from an expression of the form: + /// + /// self._textBox1.Name + /// + /// Returns "textBox1" + /// + public static string GetVariableNameFromSelfReference(string name) + { + int startIndex = name.IndexOf('.'); + if (startIndex > 0) { + name = name.Substring(startIndex + 1); + int endIndex = name.IndexOf('.'); + if (endIndex > 0) { + return GetVariableName(name.Substring(0, endIndex)); + } + return String.Empty; + } + return name; + } + + /// + /// Gets the variable name of the control being added. + /// + public static string GetControlNameBeingAdded(CallExpression node) + { + //if (node.Args.Length > 0) { + Arg arg = node.Args[0]; + MemberExpression memberExpression = arg.Expression as MemberExpression; + return GetVariableName(memberExpression.Name.ToString()); + //} + //return null; + } + + /// + /// Removes the underscore from the variable name. + /// + public static string GetVariableName(string name) + { + if (!String.IsNullOrEmpty(name)) { + if (name.Length > 1) { + if (name[0] == '_') { + return name.Substring(1); + } + } + } + return name; + } + + /// + /// Gets the fully qualified name being referenced in the MemberExpression. + /// + public static string GetMemberName(MemberExpression expression) + { + StringBuilder typeName = new StringBuilder(); + + while (expression != null) { + typeName.Insert(0, expression.Name); + typeName.Insert(0, "."); + + NameExpression nameExpression = expression.Target as NameExpression; + expression = expression.Target as MemberExpression; + if (expression == null) { + if (nameExpression != null) { + typeName.Insert(0, nameExpression.Name); + } + } + } + + return typeName.ToString(); + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerGenerator.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerGenerator.cs index d8a4b56e56..91c2d59847 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerGenerator.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerGenerator.cs @@ -17,6 +17,7 @@ using System.Windows.Forms; using ICSharpCode.FormsDesigner; using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.TextEditor; @@ -39,9 +40,11 @@ namespace ICSharpCode.PythonBinding public class PythonDesignerGenerator : IPythonDesignerGenerator { FormsDesignerViewContent viewContent; + ITextEditorProperties textEditorProperties; - public PythonDesignerGenerator() + public PythonDesignerGenerator(ITextEditorProperties textEditorProperties) { + this.textEditorProperties = textEditorProperties; } /// @@ -76,7 +79,7 @@ namespace ICSharpCode.PythonBinding public void MergeRootComponentChanges(IComponent component) { ParseInformation parseInfo = ParseFile(this.ViewContent.DesignerCodeFile.FileName, this.ViewContent.DesignerCodeFileContent); - Merge(component, ViewContent.DesignerCodeFileDocument, parseInfo.BestCompilationUnit); + Merge(component, ViewContent.DesignerCodeFileDocument, parseInfo.BestCompilationUnit, textEditorProperties); } /// @@ -85,21 +88,21 @@ namespace ICSharpCode.PythonBinding /// The root component in the designer host. /// The document that the generated code will be merged into. /// The current compilation unit for the . - public static void Merge(IComponent component, IDocument document, ICompilationUnit compilationUnit) + public static void Merge(IComponent component, IDocument document, ICompilationUnit compilationUnit, ITextEditorProperties textEditorProperties) { // Get the document's initialize components method. IMethod method = GetInitializeComponents(compilationUnit); // Generate the python source code. - PythonForm pythonForm = new PythonForm("\t"); + PythonForm pythonForm = new PythonForm(NRefactoryToPythonConverter.GetIndentString(textEditorProperties)); int indent = method.Region.BeginColumn; string methodBody = pythonForm.GenerateInitializeComponentMethodBody(component as Form, indent); - Console.WriteLine("GeneratedCode: " + methodBody); // Merge the code. DomRegion methodRegion = GetBodyRegionInDocument(method); - int startOffset = document.PositionToOffset(new TextLocation(methodRegion.BeginColumn - 1, methodRegion.BeginLine - 1)); - int endOffset = document.PositionToOffset(new TextLocation(methodRegion.EndColumn - 1, methodRegion.EndLine - 1)); + int startOffset = GetStartOffset(document, methodRegion); + int endOffset = GetEndOffset(document, methodRegion); + document.Replace(startOffset, endOffset - startOffset, methodBody); } @@ -232,5 +235,26 @@ namespace ICSharpCode.PythonBinding { return unit.Classes[0]; } + + /// + /// Gets the start offset of the region. + /// + static int GetStartOffset(IDocument document, DomRegion region) + { + return document.PositionToOffset(new TextLocation(region.BeginColumn - 1, region.BeginLine - 1)); + } + + /// + /// Gets the end offset of the region. + /// + static int GetEndOffset(IDocument document, DomRegion region) + { + TextLocation endLocation = new TextLocation(region.EndColumn - 1, region.EndLine - 1); + if (endLocation.Line >= document.TotalNumberOfLines) { + // At end of document. + return document.TextLength; + } + return document.PositionToOffset(endLocation); + } } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerLoader.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerLoader.cs index 7e22ef860e..b6950e7ade 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerLoader.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerLoader.cs @@ -7,6 +7,7 @@ using System; using System.CodeDom; +using System.Collections; using System.ComponentModel; using System.ComponentModel.Design.Serialization; using System.Security.Permissions; @@ -26,7 +27,8 @@ namespace ICSharpCode.PythonBinding public class PythonDesignerLoader : BasicDesignerLoader, IComponentCreator { IPythonDesignerGenerator generator; - + IDesignerSerializationManager serializationManager; + public PythonDesignerLoader(IPythonDesignerGenerator generator) { if (generator == null) { @@ -52,6 +54,30 @@ namespace ICSharpCode.PythonBinding return base.LoaderHost.CreateComponent(componentClass, name); } + /// + /// Adds a component. + /// + public void Add(IComponent component, string name) + { + base.LoaderHost.Container.Add(component, name); + } + + /// + /// Creates a new instance of the specified type. + /// + public object CreateInstance(Type type, ICollection arguments, string name, bool addToContainer) + { + return serializationManager.CreateInstance(type, arguments, name, addToContainer); + } + + /// + /// Gets the type given its name. + /// + public Type GetType(string typeName) + { + return serializationManager.GetType(typeName); + } + /// /// Passes the designer host's root component to the generator so it can update the /// source code with changes made at design time. @@ -64,8 +90,9 @@ namespace ICSharpCode.PythonBinding protected override void PerformLoad(IDesignerSerializationManager serializationManager) { // Create designer root object. - PythonFormVisitor visitor = new PythonFormVisitor(); - visitor.CreateForm("abc", this); + this.serializationManager = serializationManager; + PythonFormWalker visitor = new PythonFormWalker(this); + visitor.CreateForm(generator.ViewContent.DesignerCodeFileContent); } } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonForm.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonForm.cs index 38e493f670..e1fd485171 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonForm.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonForm.cs @@ -65,6 +65,7 @@ namespace ICSharpCode.PythonBinding AppendControl(form); AppendIndentedLine("self.ResumeLayout(False)"); + AppendIndentedLine("self.PerformLayout()"); } void AppendControl(Control control) diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormVisitor.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormVisitor.cs deleted file mode 100644 index c13946b355..0000000000 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormVisitor.cs +++ /dev/null @@ -1,33 +0,0 @@ -// -// -// -// -// $Revision$ -// - -using System; -using System.Drawing; -using System.Windows.Forms; - -namespace ICSharpCode.PythonBinding -{ - /// - /// Description of PythonFormVisitor. - /// - public class PythonFormVisitor - { - public PythonFormVisitor() - { - } - - /// - /// Creates a form from python code. - /// - public Form CreateForm(string pythonCode, IComponentCreator componentCreator) - { - Form form = (Form)componentCreator.CreateComponent(typeof(Form), "MainForm"); - form.Name = "MainForm"; - return form; - } - } -} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormWalker.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormWalker.cs new file mode 100644 index 0000000000..aa520dfc67 --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormWalker.cs @@ -0,0 +1,196 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Reflection; +using System.Text; +using System.Windows.Forms; + +using IronPython.Compiler.Ast; + +namespace ICSharpCode.PythonBinding +{ + /// + /// Visits the code's Python AST and creates a Windows Form. + /// + public class PythonFormWalker : PythonWalker + { + Form form; + PythonControlFieldExpression fieldExpression; + IComponentCreator componentCreator; + bool walkingAssignment; + Dictionary createdObjects = new Dictionary(); + + public PythonFormWalker(IComponentCreator componentCreator) + { + this.componentCreator = componentCreator; + } + + /// + /// Creates a form from python code. + /// + public Form CreateForm(string pythonCode) + { + PythonParser parser = new PythonParser(); + PythonAst ast = parser.CreateAst(@"Form.py", pythonCode); + ast.Walk(this); + + // Did we find the InitializeComponent method? + if (form == null) { + throw new PythonFormWalkerException("Unable to find InitializeComponents method."); + } + + return form; + } + + public override bool Walk(ClassDefinition node) + { + if (node.Body != null) { + node.Body.Walk(this); + } + return false; + } + + public override bool Walk(FunctionDefinition node) + { + if (IsInitializeComponentMethod(node)) { + form = (Form)componentCreator.CreateComponent(typeof(Form), "MainForm"); + node.Body.Walk(this); + } + return false; + } + + public override bool Walk(AssignmentStatement node) + { + if (node.Left.Count > 0) { + MemberExpression memberExpression = node.Left[0] as MemberExpression; + if (memberExpression != null) { + fieldExpression = PythonControlFieldExpression.Create(memberExpression); + + walkingAssignment = true; + node.Right.Walk(this); + walkingAssignment = false; + } + } + return false; + } + + public override bool Walk(ConstantExpression node) + { + Control control = GetCurrentControl(); + SetPropertyValue(control, fieldExpression.MemberName, node.Value); + return false; + } + + Control GetCurrentControl() + { + string variableName = PythonControlFieldExpression.GetVariableNameFromSelfReference(fieldExpression.FullMemberName); + if (variableName.Length > 0) { + return GetControl(variableName); + } + return form; + } + + public override bool Walk(CallExpression node) + { + MemberExpression memberExpression = node.Target as MemberExpression; + if (memberExpression != null) { + string name = PythonControlFieldExpression.GetMemberName(memberExpression); + if (walkingAssignment) { + Type type = GetType(name); + List args = GetArguments(node); + object instance = componentCreator.CreateInstance(type, args, fieldExpression.MemberName, false); + if (!SetPropertyValue(form, fieldExpression.MemberName, instance)) { + AddComponent(fieldExpression.MemberName, instance); + } + } else if (name == "self.Controls.Add") { + string controlName = PythonControlFieldExpression.GetControlNameBeingAdded(node); + form.Controls.Add(GetControl(controlName)); + } + } + return false; + } + + /// + /// Gets the arguments passed to the call expression. + /// + static List GetArguments(CallExpression expression) + { + List args = new List(); + foreach (Arg a in expression.Args) { + ConstantExpression constantExpression = a.Expression as ConstantExpression; + if (constantExpression != null) { + args.Add(constantExpression.Value); + } + } + return args; + } + + static bool IsInitializeComponentMethod(FunctionDefinition node) + { + string name = node.Name.ToString().ToLowerInvariant(); + return name == "initializecomponent" || name == "initializecomponents"; + } + + /// + /// Sets the value of a form's property. + /// + bool SetPropertyValue(Control control, string name, object @value) + { + PropertyInfo propertyInfo = control.GetType().GetProperty(name); + if (propertyInfo != null) { + propertyInfo.SetValue(control, @value, null); + return true; + } + return false; + } + + Type GetType(string typeName) + { + Type type = componentCreator.GetType(typeName); + if (type == null) { + throw new PythonFormWalkerException(String.Format("Could not find type '{0}'.", typeName)); + } + return type; + } + + /// + /// Looks for the control with the specified name in the objects that have been + /// created whilst processing the InitializeComponent method. + /// + Control GetControl(string name) + { + object o = null; + if (createdObjects.TryGetValue(name, out o)) { + return o as Control; + } + return null; + } + + /// + /// Adds a component to the list of created objects. + /// + void AddComponent(string name, object component) + { + string variableName = PythonControlFieldExpression.GetVariableName(name); + componentCreator.Add(component as IComponent, variableName); + createdObjects.Add(variableName, component); + } + + static string GetFirstArgumentAsString(CallExpression node) + { + List args = GetArguments(node); + if (args.Count > 0) { + return args[0] as String; + } + return null; + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormWalkerException.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormWalkerException.cs new file mode 100644 index 0000000000..cbeee4fa47 --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormWalkerException.cs @@ -0,0 +1,21 @@ +// +// +// +// +// $Revision$ +// + +using System; + +namespace ICSharpCode.PythonBinding +{ + /// + /// Exception thrown by the PythonFormWalker class. + /// + public class PythonFormWalkerException : Exception + { + public PythonFormWalkerException(string message) : base(message) + { + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormsDesignerDisplayBinding.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormsDesignerDisplayBinding.cs index 0c8edb5f75..f2e1c9ef8e 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormsDesignerDisplayBinding.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormsDesignerDisplayBinding.cs @@ -7,12 +7,14 @@ using System; using System.IO; + using ICSharpCode.FormsDesigner; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; namespace ICSharpCode.PythonBinding { @@ -44,8 +46,13 @@ namespace ICSharpCode.PythonBinding } return false; } - + public IViewContent[] CreateSecondaryViewContent(IViewContent viewContent) + { + return CreateSecondaryViewContent(viewContent, SharpDevelopTextEditorProperties.Instance); + } + + public IViewContent[] CreateSecondaryViewContent(IViewContent viewContent, ITextEditorProperties textEditorProperties) { foreach (IViewContent existingView in viewContent.SecondaryViewContents) { if (existingView.GetType() == typeof(FormsDesignerViewContent)) { @@ -54,7 +61,7 @@ namespace ICSharpCode.PythonBinding } IDesignerLoaderProvider loader = new PythonDesignerLoaderProvider(); - IDesignerGenerator generator = new PythonDesignerGenerator(); + IDesignerGenerator generator = new PythonDesignerGenerator(textEditorProperties); return new IViewContent[] { new FormsDesignerViewContent(viewContent, loader, generator) }; } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonParser.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonParser.cs index 34e770d0da..4b2b4015ca 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonParser.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonParser.cs @@ -75,30 +75,35 @@ namespace ICSharpCode.PythonBinding return false; } + /// + /// Parses a python file and creates a PythonAst. + /// + public PythonAst CreateAst(string fileName, string fileContent) + { + if (scriptEngine == null) { + scriptEngine = IronPython.Hosting.Python.CreateEngine(); + } + + PythonCompilerSink sink = new PythonCompilerSink(); + SourceUnit source = DefaultContext.DefaultPythonContext.CreateFileUnit(fileName, fileContent); + CompilerContext context = new CompilerContext(source, new PythonCompilerOptions(), sink); + using (Parser parser = Parser.CreateParser(context, new PythonOptions())) { + return parser.ParseFile(false); + } + } + /// /// Parses the python code and returns an ICompilationUnit. /// public ICompilationUnit Parse(IProjectContent projectContent, string fileName, string fileContent) { if (fileContent != null) { - // try { - if (scriptEngine == null) { - scriptEngine = IronPython.Hosting.Python.CreateEngine(); - } - - PythonCompilerSink sink = new PythonCompilerSink(); - SourceUnit source = DefaultContext.DefaultPythonContext.CreateFileUnit(fileName, fileContent); - CompilerContext context = new CompilerContext(source, new PythonCompilerOptions(), sink); - Parser parser = Parser.CreateParser(context, new PythonOptions()); - PythonAst ast = parser.ParseFile(false); - + PythonAst ast = CreateAst(fileName, fileContent); PythonAstWalker walker = new PythonAstWalker(projectContent, fileName); walker.Walk(ast); return walker.CompilationUnit; - // } catch (PythonSyntaxErrorException) { - // Ignore parsing errors - // } } + DefaultCompilationUnit compilationUnit = new DefaultCompilationUnit(projectContent); compilationUnit.FileName = fileName; return compilationUnit; diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/AddInFileTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/AddInFileTestFixture.cs index 4abafd0ab1..3d0e4bb247 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/AddInFileTestFixture.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/AddInFileTestFixture.cs @@ -45,6 +45,8 @@ namespace PythonBinding.Tests Runtime formsDesignerRuntime; Codon displayBindingCodon; Codon convertCodeCodon; + Codon pythonFileIconCodon; + Codon pythonProjectIconCodon; [TestFixtureSetUp] public void SetupFixture() @@ -72,6 +74,8 @@ namespace PythonBinding.Tests compilingOptionsCodon = GetCodon("/SharpDevelop/BackendBindings/ProjectOptions/Python", "CompilingOptions"); debugOptionsCodon = GetCodon("/SharpDevelop/BackendBindings/ProjectOptions/Python", "DebugOptions"); convertCodeCodon = GetCodon("/SharpDevelop/Workbench/MainMenu/Tools/ConvertCode", "ConvertToPython"); + pythonFileIconCodon = GetCodon("/Workspace/Icons", "PythonFileIcon"); + pythonProjectIconCodon = GetCodon("/Workspace/Icons", "PythonProjectIcon"); // Get the PythonBinding runtime. foreach (Runtime runtime in addin.Runtimes) { @@ -610,7 +614,43 @@ namespace PythonBinding.Tests Assert.AreEqual(".cs", csharpCondition["activeextension"]); Assert.AreEqual(".vb", vbnetCondition["activeextension"]); } + + [Test] + public void PythonFileIconCodonExists() + { + Assert.IsNotNull(pythonFileIconCodon); + } + + [Test] + public void PythonFileIconCodonExtensions() + { + Assert.AreEqual(".py", pythonFileIconCodon["extensions"]); + } + + [Test] + public void PythonFileIconCodonResource() + { + Assert.AreEqual("Python.ProjectBrowser.File", pythonFileIconCodon["resource"]); + } + + [Test] + public void PythonProjectIconCodonExists() + { + Assert.IsNotNull(pythonProjectIconCodon); + } + [Test] + public void PythonProjectIconCodonLanguage() + { + Assert.AreEqual("Python", pythonProjectIconCodon["language"]); + } + + [Test] + public void PythonProjectIconCodonResource() + { + Assert.AreEqual("Python.ProjectBrowser.Project", pythonProjectIconCodon["resource"]); + } + /// /// Gets the codon with the specified extension path and name. /// diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateSimpleFormTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateSimpleFormTestFixture.cs index b544ea6a8b..4ff0d01854 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateSimpleFormTestFixture.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateSimpleFormTestFixture.cs @@ -42,7 +42,8 @@ namespace PythonBinding.Tests.Designer " # \r\n" + " self.ClientSize = System.Drawing.Size(284, 264)\r\n" + " self.Name = \"MainForm\"\r\n" + - " self.ResumeLayout(False)\r\n"; + " self.ResumeLayout(False)\r\n" + + " self.PerformLayout()\r\n"; Assert.AreEqual(expectedCode, generatedPythonCode); } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GeneratorMergeFindsInitializeComponentsTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GeneratorMergeFindsInitializeComponentsTestFixture.cs index af626e9a91..b671843905 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GeneratorMergeFindsInitializeComponentsTestFixture.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GeneratorMergeFindsInitializeComponentsTestFixture.cs @@ -35,6 +35,7 @@ namespace PythonBinding.Tests.Designer [TestFixtureSetUp] public void SetUpFixture() { + MockTextEditorProperties textEditorProperties = new MockTextEditorProperties(); generator = new DerivedPythonDesignerGenerator(); mockViewContent = new MockTextEditorViewContent(); viewContent = new FormsDesignerViewContent(mockViewContent, new MockOpenedFile("Test.py")); @@ -95,7 +96,9 @@ namespace PythonBinding.Tests.Designer "\t\t# \r\n" + "\t\tself.ClientSize = System.Drawing.Size(499, 309)\r\n" + "\t\tself.Name = \"MainForm\"\r\n" + - "\t\tself.ResumeLayout(False)\r\n"; + "\t\tself.ResumeLayout(False)\r\n" + + "\t\tself.PerformLayout()\r\n"; + Assert.AreEqual(expectedText, viewContent.DesignerCodeFileContent); } @@ -123,7 +126,8 @@ namespace PythonBinding.Tests.Designer "\t\tself.SuspendLayout()\r\n" + "\t\tself.ClientSize = System.Drawing.Size(499, 309)\r\n" + "\t\tself.Name = 'MainForm'\r\n" + - "\t\tself.ResumeLayout(False)\r\n"; + "\t\tself.ResumeLayout(False)\r\n" + + "\t\tself.PerformLayout()\r\n"; } } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadFormTestFixtureBase.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadFormTestFixtureBase.cs index a5719073b5..486ae26a02 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadFormTestFixtureBase.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadFormTestFixtureBase.cs @@ -6,9 +6,13 @@ // using System; +using System.Collections; using System.Collections.Generic; using System.ComponentModel; +using System.Drawing; +using System.Reflection; using System.Windows.Forms; + using ICSharpCode.PythonBinding; using PythonBinding.Tests.Utils; @@ -20,6 +24,9 @@ namespace PythonBinding.Tests.Designer public class LoadFormTestFixtureBase : IComponentCreator { List createdComponents = new List(); + List createdInstances = new List(); + List addedComponents = new List(); + List typeNames = new List(); public LoadFormTestFixtureBase() { @@ -31,12 +38,65 @@ namespace PythonBinding.Tests.Designer createdComponents.Add(c); object instance = componentClass.Assembly.CreateInstance(componentClass.FullName); - Control control = instance as Control; return (IComponent)instance; } + public void Add(IComponent component, string name) + { + AddedComponent addedComponent = new AddedComponent(component, name); + addedComponents.Add(addedComponent); + } + + public object CreateInstance(Type type, ICollection arguments, string name, bool addToContainer) + { + CreatedInstance createdInstance = new CreatedInstance(type, arguments, name, addToContainer); + createdInstances.Add(createdInstance); + + object[] argumentsArray = new object[arguments.Count]; + arguments.CopyTo(argumentsArray, 0); + + object o = type.Assembly.CreateInstance(type.FullName, true, BindingFlags.CreateInstance, null, argumentsArray, null, new object[0]); + createdInstance.Object = o; + return o; + } + + public Type GetType(string typeName) + { + typeNames.Add(typeName); + + // Lookup type in System.Windows.Forms assembly. + Type type = typeof(Form).Assembly.GetType(typeName); + if (type == null) { + // Lookup type System.Drawing assembly. + type = typeof(Size).Assembly.GetType(typeName); + } + return type; + } + protected List CreatedComponents { get { return createdComponents; } } + + protected List AddedComponents { + get { return addedComponents; } + } + + protected List CreatedInstances { + get { return createdInstances; } + } + + protected List TypeNames { + get { return typeNames; } + } + + protected CreatedInstance GetCreatedInstance(Type type) + { + foreach (CreatedInstance instance in createdInstances) { + if (instance.InstanceType == type) { + return instance; + } + } + return null; + } } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadSimpleFormTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadSimpleFormTestFixture.cs index efb0b867f4..f17222e3f7 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadSimpleFormTestFixture.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadSimpleFormTestFixture.cs @@ -6,9 +6,11 @@ // using System; +using System.Collections.Generic; using System.Drawing; using System.IO; using System.Windows.Forms; + using ICSharpCode.PythonBinding; using NUnit.Framework; using PythonBinding.Tests.Utils; @@ -18,26 +20,35 @@ namespace PythonBinding.Tests.Designer [TestFixture] public class LoadSimpleFormTestFixture : LoadFormTestFixtureBase { - string pythonCode = "def InitializeComponent(self):\r\n" + - " self.SuspendLayout()\r\n" + - " # \r\n" + - " # MainForm\r\n" + - " # \r\n" + - " self.ClientSize = System.Drawing.Size(284, 264)\r\n" + - " self.Name = \"MainForm\"\r\n" + - " self.ResumeLayout(False)\r\n"; + string pythonCode = "class MainForm(System.Windows.Forms.Form):\r\n" + + " def InitializeComponent(self):\r\n" + + " self.SuspendLayout()\r\n" + + " # \r\n" + + " # MainForm\r\n" + + " # \r\n" + + " self.ClientSize = System.Drawing.Size(300, 400)\r\n" + + " self.Name = \"MainForm\"\r\n" + + " self.ResumeLayout(False)\r\n"; Form form; CreatedComponent formComponent; + string typeName; + CreatedInstance instance; [TestFixtureSetUp] public void SetUpFixture() { - PythonFormVisitor visitor = new PythonFormVisitor(); - form = visitor.CreateForm(pythonCode, this); + PythonFormWalker walker = new PythonFormWalker(this); + form = walker.CreateForm(pythonCode); if (CreatedComponents.Count > 0) { formComponent = CreatedComponents[0]; } + if (TypeNames.Count > 0) { + typeName = TypeNames[0]; + } + if (CreatedInstances.Count > 0) { + instance = CreatedInstances[0]; + } } [TestFixtureTearDown] @@ -74,6 +85,42 @@ namespace PythonBinding.Tests.Designer public void ComponentType() { Assert.AreEqual("System.Windows.Forms.Form", formComponent.TypeName); + } + + [Test] + public void FormClientSize() + { + Size size = new Size(300, 400); + Assert.AreEqual(size, form.ClientSize); + } + + /// + /// The System.Drawing.Size type name should have been looked up by the PythonFormWalker when + /// parsing the InitializeComponent method. + /// + [Test] + public void TypeNameLookedUp() + { + Assert.AreEqual("System.Drawing.Size", typeName); + } + + [Test] + public void OneObjectCreated() + { + Assert.AreEqual(1, CreatedInstances.Count); + } + + [Test] + public void InstanceType() + { + List args = new List(); + int width = 300; + int height = 400; + args.Add(width); + args.Add(height); + + CreatedInstance expectedInstance = new CreatedInstance(typeof(Size), args, "ClientSize", false); + Assert.AreEqual(expectedInstance, instance); } } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadTextBoxTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadTextBoxTestFixture.cs new file mode 100644 index 0000000000..ca960c39b7 --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadTextBoxTestFixture.cs @@ -0,0 +1,92 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.IO; +using System.Windows.Forms; + +using ICSharpCode.PythonBinding; +using NUnit.Framework; +using PythonBinding.Tests.Utils; + +namespace PythonBinding.Tests.Designer +{ + [TestFixture] + public class LoadTextBoxTestFixture : LoadFormTestFixtureBase + { + string pythonCode = "class MainForm(System.Windows.Forms.Form):\r\n" + + " def InitializeComponent(self):\r\n" + + " self._textBox1 = System.Windows.Forms.TextBox()\r\n" + + " self.SuspendLayout()\r\n" + + " # \r\n" + + " # textBox1\r\n" + + " # \r\n" + + " self._textBox1.Name = \"textBoxName\"\r\n" + + " # \r\n" + + " # form1\r\n" + + " # \r\n" + + " self.Name = \"form1\"\r\n" + + " self.Controls.Add(self._textBox1)\r\n" + + " self.ResumeLayout(False)\r\n"; + Form form; + TextBox textBox; + + [TestFixtureSetUp] + public void SetUpFixture() + { + PythonFormWalker walker = new PythonFormWalker(this); + form = walker.CreateForm(pythonCode); + if (form.Controls.Count > 0) { + textBox = form.Controls[0] as TextBox; + } + } + + [TestFixtureTearDown] + public void TearDownFixture() + { + form.Dispose(); + } + + [Test] + public void TextBoxInstanceCreated() + { + CreatedInstance instance = new CreatedInstance(typeof(TextBox), new List(), "_textBox1", false); + Assert.Contains(instance, CreatedInstances); + } + + [Test] + public void AddedComponentsContainsTextBox() + { + CreatedInstance instance = GetCreatedInstance(typeof(TextBox)); + + AddedComponent component = new AddedComponent(instance.Object as IComponent, "textBox1"); + Assert.Contains(component, AddedComponents); + } + + [Test] + public void TextBoxAddedToForm() + { + Assert.IsNotNull(textBox); + } + + [Test] + public void TextBoxObjectMatchesObjectAddedToComponentCreator() + { + CreatedInstance instance = GetCreatedInstance(typeof(TextBox)); + Assert.AreSame(textBox, instance.Object as TextBox); + } + + [Test] + public void TextBoxName() + { + Assert.AreEqual("textBoxName", textBox.Name); + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/MergeFormTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/MergeFormTestFixture.cs index 291576a806..01e671a57c 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/MergeFormTestFixture.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/MergeFormTestFixture.cs @@ -7,7 +7,10 @@ using System; using System.CodeDom; +using System.Drawing; using System.IO; +using System.Windows.Forms; + using ICSharpCode.PythonBinding; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.TextEditor; @@ -22,7 +25,6 @@ namespace PythonBinding.Tests.Designer /// can merge the changes into the text editor. /// [TestFixture] - [Ignore("Not ported")] public class MergeFormTestFixture { IDocument document; @@ -30,25 +32,26 @@ namespace PythonBinding.Tests.Designer [TestFixtureSetUp] public void SetUpFixture() { -// using (TextEditorControl textEditor = new TextEditorControl()) { -// document = textEditor.Document; -// textEditor.Text = GetTextEditorCode(); -// -// PythonParser parser = new PythonParser(); -// ICompilationUnit textEditorCompileUnit = parser.Parse(new DefaultProjectContent(), @"test.py", document.TextContent); -// -// PythonProvider provider = new PythonProvider(); -// CodeCompileUnit unit = provider.Parse(new StringReader(GetGeneratedCode())); -// GeneratedInitializeComponentMethod initComponentMethod = GeneratedInitializeComponentMethod.GetGeneratedInitializeComponentMethod(unit); -// initComponentMethod.Merge(document, textEditorCompileUnit); -// } + using (TextEditorControl textEditor = new TextEditorControl()) { + document = textEditor.Document; + textEditor.Text = GetTextEditorCode(); + + PythonParser parser = new PythonParser(); + ICompilationUnit compilationUnit = parser.Parse(new DefaultProjectContent(), @"test.py", document.TextContent); + + using (Form form = new Form()) { + form.Name = "MainForm"; + form.ClientSize = new Size(499, 309); + + PythonDesignerGenerator.Merge(form, document, compilationUnit, new MockTextEditorProperties()); + } + } } [Test] public void MergedDocumentText() { string expectedText = GetTextEditorCode().Replace(GetTextEditorInitializeComponentMethod(), GetGeneratedInitializeComponentMethod()); - Assert.AreEqual(expectedText, document.TextContent); } @@ -67,14 +70,13 @@ namespace PythonBinding.Tests.Designer { return "\tdef InitializeComponent(self):\r\n" + "\t\tself.SuspendLayout()\r\n" + - "\t\t#\r\n" + + "\t\t# \r\n" + "\t\t# MainForm\r\n" + - "\t\t#\r\n" + - "\t\tself.AutoScaleDimensions = System.Drawing.SizeF(6, 13)\r\n" + - "\t\tself.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font\r\n" + + "\t\t# \r\n" + "\t\tself.ClientSize = System.Drawing.Size(499, 309)\r\n" + - "\t\tself.Name = 'MainForm'\r\n" + - "\t\tself.ResumeLayout(False)\r\n"; + "\t\tself.Name = \"MainForm\"\r\n" + + "\t\tself.ResumeLayout(False)\r\n" + + "\t\tself.PerformLayout()\r\n"; } string GetTextEditorCode() diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/MissingInitializeComponentMethodTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/MissingInitializeComponentMethodTestFixture.cs new file mode 100644 index 0000000000..9b53443c29 --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/MissingInitializeComponentMethodTestFixture.cs @@ -0,0 +1,70 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Windows.Forms; + +using ICSharpCode.PythonBinding; +using IronPython.Compiler.Ast; +using Microsoft.Scripting; +using NUnit.Framework; +using PythonBinding.Tests.Utils; + +namespace PythonBinding.Tests.Designer +{ + /// + /// Tests that the PythonFormVisitor throws an exception if no InitializeComponent or + /// InitializeComponent method can be found. + /// + [TestFixture] + public class MissingInitializeComponentMethodTestFixture : LoadFormTestFixtureBase + { + string pythonCode = "from System.Windows.Forms import Form\r\n" + + "\r\n" + + "class MainForm(System.Windows.Forms.Form):\r\n" + + " def __init__(self):\r\n" + + " self.MissingMethod()\r\n" + + "\r\n" + + " def MissingMethod(self):\r\n" + + " pass\r\n"; + [Test] + [ExpectedException(typeof(PythonFormWalkerException))] + public void PythonFormWalkerExceptionThrown() + { + PythonFormWalker walker = new PythonFormWalker(this); + walker.CreateForm(pythonCode); + Assert.Fail("Exception should have been thrown before this."); + } + + /// + /// Check that the PythonFormWalker does not try to walk the class body if it is null. + /// + [Test] + public void ClassWithNoBody() + { + ClassDefinition classDef = new ClassDefinition(new SymbolId(10), null, null); + PythonFormWalker walker = new PythonFormWalker(this); + walker.Walk(classDef); + } + + /// + /// Make sure we do not get an ArgumentOutOfRangeException when walking the + /// AssignmentStatement. + /// + [Test] + public void NoLeftHandSideExpressionsInAssignment() + { + List lhs = new List(); + AssignmentStatement assign = new AssignmentStatement(lhs.ToArray(), null); + PythonFormWalker walker = new PythonFormWalker(this); + walker.Walk(assign); + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/NoNewLineAfterInitializeComponentTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/NoNewLineAfterInitializeComponentTestFixture.cs new file mode 100644 index 0000000000..06b3b198e8 --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/NoNewLineAfterInitializeComponentTestFixture.cs @@ -0,0 +1,87 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.CodeDom; +using System.Drawing; +using System.IO; +using System.Windows.Forms; + +using ICSharpCode.PythonBinding; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; +using NUnit.Framework; +using PythonBinding.Tests.Utils; + +namespace PythonBinding.Tests.Designer +{ + /// + /// Tests the code can be generated if there is no new line after the InitializeComponent method. + /// + [TestFixture] + public class NoNewLineAfterInitializeComponentMethodTestFixture + { + IDocument document; + + [TestFixtureSetUp] + public void SetUpFixture() + { + using (TextEditorControl textEditor = new TextEditorControl()) { + document = textEditor.Document; + textEditor.Text = GetTextEditorCode(); + + PythonParser parser = new PythonParser(); + ICompilationUnit compilationUnit = parser.Parse(new DefaultProjectContent(), @"test.py", document.TextContent); + + using (Form form = new Form()) { + form.Name = "MainForm"; + form.ClientSize = new Size(499, 309); + + PythonDesignerGenerator.Merge(form, document, compilationUnit, new MockTextEditorProperties()); + } + } + } + + [Test] + public void GeneratedCode() + { + string expectedCode = "from System.Windows.Forms import Form\r\n" + + "\r\n" + + "class MainForm(Form):\r\n" + + "\tdef __init__(self):\r\n" + + "\t\tself.InitializeComponent()\r\n" + + "\t\r\n" + + "\tdef InitializeComponent(self):\r\n" + + "\t\tself.SuspendLayout()\r\n" + + "\t\t# \r\n" + + "\t\t# MainForm\r\n" + + "\t\t# \r\n" + + "\t\tself.ClientSize = System.Drawing.Size(499, 309)\r\n" + + "\t\tself.Name = \"MainForm\"\r\n" + + "\t\tself.ResumeLayout(False)\r\n" + + "\t\tself.PerformLayout()\r\n"; + + Assert.AreEqual(expectedCode, document.TextContent); + } + + /// + /// No new line after the pass statement for InitializeComponent method. + /// + string GetTextEditorCode() + { + return "from System.Windows.Forms import Form\r\n" + + "\r\n" + + "class MainForm(Form):\r\n" + + "\tdef __init__(self):\r\n" + + "\t\tself.InitializeComponent()\r\n" + + "\t\r\n" + + "\tdef InitializeComponent(self):\r\n" + + "\t\tpass"; + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonDesignerLoaderProviderTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonDesignerLoaderProviderTestFixture.cs index 11f8e73feb..75f8cad014 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonDesignerLoaderProviderTestFixture.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonDesignerLoaderProviderTestFixture.cs @@ -25,7 +25,7 @@ namespace PythonBinding.Tests.Designer public void SetUpFixture() { provider = new PythonDesignerLoaderProvider(); - generator = new PythonDesignerGenerator(); + generator = new PythonDesignerGenerator(null); } [Test] diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonDesignerLoaderTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonDesignerLoaderTestFixture.cs index 8cef89b3ad..4688afefba 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonDesignerLoaderTestFixture.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonDesignerLoaderTestFixture.cs @@ -132,9 +132,9 @@ namespace PythonBinding.Tests.Designer "\r\n" + "class MainForm(Form):\r\n" + "\tdef __init__(self):\r\n" + - "\t\tself.InitializeComponent()\r\n" + + "\t\tself.InitializeComponents()\r\n" + "\t\r\n" + - "\tdef InitializeComponent(self):\r\n" + + "\tdef InitializeComponents(self):\r\n" + "\t\tself.Name = 'MainForm'\r\n"; } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextBoxNotAddedToFormTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextBoxNotAddedToFormTestFixture.cs new file mode 100644 index 0000000000..3cd170e0db --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextBoxNotAddedToFormTestFixture.cs @@ -0,0 +1,73 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.IO; +using System.Windows.Forms; + +using ICSharpCode.PythonBinding; +using NUnit.Framework; +using PythonBinding.Tests.Utils; + +namespace PythonBinding.Tests.Designer +{ + /// + /// When a text box is not added to the form's Control collection in InitializeComponent then: + /// + /// 1) Text box should not be added to the form's Control collection when the form is created. + /// 2) Text box should be registered with the designer via the IComponentCreator.Add method. + /// 3) Text box should be created via the IComponentCreator.CreateInstance method. + /// + [TestFixture] + public class TextBoxNotAddedToFormTestFixture : LoadFormTestFixtureBase + { + string pythonCode = "class MainForm(System.Windows.Forms.Form):\r\n" + + " def InitializeComponent(self):\r\n" + + " self._textBox1 = System.Windows.Forms.TextBox()\r\n" + + " self.SuspendLayout()\r\n" + + " # \r\n" + + " # textBox1\r\n" + + " # \r\n" + + " self._textBox1.Name = \"textBox1\"\r\n" + + " # \r\n" + + " # form1\r\n" + + " # \r\n" + + " self.ResumeLayout(False)\r\n"; + Form form; + + [TestFixtureSetUp] + public void SetUpFixture() + { + PythonFormWalker walker = new PythonFormWalker(this); + form = walker.CreateForm(pythonCode); + } + + [TestFixtureTearDown] + public void TearDownFixture() + { + form.Dispose(); + } + + [Test] + public void AddedComponentsContainsTextBox() + { + CreatedInstance instance = GetCreatedInstance(typeof(TextBox)); + + AddedComponent c = new AddedComponent(instance.Object as IComponent, "textBox1"); + Assert.Contains(c, AddedComponents); + } + + [Test] + public void TextBoxIsNotAddedToForm() + { + Assert.AreEqual(0, form.Controls.Count); + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextEditorIndentPassedToGeneratorTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextEditorIndentPassedToGeneratorTestFixture.cs new file mode 100644 index 0000000000..a9563e41ae --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextEditorIndentPassedToGeneratorTestFixture.cs @@ -0,0 +1,85 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.CodeDom; +using System.Drawing; +using System.IO; +using System.Windows.Forms; + +using ICSharpCode.FormsDesigner; +using ICSharpCode.PythonBinding; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; +using NUnit.Framework; +using PythonBinding.Tests.Utils; + +namespace PythonBinding.Tests.Designer +{ + /// + /// Tests that the indent information in the ITextEditorProperties is passed to the generator. + /// + [TestFixture] + public class TextEditorIndentPassedToGeneratorTestFixture + { + IDocument document; + + [TestFixtureSetUp] + public void SetUpFixture() + { + using (FormsDesignerViewContent viewContent = new FormsDesignerViewContent(null, new MockOpenedFile("Test.py"))) { + viewContent.DesignerCodeFileContent = "class MainForm(Form):\r\n" + + " def __init__(self):\r\n" + + " self.InitializeComponent()\r\n" + + "\r\n" + + " def InitializeComponent(self):\r\n" + + " pass\r\n"; + + document = viewContent.DesignerCodeFileDocument; + + ParseInformation parseInfo = new ParseInformation(); + PythonParser parser = new PythonParser(); + ICompilationUnit compilationUnit = parser.Parse(new DefaultProjectContent(), @"test.py", document.TextContent); + parseInfo.SetCompilationUnit(compilationUnit); + + using (Form form = new Form()) { + form.Name = "MainForm"; + + MockTextEditorProperties textEditorProperties = new MockTextEditorProperties(); + textEditorProperties.ConvertTabsToSpaces = true; + textEditorProperties.IndentationSize = 1; + + DerivedPythonDesignerGenerator generator = new DerivedPythonDesignerGenerator(textEditorProperties); + generator.ParseInfoToReturnFromParseFileMethod = parseInfo; + generator.Attach(viewContent); + generator.MergeRootComponentChanges(form); + } + } + } + + [Test] + public void GeneratedCode() + { + string expectedCode = "class MainForm(Form):\r\n" + + " def __init__(self):\r\n" + + " self.InitializeComponent()\r\n" + + "\r\n" + + " def InitializeComponent(self):\r\n" + + " self.SuspendLayout()\r\n" + + " # \r\n" + + " # MainForm\r\n" + + " # \r\n" + + " self.ClientSize = System.Drawing.Size(284, 264)\r\n" + + " self.Name = \"MainForm\"\r\n" + + " self.ResumeLayout(False)\r\n" + + " self.PerformLayout()\r\n"; + + Assert.AreEqual(expectedCode, document.TextContent); + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/UnknownTypeTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/UnknownTypeTestFixture.cs new file mode 100644 index 0000000000..d5e70dc5a7 --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/UnknownTypeTestFixture.cs @@ -0,0 +1,46 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Windows.Forms; + +using ICSharpCode.PythonBinding; +using IronPython.Compiler.Ast; +using Microsoft.Scripting; +using NUnit.Framework; +using PythonBinding.Tests.Utils; + +namespace PythonBinding.Tests.Designer +{ + /// + /// Tests that the PythonFormWalker throws a PythonFormWalkerException if a unknown type is used in the + /// form. + /// + [TestFixture] + public class UnknownTypeTestFixture : LoadFormTestFixtureBase + { + string pythonCode = "from System.Windows.Forms import Form\r\n" + + "\r\n" + + "class MainForm(System.Windows.Forms.Form):\r\n" + + " def __init__(self):\r\n" + + " self.InitializeComponent()\r\n" + + "\r\n" + + " def InitializeComponent(self):\r\n" + + " self.ClientSize = Unknown.Type(10)\r\n"; + [Test] + [ExpectedException(typeof(PythonFormWalkerException))] + public void PythonFormWalkerExceptionThrown() + { + PythonFormWalker walker = new PythonFormWalker(this); + walker.CreateForm(pythonCode); + Assert.Fail("Exception should have been thrown before this."); + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/FormsDesignerDisplayBindingTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/FormsDesignerDisplayBindingTestFixture.cs index 20501f47d5..9033102540 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/FormsDesignerDisplayBindingTestFixture.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/FormsDesignerDisplayBindingTestFixture.cs @@ -120,7 +120,7 @@ namespace PythonBinding.Tests public void CreatesPythonFormsDesigner() { MockTextEditorViewContent view = new MockTextEditorViewContent(); - IViewContent[] views = displayBinding.CreateSecondaryViewContent(view); + IViewContent[] views = displayBinding.CreateSecondaryViewContent(view, new MockTextEditorProperties()); Assert.AreEqual(1, views.Length); Assert.IsTrue(views[0] is FormsDesignerViewContent); views[0].Dispose(); @@ -133,7 +133,7 @@ namespace PythonBinding.Tests IViewContent[] views = null; using (FormsDesignerViewContent formsDesigner = new FormsDesignerViewContent(view, new MockOpenedFile("test.py"))) { view.SecondaryViewContents.Add(formsDesigner); - views = displayBinding.CreateSecondaryViewContent(view); + views = displayBinding.CreateSecondaryViewContent(view, new MockTextEditorProperties()); } Assert.AreEqual(0, views.Length); } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Parsing/IronPythonParserTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Parsing/IronPythonParserTestFixture.cs deleted file mode 100644 index 658732db68..0000000000 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Parsing/IronPythonParserTestFixture.cs +++ /dev/null @@ -1,68 +0,0 @@ -// -// -// -// -// $Revision$ -// - -using Microsoft.Scripting.Runtime; -using System; -using System.CodeDom; -using System.CodeDom.Compiler; -using System.IO; -using IronPython; -using IronPython.Compiler; -using IronPython.Compiler.Ast; -using IronPython.Runtime; -using NUnit.Framework; - -namespace PythonBinding.Tests.Parsing -{ - /// - /// Tests the IronPython's parser. - /// - [TestFixture] - public class IronPythonParserTestFixture - { - /// - /// Cannot create PrintStatement for code com. - /// -// [Test]s -// public void Test() -// { -// string pythonScript = "print 'Hello'"; -// PythonProvider provider = new PythonProvider(); -// CodeCompileUnit unit = provider.Parse(new StringReader(pythonScript)); -// } - - [Test] - public void Test2() - { -// string pythonScript = "print 'Hello'"; -// CompilerContext context = new CompilerContext(); -// Parser parser = Parser.FromString(null, context, pythonScript); -// Statement statement = parser.ParseFileInput(); - } - - [Test] - public void Test3() - { -// string pythonScript = "Console.WriteLine"; -// CompilerContext context = new CompilerContext(); -// Parser parser = Parser.FromString(null, context, pythonScript); -// Statement statement = parser.ParseFileInput(); -// ResolveVisitor visitor = new ResolveVisitor(); -// statement.Walk(visitor); -// Console.WriteLine(statement.GetType().FullName); - } - } - - public class ResolveVisitor : PythonWalker - { - public override bool Walk(NameExpression node) - { - System.Console.WriteLine("NameExpression: " + node.Name); - return true; - } - } -} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj index 2e6face661..0de917d37a 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj @@ -151,13 +151,19 @@ + + + + + + @@ -168,7 +174,6 @@ - @@ -198,9 +203,11 @@ + + diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/AddedComponent.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/AddedComponent.cs new file mode 100644 index 0000000000..ac24d7ba5d --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/AddedComponent.cs @@ -0,0 +1,54 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.ComponentModel; + +namespace PythonBinding.Tests.Utils +{ + /// + /// Component passed to the IComponentCreator.Add method. + /// + public class AddedComponent + { + public AddedComponent(IComponent component, string name) + { + Component = component; + Name = name; + } + + public string Name { get; set; } + public IComponent Component { get; set; } + + public override bool Equals(object obj) + { + AddedComponent rhs = obj as AddedComponent; + if (rhs != null) { + return Name == rhs.Name && Component == rhs.Component; + } + return base.Equals(obj); + } + + public override int GetHashCode() + { + return Component.GetHashCode() ^ Name.GetHashCode(); + } + + public override string ToString() + { + return "AddedComponent [Component=" + GetComponentTypeName() + "Name=" + Name + "]"; + } + + string GetComponentTypeName() + { + if (Component != null) { + return Component.GetType().Name; + } + return ""; + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/CreatedInstance.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/CreatedInstance.cs new file mode 100644 index 0000000000..5fefa7dae6 --- /dev/null +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/CreatedInstance.cs @@ -0,0 +1,69 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections; +using System.Text; + +namespace PythonBinding.Tests.Utils +{ + /// + /// Helper class that stores the parameters passed when the IComponentCreator.CreateInstance method is called. + /// + public class CreatedInstance + { + public CreatedInstance(Type type, ICollection arguments, string name, bool addToContainer) + { + InstanceType = type; + Arguments = arguments; + Name = name; + AddToContainer = addToContainer; + } + + public Type InstanceType { get; set; } + public ICollection Arguments { get; set; } + public string Name { get; set; } + public bool AddToContainer { get; set; } + public object Object { get; set; } + + public override bool Equals(object obj) + { + CreatedInstance rhs = obj as CreatedInstance; + if (rhs != null) { + return ToString() == rhs.ToString(); + } + return base.Equals(obj); + } + + public override int GetHashCode() + { + return InstanceType.GetHashCode(); + } + + public override string ToString() + { + return "CreatedInstance [Type=" + InstanceType + ", Name=" + Name + ArgsToString() + "]"; + } + + string ArgsToString() + { + StringBuilder s = new StringBuilder(); + s.Append("[Args="); + + bool firstArg = true; + foreach (object o in Arguments) { + if (!firstArg) { + s.Append(", "); + } + s.Append(o); + firstArg = false; + } + s.Append("]"); + return s.ToString(); + } + } +} diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/DerivedPythonDesignerGenerator.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/DerivedPythonDesignerGenerator.cs index adb395ba97..b848ca37ce 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/DerivedPythonDesignerGenerator.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/DerivedPythonDesignerGenerator.cs @@ -17,6 +17,7 @@ using ICSharpCode.PythonBinding; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; namespace PythonBinding.Tests.Utils { @@ -29,8 +30,13 @@ namespace PythonBinding.Tests.Utils string fileNamePassedToParseFile; string textContentPassedToParseFile; ParseInformation parseInfoToReturnFromParseFile; + + public DerivedPythonDesignerGenerator() : this(new MockTextEditorProperties()) + { + } - public DerivedPythonDesignerGenerator() + public DerivedPythonDesignerGenerator(ITextEditorProperties textEditorProperties) + : base(textEditorProperties) { } From 76ea758b2a56d38c05eace6796346d635b9617a1 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Fri, 2 Jan 2009 16:22:23 +0000 Subject: [PATCH 07/68] Explicitly set the form's size in ironpython unit test before generating code. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3739 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Designer/TextEditorIndentPassedToGeneratorTestFixture.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextEditorIndentPassedToGeneratorTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextEditorIndentPassedToGeneratorTestFixture.cs index a9563e41ae..40f94e1605 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextEditorIndentPassedToGeneratorTestFixture.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextEditorIndentPassedToGeneratorTestFixture.cs @@ -49,7 +49,8 @@ namespace PythonBinding.Tests.Designer using (Form form = new Form()) { form.Name = "MainForm"; - + form.ClientSize = new Size(284, 264); + MockTextEditorProperties textEditorProperties = new MockTextEditorProperties(); textEditorProperties.ConvertTabsToSpaces = true; textEditorProperties.IndentationSize = 1; From 6e80d05d88dd8a2c4956a68c6829716b8ef94ad1 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 3 Jan 2009 17:25:44 +0000 Subject: [PATCH 08/68] Fixed SD2-1503. Invalid expression error message prompt displayed by watch window. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3740 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Debugger.AddIn/Project/Src/Pads/WatchPad.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/WatchPad.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/WatchPad.cs index 2d7d91c268..4c3bb1d3b4 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/WatchPad.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/WatchPad.cs @@ -45,6 +45,14 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads } } + public class ErrorInfoNode : ICorDebug.InfoNode + { + public ErrorInfoNode(string name, string text) : base(name, text) + { + Image = IconService.GetBitmap("Icons.16x16.Error"); + } + } + public sealed class WatchItemName: NodeTextBox { public WatchItemName() { @@ -239,7 +247,9 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads nodes.Add(new TreeViewVarNode(debuggedProcess, watchList, valNode)); } catch (GetValueException) { - MessageService.ShowError(string.Format(StringParser.Parse("${res:MainWindow.Windows.Debug.Watch.InvalidExpression}"), nod.Content.Name)); + string error = String.Format(StringParser.Parse("${res:MainWindow.Windows.Debug.Watch.InvalidExpression}"), nod.Content.Name); + ErrorInfoNode infoNode = new ErrorInfoNode(nod.Content.Name, error); + nodes.Add(new TreeViewVarNode(debuggedProcess, watchList, infoNode)); } } From 08117f470d38a5bab73a4820f3bf96eb0750acb9 Mon Sep 17 00:00:00 2001 From: Christian Hornung Date: Tue, 6 Jan 2009 15:47:29 +0000 Subject: [PATCH 09/68] Fixed SD2-1498 - Deleting Form.Designer file will close main form file and lose changes. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3741 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/DesignerViewContent.cs | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs index c841df9f4e..6ce9618583 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs @@ -137,6 +137,8 @@ namespace ICSharpCode.FormsDesigner if (WorkbenchSingleton.Workbench != null) { this.IsActiveViewContentChanged += this.IsActiveViewContentChangedHandler; } + + FileService.FileRemoving += this.FileServiceFileRemoving; } public FormsDesignerViewContent(IViewContent primaryViewContent, IDesignerLoaderProvider loaderProvider, IDesignerGenerator generator) @@ -603,6 +605,8 @@ namespace ICSharpCode.FormsDesigner base.Dispose(); } finally { + FileService.FileRemoving -= this.FileServiceFileRemoving; + this.UnloadDesigner(); // null check is required to support running in unit test mode @@ -811,6 +815,42 @@ namespace ICSharpCode.FormsDesigner get { return ToolboxProvider.FormsDesignerSideBar; } } + void FileServiceFileRemoving(object sender, FileCancelEventArgs e) + { + if (!e.Cancel && this.DesignerCodeFile != null) { + if (WorkbenchSingleton.InvokeRequired) { + WorkbenchSingleton.SafeThreadAsyncCall(this.CheckForDesignerCodeFileDeletion, e); + } else { + this.CheckForDesignerCodeFileDeletion(e); + } + } + } + + void CheckForDesignerCodeFileDeletion(FileCancelEventArgs e) + { + if (this.DesignerCodeFile == null || String.IsNullOrEmpty(this.DesignerCodeFile.FileName)) { + return; + } + + if ((!e.IsDirectory && FileUtility.IsEqualFileName(this.DesignerCodeFile.FileName, e.FileName)) || + (e.IsDirectory && FileUtility.IsBaseDirectory(e.FileName, this.DesignerCodeFile.FileName))) { + + LoggingService.Info("Forms designer: Handling deletion of open designer code file '" + this.DesignerCodeFile.FileName + "'"); + + // When our designer code file is deleted, + // unload the designer and remove the file from the + // file list so that the primary view is not closed + // because of this event. + + this.UnloadDesigner(); + this.Files.Remove(this.DesignerCodeFile); + this.designerCodeFile = null; + this.designerCodeFileDocument = null; + this.designerCodeFileEncoding = null; + + } + } + #region Design surface manager (static) static readonly DesignSurfaceManager designSurfaceManager = new DesignSurfaceManager(); From 52c20abe83075f95c0a9dc373e5d0c3f2ca9227a Mon Sep 17 00:00:00 2001 From: Christian Hornung Date: Tue, 6 Jan 2009 16:18:37 +0000 Subject: [PATCH 10/68] Fixed SD2-1507 - ArgumentNullException when closing a form. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3742 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../AbstractDesignerGenerator.cs | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs index 86b28908be..0a5ac915de 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs @@ -289,21 +289,30 @@ namespace ICSharpCode.FormsDesigner protected void Reparse() { + ParseInformation info; + ICompilationUnit cu; + // Reparse primary file to update currentClassPart - ParseInformation info = ParserService.ParseFile(this.ViewContent.PrimaryFileName, this.ViewContent.PrimaryFileContent, false); - ICompilationUnit cu = info.BestCompilationUnit; - foreach (IClass c in cu.Classes) { - if (FormsDesignerSecondaryDisplayBinding.BaseClassIsFormOrControl(c)) { - if (FormsDesignerSecondaryDisplayBinding.GetInitializeComponents(c) != null) { - this.currentClassPart = c; - break; + this.currentClassPart = null; + if (!String.IsNullOrEmpty(this.ViewContent.PrimaryFileName)) { + info = ParserService.ParseFile(this.ViewContent.PrimaryFileName, this.ViewContent.PrimaryFileContent, false); + cu = info.BestCompilationUnit; + foreach (IClass c in cu.Classes) { + if (FormsDesignerSecondaryDisplayBinding.BaseClassIsFormOrControl(c)) { + if (FormsDesignerSecondaryDisplayBinding.GetInitializeComponents(c) != null) { + this.currentClassPart = c; + break; + } } } + } else { + LoggingService.Debug("AbstractDesignerGenerator.Reparse: Primary file is unavailable"); + info = null; } // Reparse designer code file to update initializeComponents, // completeClass and formClass - if (this.ViewContent.DesignerCodeFile != this.ViewContent.PrimaryFile) { + if (info == null || this.ViewContent.DesignerCodeFile != this.ViewContent.PrimaryFile) { // Actual parsing is only necessary if the designer code file // is not the same as the primary file. Otherwise we just // reuse the parse info from above. From c11c8658f91e751b5ed00724083d0493effe6e22 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Tue, 6 Jan 2009 20:30:28 +0000 Subject: [PATCH 11/68] Can now specify target CPU when compiling Python applications. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3743 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Resources/CompilingOptionsPanel.xfrm | 33 ++++++++++++++----- .../Project/Src/CompilingOptionsPanel.cs | 11 +++++++ .../Test/CompilingOptionsPanelTestFixture.cs | 12 +++++++ .../Utils/DerivedCompilingOptionsPanel.cs | 14 ++++++++ .../ProjectOptions/AbstractBuildOptions.cs | 11 +++++-- 5 files changed, 71 insertions(+), 10 deletions(-) diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Resources/CompilingOptionsPanel.xfrm b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Resources/CompilingOptionsPanel.xfrm index bfc0a42753..c972ec65db 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Resources/CompilingOptionsPanel.xfrm +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Resources/CompilingOptionsPanel.xfrm @@ -8,17 +8,34 @@ - + + + + + + + + + + + + + + + + + + - + - + @@ -26,29 +43,29 @@ - - + + - + - + - + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/CompilingOptionsPanel.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/CompilingOptionsPanel.cs index e5b3739135..3d97e47828 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/CompilingOptionsPanel.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/CompilingOptionsPanel.cs @@ -28,6 +28,9 @@ namespace ICSharpCode.PythonBinding b = BindBoolean("debugInfoCheckBox", "DebugInfo", false); CreateLocationButton(b, "debugInfoCheckBox"); + + b = CreatePlatformTargetComboBox(); + CreateLocationButton(b, "targetCpuComboBox"); AddConfigurationSelector(this); } @@ -82,5 +85,13 @@ namespace ICSharpCode.PythonBinding { helper.AddConfigurationSelector(control); } + + /// + /// Creates the platform target combo box. + /// + protected virtual ConfigurationGuiBinding CreatePlatformTargetComboBox() + { + return base.CreatePlatformTarget(); + } } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/CompilingOptionsPanelTestFixture.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/CompilingOptionsPanelTestFixture.cs index 4b0c34bcaa..e2c174716a 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/CompilingOptionsPanelTestFixture.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/CompilingOptionsPanelTestFixture.cs @@ -117,6 +117,18 @@ namespace PythonBinding.Tests Assert.IsTrue(compilingOptionsPanel.ConfigurationSelectorAddedToControl); } + [Test] + public void TargetCpuComboxBoxAdded() + { + Assert.IsTrue(compilingOptionsPanel.IsTargetCpuComboBoxCreated); + } + + [Test] + public void TargetCpuComboxBoxLocationButtonCreated() + { + Assert.IsTrue(compilingOptionsPanel.IsLocationButtonCreated("targetCpuComboBox")); + } + BrowseFolderButtonInfo GetOutputPathBrowseFolderInfo() { return compilingOptionsPanel.GetBrowseFolderButtonInfo("outputPathBrowseButton"); diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/DerivedCompilingOptionsPanel.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/DerivedCompilingOptionsPanel.cs index 0473085207..4ba740cc07 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/DerivedCompilingOptionsPanel.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/DerivedCompilingOptionsPanel.cs @@ -28,6 +28,7 @@ namespace PythonBinding.Tests.Utils Dictionary boundTextEditModes = new Dictionary(); List locationButtonsCreated = new List(); Dictionary browseFolderButtons = new Dictionary(); + bool createdTargetCpuComboBox; public DerivedCompilingOptionsPanel() { @@ -45,6 +46,13 @@ namespace PythonBinding.Tests.Utils get { return setupFromManifestResourceName; } } + /// + /// Returns whether the target cpu combo box was created. + /// + public bool IsTargetCpuComboBoxCreated { + get { return createdTargetCpuComboBox; } + } + /// /// Gets the name of the control that was bound to the specified /// property. @@ -142,6 +150,12 @@ namespace PythonBinding.Tests.Utils return base.CreateLocationButton(binding, controlName); } + protected override ConfigurationGuiBinding CreatePlatformTargetComboBox() + { + createdTargetCpuComboBox = true; + return base.CreatePlatformTargetComboBox(); + } + /// /// Connects the browse folder button control to the target control. /// diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AbstractBuildOptions.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AbstractBuildOptions.cs index 8ea3a4b7ed..fd52f30e34 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AbstractBuildOptions.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AbstractBuildOptions.cs @@ -197,6 +197,13 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels b.DefaultLocation = PropertyStorageLocations.PlatformSpecific; b.RegisterLocationButton(advancedLocationButton); + b = CreatePlatformTarget(); + b.RegisterLocationButton(advancedLocationButton); + } + + protected ConfigurationGuiBinding CreatePlatformTarget() + { + ConfigurationGuiBinding b; b = helper.BindStringEnum("targetCpuComboBox", "PlatformTarget", "AnyCPU", new StringPair("AnyCPU", "${res:Dialog.ProjectOptions.Build.TargetCPU.Any}"), @@ -204,9 +211,9 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels new StringPair("x64", "${res:Dialog.ProjectOptions.Build.TargetCPU.x64}"), new StringPair("Itanium", "${res:Dialog.ProjectOptions.Build.TargetCPU.Itanium}")); b.DefaultLocation = PropertyStorageLocations.PlatformSpecific; - b.RegisterLocationButton(advancedLocationButton); + return b; } - + void DebugSymbolsLoaded(object sender, EventArgs e) { PropertyStorageLocations location; From 6eaee68ad43ba814850b0da74dd5825c596383c5 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 9 Jan 2009 23:08:01 +0000 Subject: [PATCH 12/68] fixed SD2-1383 - Long file name displayed in view title git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3744 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../WinFormsUI/Docking/VS2005DockPaneStrip.cs | 73 +++++++++++++++---- src/Libraries/DockPanel_Src/patchnotes.txt | 4 + 2 files changed, 63 insertions(+), 14 deletions(-) diff --git a/src/Libraries/DockPanel_Src/WinFormsUI/Docking/VS2005DockPaneStrip.cs b/src/Libraries/DockPanel_Src/WinFormsUI/Docking/VS2005DockPaneStrip.cs index c372a1065c..e0e8470225 100644 --- a/src/Libraries/DockPanel_Src/WinFormsUI/Docking/VS2005DockPaneStrip.cs +++ b/src/Libraries/DockPanel_Src/WinFormsUI/Docking/VS2005DockPaneStrip.cs @@ -308,6 +308,25 @@ namespace WeifenLuo.WinFormsUI.Docking return textFormat; } } + + private StringFormat ToolWindowStringFormat + { + get + { + StringFormat format = new StringFormat(); + format.Alignment = StringAlignment.Center; + format.LineAlignment = StringAlignment.Center; + format.FormatFlags = StringFormatFlags.NoWrap | StringFormatFlags.NoClip; + format.Trimming = StringTrimming.EllipsisPath; + + if (RightToLeft == RightToLeft.Yes) { + format.FormatFlags |= StringFormatFlags.DirectionRightToLeft; + format.LineAlignment = StringAlignment.Near; + } + + return format; + } + } private static int DocumentStripGapTop { @@ -334,7 +353,24 @@ namespace WeifenLuo.WinFormsUI.Docking return textFormat; } } - + + private StringFormat DocumentStringFormat + { + get + { + StringFormat format = new StringFormat(); + format.Alignment = StringAlignment.Center; + format.LineAlignment = StringAlignment.Center; + format.FormatFlags = StringFormatFlags.NoWrap | StringFormatFlags.NoClip; + format.Trimming = StringTrimming.EllipsisPath; + + if (RightToLeft == RightToLeft.Yes) + format.FormatFlags |= StringFormatFlags.DirectionRightToLeft; + + return format; + } + } + private static int DocumentTabMaxWidth { get { return _DocumentTabMaxWidth; } @@ -1044,7 +1080,8 @@ namespace WeifenLuo.WinFormsUI.Docking { g.FillPath(BrushToolWindowActiveBackground, path); g.DrawPath(PenToolWindowTabBorder, path); - TextRenderer.DrawText(g, tab.Content.DockHandler.TabText, TextFont, rectText, ColorToolWindowActiveText, ToolWindowTextFormat); + using (SolidBrush brush = new SolidBrush(ColorToolWindowActiveText)) + g.DrawString(tab.Content.DockHandler.TabText, TextFont, brush, rectText, ToolWindowStringFormat); } else { @@ -1054,7 +1091,8 @@ namespace WeifenLuo.WinFormsUI.Docking Point pt2 = new Point(rect.Right, rect.Bottom - ToolWindowTabSeperatorGapBottom); g.DrawLine(PenToolWindowTabBorder, DrawHelper.RtlTransform(this, pt1), DrawHelper.RtlTransform(this, pt2)); } - TextRenderer.DrawText(g, tab.Content.DockHandler.TabText, TextFont, rectText, ColorToolWindowInactiveText, ToolWindowTextFormat); + using (SolidBrush brush = new SolidBrush(ColorToolWindowInactiveText)) + g.DrawString(tab.Content.DockHandler.TabText, TextFont, brush, rectText, ToolWindowStringFormat); } if (rectTab.Contains(rectIcon)) @@ -1090,17 +1128,24 @@ namespace WeifenLuo.WinFormsUI.Docking { g.FillPath(BrushDocumentActiveBackground, path); g.DrawPath(PenDocumentTabActiveBorder, path); - if (DockPane.IsActiveDocumentPane) - TextRenderer.DrawText(g, tab.Content.DockHandler.TabText, BoldFont, rectText, ColorDocumentActiveText, DocumentTextFormat); - else - TextRenderer.DrawText(g, tab.Content.DockHandler.TabText, TextFont, rectText, ColorDocumentActiveText, DocumentTextFormat); - } - else - { - g.FillPath(BrushDocumentInactiveBackground, path); - g.DrawPath(PenDocumentTabInactiveBorder, path); - TextRenderer.DrawText(g, tab.Content.DockHandler.TabText, TextFont, rectText, ColorDocumentInactiveText, DocumentTextFormat); - } + if (DockPane.IsActiveDocumentPane) { + using (SolidBrush brush = new SolidBrush(ColorDocumentActiveText)) + g.DrawString(tab.Content.DockHandler.TabText, BoldFont, brush, + rectText, DocumentStringFormat); + } else { + using (SolidBrush brush = new SolidBrush(ColorDocumentActiveText)) + g.DrawString(tab.Content.DockHandler.TabText, TextFont, brush, + rectText, DocumentStringFormat); + } + } + else + { + g.FillPath(BrushDocumentInactiveBackground, path); + g.DrawPath(PenDocumentTabInactiveBorder, path); + using (SolidBrush brush = new SolidBrush(ColorDocumentInactiveText)) + g.DrawString(tab.Content.DockHandler.TabText, TextFont, brush, + rectText, DocumentStringFormat); + } if (rectTab.Contains(rectIcon) && DockPane.DockPanel.ShowDocumentIcon) g.DrawIcon(tab.Content.DockHandler.Icon, rectIcon); diff --git a/src/Libraries/DockPanel_Src/patchnotes.txt b/src/Libraries/DockPanel_Src/patchnotes.txt index c78739c786..412402e291 100644 --- a/src/Libraries/DockPanel_Src/patchnotes.txt +++ b/src/Libraries/DockPanel_Src/patchnotes.txt @@ -29,3 +29,7 @@ Patch #5: In DockContentHandler.SetVisible: Ensure pad visibility is set correctly, even when Windows.Forms is "lying" about Form.Visible. Committed in revision 3061. + +Patch #6: + In VS2005DockPaneStrip.cs: fixed SD2-1383 + Committed in revision 3744. \ No newline at end of file From a5c660c325ac7e08a517f3912ea92e2a5d229a3e Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 11 Jan 2009 15:13:12 +0000 Subject: [PATCH 13/68] fixed SD2-1486 - Extract Interface fails with overloaded methods and other bugs in Extract Interface git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3745 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../FindReferencesAndRenameHelper.cs | 10 +- .../NRefactoryRefactoringProvider.cs | 225 +++++++++++------- .../Src/Refactoring/RefactoringProvider.cs | 6 +- 3 files changed, 146 insertions(+), 95 deletions(-) diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs index d9cead43a1..270e898285 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs @@ -5,11 +5,11 @@ // $Revision$ // +using ICSharpCode.NRefactory.Ast; using System; using System.Collections.Generic; using System.IO; using System.Text; - using ICSharpCode.Core; using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; using ICSharpCode.SharpDevelop.Dom; @@ -62,7 +62,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring LanguageProperties language = c.ProjectContent.Language; string classFileName = c.CompilationUnit.FileName; string existingClassCode = ParserService.GetParseableFileContent(classFileName); - + // build the new interface... string newInterfaceCode = language.RefactoringProvider.GenerateInterfaceForClass(extractInterface.NewInterfaceName, @@ -83,7 +83,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring // simply update it editable.Text = newInterfaceCode; viewContent.PrimaryFile.SaveToDisk(); - } else { // create it viewContent = FileService.NewFile(newInterfaceFileName, newInterfaceCode); @@ -101,9 +100,12 @@ namespace ICSharpCode.SharpDevelop.Refactoring } } + ICompilationUnit newCompilationUnit = ParserService.ParseFile(newInterfaceFileName).MostRecentCompilationUnit; + IClass newInterfaceDef = newCompilationUnit.Classes[0]; + // finally, add the interface to the base types of the class that we're extracting from if (extractInterface.AddInterfaceToClass) { - string modifiedClassCode = language.RefactoringProvider.AddBaseTypeToClass(existingClassCode, extractInterface.NewInterfaceName); + string modifiedClassCode = language.RefactoringProvider.AddBaseTypeToClass(existingClassCode, c, newInterfaceDef); if (modifiedClassCode == null) { return; } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryRefactoringProvider.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryRefactoringProvider.cs index 434af99cac..b3c72b0f6d 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryRefactoringProvider.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryRefactoringProvider.cs @@ -93,79 +93,117 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring } } - private class ExtractInterfaceVisitor : NR.Visitors.AbstractAstVisitor + class ExtractInterfaceTransformer : NR.Visitors.AbstractAstTransformer { string newInterfaceName; string sourceClassName; string sourceNamespace; - Dictionary membersToInclude; + List membersToInclude; - public ExtractInterfaceVisitor(string newInterfaceName, - string sourceNamespace, - string sourceClassName, - IList chosenMembers) { + public ExtractInterfaceTransformer(string newInterfaceName, + string sourceNamespace, + string sourceClassName, + IList chosenMembers) { this.newInterfaceName = newInterfaceName; this.sourceNamespace = sourceNamespace; this.sourceClassName = sourceClassName; - // store the chosen members in a dictionary for easy lookup - membersToInclude = new Dictionary(); - foreach(IMember m in chosenMembers) { - membersToInclude.Add(m.Name, m); - } + membersToInclude = chosenMembers.ToList(); } + + public override object VisitNamespaceDeclaration(NamespaceDeclaration namespaceDeclaration, object data) + { + TypeDeclaration type = LookupTypeDeclaration(namespaceDeclaration.Children, namespaceDeclaration.Name); - public override object VisitCompilationUnit(CompilationUnit compilationUnit, object data) + RemoveCurrentNode(); + + if (type != null && namespaceDeclaration.Parent is CompilationUnit) + ((CompilationUnit)namespaceDeclaration.Parent).AddChild(type); + + return base.VisitNamespaceDeclaration(namespaceDeclaration, data); + } + + public override object VisitUsingDeclaration(UsingDeclaration usingDeclaration, object data) { - // strip out any usings & extract our TypeReference from the NameSpace - // we walk backwards so that deletions don't affect the iteration - NamespaceDeclaration ns; - TypeDeclaration td; - object child; - object nsChild; - for(int i = compilationUnit.Children.Count-1; i>=0; i--) { - child = compilationUnit.Children[i]; - if (child is UsingDeclaration) { - // we don't want our usings here... - compilationUnit.Children.RemoveAt(i); - } - else if (child is NamespaceDeclaration) { - ns = (NamespaceDeclaration)child; - if (ns.Name != this.sourceNamespace) { - // we're not interested in this namespace... - compilationUnit.Children.RemoveAt(i); - } else { - - // this NamespaceDeclaration presumably contains our source class - // walk its children backwards to that removing them won't break the iteration - for(int j = ns.Children.Count-1; j>=0; j--) { - nsChild = ns.Children[j]; - if (nsChild is TypeDeclaration) { - td = (TypeDeclaration)nsChild; - - if (td.Name == this.sourceClassName) { - // keep it, and substitute it for the current NamespaceDeclaration - compilationUnit.Children[i] = td; - } else { - // it's not the class we're extracting from - ns.Children.RemoveAt(j); - } - } else { - // it's not even a class... (e.g. using, etc) - ns.Children.RemoveAt(j); - } - } - } - } else { - // we don't actually want to throw an exception here just because we havn't forseen the node type... - //throw new NotSupportedException("trimming "+compilationUnit.Children[i].ToString()+" is not supported."); + RemoveCurrentNode(); + return base.VisitUsingDeclaration(usingDeclaration, data); + } + + TypeDeclaration LookupTypeDeclaration(List nodes, string nameSpace) + { + TypeDeclaration td = null; + + foreach (INode node in nodes) { + if (node is TypeDeclaration) { + TypeDeclaration type = node as TypeDeclaration; + string name = nameSpace + "." + type.Name; + string lookFor = sourceNamespace + "." + sourceClassName; + if (lookFor == name) + return type; + else + td = LookupTypeDeclaration(node.Children, name); } } - return base.VisitCompilationUnit(compilationUnit, data); + + return td; + } + + static bool MethodEquals(MethodDeclaration md1, MethodDeclaration md2) + { + if (md2 == null) + throw new ArgumentNullException("md2"); + if (md1 == null) + throw new ArgumentNullException("md1"); + + // see C# Spec 3, page 65, 3.6 + + return md1.Name == md2.Name && + (MethodDeclaration.GetCollectionString(md1.Parameters) == MethodDeclaration.GetCollectionString(md2.Parameters)) && + (MethodDeclaration.GetCollectionString(md1.Templates) == MethodDeclaration.GetCollectionString(md2.Templates)); + } + + static bool PropertyEquals(PropertyDeclaration pd1, PropertyDeclaration pd2) + { + if (pd1 == null) + throw new ArgumentNullException("pd1"); + if (pd2 == null) + throw new ArgumentNullException("pd2"); + + return pd1.Name == pd2.Name; + } + + bool ContainsMethod(MethodDeclaration md) + { + if (md == null) + throw new ArgumentNullException("md"); + + foreach (IMember mem in this.membersToInclude) { + if (mem is IMethod && MethodEquals(CodeGenerator.ConvertMember(mem as IMethod, new ClassFinder(mem)) as MethodDeclaration, md)) + return true; + } + + return false; + } + + bool ContainsProperty(PropertyDeclaration pd) + { + if (pd == null) + throw new ArgumentNullException("pd"); + + foreach (IMember mem in this.membersToInclude) { + if (mem is IProperty && PropertyEquals(CodeGenerator.ConvertMember(mem as IProperty, new ClassFinder(mem)) as PropertyDeclaration, pd)) + return true; + } + + return false; } public override object VisitTypeDeclaration(TypeDeclaration typeDeclaration, object data) { + if (typeDeclaration.Name != sourceClassName) { + return base.VisitTypeDeclaration(typeDeclaration, data); + } + // rewrite the type declaration to an interface typeDeclaration.Attributes.Clear(); typeDeclaration.BaseTypes.Clear(); @@ -184,16 +222,12 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring child = typeDeclaration.Children[i]; if (child is MethodDeclaration) { method = (MethodDeclaration)child; - if (membersToInclude.ContainsKey(method.Name) - && ((method.Modifier & Modifiers.Static) == Modifiers.None)) { + if (ContainsMethod(method) && ((method.Modifier & Modifiers.Static) != Modifiers.Static)) keepIt = true; - } } else if (child is PropertyDeclaration) { property = (PropertyDeclaration)child; - if (membersToInclude.ContainsKey(property.Name) - && ((property.Modifier & Modifiers.Static) == Modifiers.None)) { + if (ContainsProperty(property) && ((property.Modifier & Modifiers.Static) != Modifiers.Static)) keepIt = true; - } } if (!keepIt) { @@ -207,28 +241,36 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring public override object VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data) { - // strip out the public modifier... - methodDeclaration.Modifier = NR.Ast.Modifiers.None; - - // ...and the method body - methodDeclaration.Body = BlockStatement.Null; + if (ContainsMethod(methodDeclaration) && ((methodDeclaration.Modifier & Modifiers.Static) != Modifiers.Static)) { + // strip out the public modifier... + methodDeclaration.Modifier = NR.Ast.Modifiers.None; + + // ...and the method body + methodDeclaration.Body = BlockStatement.Null; + } else { + RemoveCurrentNode(); + } return null; } public override object VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration, object data) { - // strip out the public modifiers... - propertyDeclaration.Modifier = NR.Ast.Modifiers.None; + if (ContainsProperty(propertyDeclaration) && ((propertyDeclaration.Modifier & Modifiers.Static) != Modifiers.Static)) { + // strip out the public modifiers... + propertyDeclaration.Modifier = NR.Ast.Modifiers.None; - // ... and the body of any get block... - if (propertyDeclaration.HasGetRegion) { - propertyDeclaration.GetRegion.Block = BlockStatement.Null; - } + // ... and the body of any get block... + if (propertyDeclaration.HasGetRegion) { + propertyDeclaration.GetRegion.Block = BlockStatement.Null; + } - // ... and the body of any set block... - if (propertyDeclaration.HasSetRegion) { - propertyDeclaration.SetRegion.Block = BlockStatement.Null; + // ... and the body of any set block... + if (propertyDeclaration.HasSetRegion) { + propertyDeclaration.SetRegion.Block = BlockStatement.Null; + } + } else { + RemoveCurrentNode(); } return null; @@ -251,11 +293,11 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring // use a custom IAstVisitor to strip our class out of this file, // rewrite it as our desired interface, and strip out every // member except those we want to keep in our new interface. - ExtractInterfaceVisitor extractInterfaceVisitor = new ExtractInterfaceVisitor(newInterfaceName, - sourceNamespace, - sourceClassName, - membersToKeep); - parser.CompilationUnit.AcceptVisitor(extractInterfaceVisitor, null); + ExtractInterfaceTransformer extractInterfaceTransformer = new ExtractInterfaceTransformer(newInterfaceName, + sourceNamespace, + sourceClassName, + membersToKeep); + parser.CompilationUnit.AcceptVisitor(extractInterfaceTransformer, null); // now use an output visitor for the appropriate language (based on // extension of the existing code file) to format the new interface. @@ -272,6 +314,7 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring // run the output visitor without the specials inserter parser.CompilationUnit.AcceptVisitor(output, null); } + parser.Dispose(); if (output.Errors.Count == 0) { @@ -289,13 +332,14 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring return newFileContent; } - private class AddTypeToBaseTypesVisitor : NR.Visitors.AbstractAstVisitor + class AddTypeToBaseTypesVisitor : NR.Visitors.AbstractAstVisitor { - private TypeReference typeReference; + IClass target, newBaseType; - public AddTypeToBaseTypesVisitor(string newTypeName) + public AddTypeToBaseTypesVisitor(IClass target, IClass newBaseType) { - this.typeReference = new TypeReference(newTypeName); + this.target = target; + this.newBaseType = newBaseType; } public override object VisitTypeDeclaration(TypeDeclaration typeDeclaration, object data) @@ -303,29 +347,32 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring // test the Type string property explicitly (rather than .BaseTypes.Contains()) // to ensure that a matching type name is enough to prevent adding a second // reference. + + if (typeDeclaration.Name != target.Name) + return base.VisitTypeDeclaration(typeDeclaration, data); + bool exists = false; foreach(TypeReference type in typeDeclaration.BaseTypes) { - if (type.Type == this.typeReference.Type) { + if (type.Type == this.newBaseType.Name) { exists = true; break; } } if (!exists) { - typeDeclaration.BaseTypes.Add(this.typeReference); + typeDeclaration.BaseTypes.Add(new TypeReference(newBaseType.Name, newBaseType.TypeParameters.Select(p => new TypeReference(p.Name)).ToList())); } return base.VisitTypeDeclaration(typeDeclaration, data); } } - public override string AddBaseTypeToClass(string existingCode, string newInterfaceName) + public override string AddBaseTypeToClass(string existingCode, IClass targetClass, IClass newBaseType) { - string newCode = existingCode; NR.IParser parser = ParseFile(null, existingCode); if (parser == null) { return null; } - AddTypeToBaseTypesVisitor addTypeToBaseTypesVisitor = new AddTypeToBaseTypesVisitor(newInterfaceName); + AddTypeToBaseTypesVisitor addTypeToBaseTypesVisitor = new AddTypeToBaseTypesVisitor(targetClass, newBaseType); parser.CompilationUnit.AcceptVisitor(addTypeToBaseTypesVisitor, null); diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/RefactoringProvider.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/RefactoringProvider.cs index 6ecde72062..6cefdf26c4 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/RefactoringProvider.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/RefactoringProvider.cs @@ -5,6 +5,7 @@ // $Revision$ // +using ICSharpCode.NRefactory.Ast; using System; using System.Collections.Generic; @@ -46,8 +47,9 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring throw new NotSupportedException(); } - public virtual string AddBaseTypeToClass(string existingCode, string newInterfaceName) { - throw new NotSupportedException(); + public virtual string AddBaseTypeToClass(string existingCode, IClass targetClass, IClass newBaseType) + { + throw new NotImplementedException(); } #endregion From c3cc141fe4356861ac0ef7b489821a1cd8491a79 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 15 Jan 2009 14:49:40 +0000 Subject: [PATCH 14/68] Deprecate AppDomainLaunchHelper (it's much better to manually launch AppDomains inside AddIns). Copyright end date 2008->2009. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3746 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- doc/AssemblyBaseAddresses.txt | 69 ------------------- src/AddIns/Misc/CodeAnalysis/Src/FxCopRule.cs | 2 + .../Misc/CodeAnalysis/Src/FxCopWrapper.cs | 45 ++++++------ .../StartPage/Project/Src/ICSharpCodePage.cs | 4 +- .../Project/Resources/CommonAboutDialog.xfrm | 2 +- .../Project/Src/Util/AppDomainLaunchHelper.cs | 3 +- src/Main/GlobalAssemblyInfo.template | 2 +- 7 files changed, 33 insertions(+), 94 deletions(-) delete mode 100644 doc/AssemblyBaseAddresses.txt diff --git a/doc/AssemblyBaseAddresses.txt b/doc/AssemblyBaseAddresses.txt deleted file mode 100644 index e75cbd320b..0000000000 --- a/doc/AssemblyBaseAddresses.txt +++ /dev/null @@ -1,69 +0,0 @@ -To be on the safe side and leave enough space for the future, -the in-memory size of an assembly used here should be 8 times the disk image size. -That should allow an assembly to grow to more than twice its old size without having to update this list. - -Sysinternals Processexplorer can show relocated assemblies in yellow in the DLL View. - -adr = 0x5000000 -def AddModule(kbsize as int): - print "0x${adr.ToString('x')} - 0x${(adr + 3 * kbsize * 1024).ToString('x')}" - adr += 8 * kbsize * 1024 - adr = 0x80000 * System.Math.Ceiling(cast(double,adr) / 0x80000) - -def AddModules(*names as (string)): - for name in names: - System.Console.Write("${name}:\t") - AddModule(System.IO.FileInfo("d:\\serralongue\\sharpdevelop\\bin\\" + name + ".dll").Length / 1024) - -All addresses are between 0x0500 0000 and 0x0fff ffff - -AssemblyName: startaddress - endaddress -ICSharpCode.Core: 0x5000000 - 0x504e000 -ICSharpCode.SharpDevelop: 0x5100000 - 0x5472000 -ICSharpCode.NRefactory: 0x5a80000 - 0x5b9a000 -ICSharpCode.TextEditor: 0x5d80000 - 0x5e67000 -ICSharpCode.SharpDevelop.Sda: 0x6000000 - 0x601e000 -WeifenLuo.WinFormsUI.Docking: 0x6080000 - 0x6107000 -ICSharpCode.Build.Tasks: 0x6200000 - 0x621b000 - -CSharpBinding: 0x6280000 - 0x62bc000 -ILAsmBinding: 0x6380000 - 0x639b000 -VBNetBinding: 0x6400000 - 0x643f000 -NRefactoryToBooConverter: 0x6500000 - 0x6536000 -BooBinding: 0x6600000 - 0x664e000 - -FormsDesigner: 0x6700000 - 0x676f000 -ResourceEditor: 0x6880000 - 0x689e000 -XmlEditor: 0x6900000 - 0x6948000 - -ICSharpCode.AddInMananger: 0x6a00000 - 0x6a24000 -AddInScout: 0x6a80000 - 0x6a8b400 -CodeCoverage: 0x6b00000 - 0x6b30000 -TreeListView (debugger): 0x6b80000 - 0x6be6000 -Debugger.Code: 0x6d00000 - 0x6ddb000 -Debugger.AddIn: 0x6f80000 - 0x6faa000 -FileTypeRegisterer: 0x7000000 - 0x7009000 -HighlightingEditor: 0x7080000 - 0x70ec000 -HtmlHelp2: 0x7200000 - 0x723f000 -HtmlHelp2JScriptGlobals: 0x7300000 - 0x7306c00 -MonoAddIn: 0x7380000 - 0x7395000 -NAntAddIn: 0x7400000 - 0x7427000 -PInvokeAddIn: 0x7480000 - 0x749b000 -RegExpTk: 0x7500000 - 0x7524000 -SharpQuery: 0x7580000 - 0x75b0000 -SharpReportCore: 0x7600000 - 0x7654000 -SharpReport: 0x7700000 - 0x773c000 -SharpReportAddIn: 0x7800000 - 0x781e000 -ReportGenerator: 0x7880000 - 0x78a1000 -StartPage: 0x7900000 - 0x791e000 -UnitTesting: 0x7980000 - 0x799b000 -Mono.Cecil: 0x7a00000 - 0x7b38000 -WixBinding: 0x7d80000 - 0x7dc2000 -ICSharpCode.SharpDevelop.Dom: 0x7e80000 - 0x7f19000 -CodeAnalysis: 0x8000000 - 0x8021000 -IconEditor: 0x8080000 - 0x80a1000 -IconEditor.AddIn: 0x8100000 - 0x810c000 -SharpDbTools: 0x8180000 - 0x819e000 -ICSharpCode.SD.Widgets: 0x8240000 - 0x827c000 - -Next free address: 0x08300000 diff --git a/src/AddIns/Misc/CodeAnalysis/Src/FxCopRule.cs b/src/AddIns/Misc/CodeAnalysis/Src/FxCopRule.cs index 02b1734cb9..be7f21704b 100644 --- a/src/AddIns/Misc/CodeAnalysis/Src/FxCopRule.cs +++ b/src/AddIns/Misc/CodeAnalysis/Src/FxCopRule.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; namespace ICSharpCode.CodeAnalysis { + [Serializable] public class FxCopRule : IComparable { readonly string checkId; @@ -73,6 +74,7 @@ namespace ICSharpCode.CodeAnalysis } } + [Serializable] public class FxCopCategory { readonly string name; diff --git a/src/AddIns/Misc/CodeAnalysis/Src/FxCopWrapper.cs b/src/AddIns/Misc/CodeAnalysis/Src/FxCopWrapper.cs index b2b63447f1..8a7bb76e35 100644 --- a/src/AddIns/Misc/CodeAnalysis/Src/FxCopWrapper.cs +++ b/src/AddIns/Misc/CodeAnalysis/Src/FxCopWrapper.cs @@ -16,7 +16,7 @@ using Microsoft.Win32; namespace ICSharpCode.CodeAnalysis { - public static class FxCopWrapper + public class FxCopWrapper : MarshalByRefObject { static Dictionary> ruleDict = new Dictionary>(new ArrayHashCodeProvider()); @@ -178,20 +178,24 @@ namespace ICSharpCode.CodeAnalysis setup.ApplicationBase = fxCopPath; AppDomain domain = AppDomain.CreateDomain("FxCop Rule Loading Domain", AppDomain.CurrentDomain.Evidence, setup); - string[][] ruleTextList; + ResolveEventHandler onResolve = delegate(object sender, ResolveEventArgs args) { + if (args.Name == typeof(FxCopWrapper).Assembly.FullName) { + return typeof(FxCopWrapper).Assembly; + } else { + return null; + } + }; + FxCopRule[] ruleList; try { - ruleTextList = (string[][])AppDomainLaunchHelper.LaunchInAppDomain(domain, typeof(FxCopWrapper), "GetRuleListInCurrentAppDomain", fxCopPath, ruleAssemblies); + AppDomain.CurrentDomain.AssemblyResolve += onResolve; + FxCopWrapper wrapper = (FxCopWrapper)domain.CreateInstanceFromAndUnwrap(typeof(FxCopWrapper).Assembly.Location, typeof(FxCopWrapper).FullName); + + ruleList = wrapper.GetRuleListInstanceMethod(fxCopPath, ruleAssemblies); } finally { + AppDomain.CurrentDomain.AssemblyResolve -= onResolve; AppDomain.Unload(domain); } - FxCopRule[] ruleList = new FxCopRule[ruleTextList.Length]; - for (int i = 0; i < ruleTextList.Length; i++) { - ruleList[i] = new FxCopRule(ruleTextList[i][0], ruleTextList[i][1], - ruleTextList[i][2], ruleTextList[i][3], - ruleTextList[i][4]); - } - Array.Sort(ruleList); List rules = new List(); lock (ruleDict) { @@ -236,7 +240,7 @@ namespace ICSharpCode.CodeAnalysis return v.ToString(); } - public static string[][] GetRuleListInCurrentAppDomain(string fxCopPath, string[] ruleAssemblies) + FxCopRule[] GetRuleListInstanceMethod(string fxCopPath, string[] ruleAssemblies) { Assembly asm = Assembly.LoadFrom(Path.Combine(fxCopPath, "FxCopCommon.dll")); @@ -253,20 +257,21 @@ namespace ICSharpCode.CodeAnalysis object exceptionList = CallMethod(project, "Initialize"); foreach (Exception ex in ((IEnumerable)exceptionList)) { - LoggingService.Warn(ex); + Console.WriteLine(ex.ToString()); } IEnumerable ruleList = (IEnumerable)GetProp(GetProp(project, "AllRules"), "Values"); - List rules = new List(); + + List rules = new List(); foreach (object ruleContainer in ruleList) { object rule = GetProp(ruleContainer, "IRule"); - rules.Add(new string[] { - GetSProp(rule, "CheckId"), - GetSProp(rule, "Name"), - GetSProp(rule, "Category"), - GetSProp(rule, "Description"), - GetSProp(rule, "Url") - }); + rules.Add(new FxCopRule( + GetSProp(rule, "CheckId"), + GetSProp(rule, "Name"), + GetSProp(rule, "Category"), + GetSProp(rule, "Description"), + GetSProp(rule, "Url") + )); } return rules.ToArray(); diff --git a/src/AddIns/Misc/StartPage/Project/Src/ICSharpCodePage.cs b/src/AddIns/Misc/StartPage/Project/Src/ICSharpCodePage.cs index 000f462175..9ae7fe7bcb 100644 --- a/src/AddIns/Misc/StartPage/Project/Src/ICSharpCodePage.cs +++ b/src/AddIns/Misc/StartPage/Project/Src/ICSharpCodePage.cs @@ -202,7 +202,7 @@ namespace ICSharpCode.StartPage StaticStyleSheet = startPageLocation + "/Layout/default.css"; MetaAuthor = "Christoph Wille - christophw@alphasierrapapa.com"; - MetaCopyright = "(c) 2001-2008 AlphaSierraPapa"; + MetaCopyright = "(c) 2001-2009 AlphaSierraPapa"; ShowLeftMenu = false; ShowRightBox = false; @@ -475,7 +475,7 @@ namespace ICSharpCode.StartPage builder.Append(m_strMainColColor); builder.Append("\" class=\"copy\">"); builder.Append(""); - builder.Append("Copyright ©2000-2008 IC#SharpCode. "); builder.Append(ICSharpCode.SharpDevelop.Gui.AboutSharpDevelopTabPage.LicenseSentence); diff --git a/src/Main/Base/Project/Resources/CommonAboutDialog.xfrm b/src/Main/Base/Project/Resources/CommonAboutDialog.xfrm index 7d12f05618..122b2882a4 100644 --- a/src/Main/Base/Project/Resources/CommonAboutDialog.xfrm +++ b/src/Main/Base/Project/Resources/CommonAboutDialog.xfrm @@ -26,7 +26,7 @@ - + diff --git a/src/Main/Core/Project/Src/Util/AppDomainLaunchHelper.cs b/src/Main/Core/Project/Src/Util/AppDomainLaunchHelper.cs index 3d926592cb..6f42ec9ef6 100644 --- a/src/Main/Core/Project/Src/Util/AppDomainLaunchHelper.cs +++ b/src/Main/Core/Project/Src/Util/AppDomainLaunchHelper.cs @@ -35,10 +35,11 @@ namespace ICSharpCode.Core /// [Serializable] class Request { ... } // must be serializable !!! /// [Serializable] class ResultClass { ... } // must be serializable !!! /// + [Obsolete("This class is broken, serialization does not work and addin dependencies are not loaded in the AppDomain")] public class AppDomainLaunchHelper : MarshalByRefObject { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")] - public object LaunchMethod(string assemblyFile, string typeName, string methodName, object[] arguments) + object LaunchMethod(string assemblyFile, string typeName, string methodName, object[] arguments) { Type t = Assembly.LoadFrom(assemblyFile).GetType(typeName); return t.InvokeMember(methodName, (BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod), null, null, arguments, CultureInfo.InvariantCulture); diff --git a/src/Main/GlobalAssemblyInfo.template b/src/Main/GlobalAssemblyInfo.template index ff7d6ad732..290dbbbbd4 100644 --- a/src/Main/GlobalAssemblyInfo.template +++ b/src/Main/GlobalAssemblyInfo.template @@ -20,7 +20,7 @@ using System.Reflection; [assembly: System.Runtime.InteropServices.ComVisible(false)] [assembly: AssemblyCompany("ic#code")] [assembly: AssemblyProduct("SharpDevelop")] -[assembly: AssemblyCopyright("2000-2008 AlphaSierraPapa")] +[assembly: AssemblyCopyright("2000-2009 AlphaSierraPapa")] [assembly: AssemblyVersion(RevisionClass.FullVersion)] [assembly: NeutralResourcesLanguage("en-US")] From adfef0e61742822ccc6846f885fb4b99f9565a3a Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 15 Jan 2009 16:39:17 +0000 Subject: [PATCH 15/68] Fixed build. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3748 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/Setup/Files.wxs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Setup/Files.wxs b/src/Setup/Files.wxs index a0884ce607..1d000e8123 100644 --- a/src/Setup/Files.wxs +++ b/src/Setup/Files.wxs @@ -712,7 +712,6 @@ - From c15374a67c749687b2b7da6423011a72d89414b0 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 16 Jan 2009 12:56:31 +0000 Subject: [PATCH 16/68] On quad core machines, use 4 build workers by default. Rename extension method Foreach -> ForEach. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3749 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Resources/ProjectAndSolutionOptionsPanel.xfrm | 2 +- src/Main/Base/Project/Src/Commands/FileCommands.cs | 4 ++-- .../Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs | 2 +- .../Src/Gui/Workbench/Layouts/SimpleWorkbenchLayout.cs | 2 +- src/Main/Base/Project/Src/Project/BuildEngine.cs | 4 ++-- src/Main/Base/Project/Src/Project/BuildOptions.cs | 2 +- src/Main/Base/Project/Src/Util/ExtensionMethods.cs | 8 +++++++- .../Project/Src/ExtensionMethods.cs | 6 ++++++ 8 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/Main/Base/Project/Resources/ProjectAndSolutionOptionsPanel.xfrm b/src/Main/Base/Project/Resources/ProjectAndSolutionOptionsPanel.xfrm index 6628af410d..659f5e20d7 100644 --- a/src/Main/Base/Project/Resources/ProjectAndSolutionOptionsPanel.xfrm +++ b/src/Main/Base/Project/Resources/ProjectAndSolutionOptionsPanel.xfrm @@ -75,7 +75,7 @@ - + diff --git a/src/Main/Base/Project/Src/Commands/FileCommands.cs b/src/Main/Base/Project/Src/Commands/FileCommands.cs index cdd65133a6..d335bf85bf 100644 --- a/src/Main/Base/Project/Src/Commands/FileCommands.cs +++ b/src/Main/Base/Project/Src/Commands/FileCommands.cs @@ -69,7 +69,7 @@ namespace ICSharpCode.SharpDevelop.Commands internal static void Save(IWorkbenchWindow window) { - window.ViewContents.Foreach(Save); + window.ViewContents.ForEach(Save); } internal static void Save(IViewContent content) @@ -140,7 +140,7 @@ namespace ICSharpCode.SharpDevelop.Commands internal static void Save(IWorkbenchWindow window) { - window.ViewContents.Foreach(Save); + window.ViewContents.ForEach(Save); } internal static void Save(IViewContent content) diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs index cec58427cc..fafc72ba6d 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs @@ -349,7 +349,7 @@ namespace ICSharpCode.SharpDevelop.Gui if (!vc.IsDirty) continue; if (vc.PrimaryFile != null) { while (true) { - vc.Files.Foreach(ICSharpCode.SharpDevelop.Commands.SaveFile.Save); + vc.Files.ForEach(ICSharpCode.SharpDevelop.Commands.SaveFile.Save); if (vc.IsDirty) { if (MessageService.AskQuestion("${res:MainWindow.DiscardChangesMessage}")) { fileDiscarded = true; diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SimpleWorkbenchLayout.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SimpleWorkbenchLayout.cs index fbbc3674c8..1138cf89dc 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SimpleWorkbenchLayout.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SimpleWorkbenchLayout.cs @@ -541,7 +541,7 @@ namespace ICSharpCode.SharpDevelop.Gui if (!vc.IsDirty) continue; if (vc.PrimaryFile != null) { while (true) { - vc.Files.Foreach(ICSharpCode.SharpDevelop.Commands.SaveFile.Save); + vc.Files.ForEach(ICSharpCode.SharpDevelop.Commands.SaveFile.Save); if (vc.IsDirty) { if (MessageService.AskQuestion("${res:MainWindow.DiscardChangesMessage}")) { break; diff --git a/src/Main/Base/Project/Src/Project/BuildEngine.cs b/src/Main/Base/Project/Src/Project/BuildEngine.cs index 8c77acc14a..68bcceb99d 100644 --- a/src/Main/Base/Project/Src/Project/BuildEngine.cs +++ b/src/Main/Base/Project/Src/Project/BuildEngine.cs @@ -333,7 +333,7 @@ namespace ICSharpCode.SharpDevelop.Project node.options.Platform = options.SolutionPlatform; // copy properties to project options - options.GlobalAdditionalProperties.Foreach(node.options.Properties.Add); + options.GlobalAdditionalProperties.ForEach(node.options.Properties.Add); if (project == rootProject) { foreach (var pair in options.ProjectAdditionalProperties) { node.options.Properties[pair.Key] = pair.Value; @@ -604,7 +604,7 @@ namespace ICSharpCode.SharpDevelop.Project } } if (messagesToReport != null) { - messagesToReport.Foreach(ReportMessageInternal); + messagesToReport.ForEach(ReportMessageInternal); } if (newNodeWithOutputLockAlreadyFinishedBuilding) { // if the node already finished building before it got the output lock, we need diff --git a/src/Main/Base/Project/Src/Project/BuildOptions.cs b/src/Main/Base/Project/Src/Project/BuildOptions.cs index 5f5587ce5b..28b4d19a64 100644 --- a/src/Main/Base/Project/Src/Project/BuildOptions.cs +++ b/src/Main/Base/Project/Src/Project/BuildOptions.cs @@ -61,7 +61,7 @@ namespace ICSharpCode.SharpDevelop.Project public static int DefaultParallelProjectCount { get { - return PropertyService.Get("SharpDevelop.BuildParallelProjectCount", Environment.ProcessorCount >= 2 ? 2: 1); + return PropertyService.Get("SharpDevelop.BuildParallelProjectCount", Math.Min(4, Environment.ProcessorCount)); } set { PropertyService.Set("SharpDevelop.BuildParallelProjectCount", value); diff --git a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs index d120c8f547..d8eb0c3496 100644 --- a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs +++ b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs @@ -22,7 +22,7 @@ namespace ICSharpCode.SharpDevelop /// /// Runs an action for all elements in the input. /// - public static void Foreach(this IEnumerable input, Action action) + public static void ForEach(this IEnumerable input, Action action) { if (input == null) throw new ArgumentNullException("input"); @@ -31,6 +31,12 @@ namespace ICSharpCode.SharpDevelop } } + [Obsolete("Use ForEach instead.")] + public static void Foreach(this IEnumerable input, Action action) + { + ForEach(input, action); + } + /// /// Adds all to . /// diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ExtensionMethods.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ExtensionMethods.cs index 05743586b8..8dae354a21 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ExtensionMethods.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ExtensionMethods.cs @@ -29,6 +29,12 @@ namespace ICSharpCode.SharpDevelop.Dom list.Add(o); } + /// + /// Converts a recursive data structure into a flat list. + /// + /// The root elements of the recursive data structure. + /// The function that gets the children of an element. + /// Iterator that enumerates the tree structure in preorder. public static IEnumerable Flatten(this IEnumerable input, Func> recursion) { Stack> stack = new Stack>(); From 24b1a71f099f8fd119950a5ccc1310df09635513 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 16 Jan 2009 12:58:09 +0000 Subject: [PATCH 17/68] Fixed bug introduced in revision 3744 (see SD2-1383) git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3750 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../WinFormsUI/Docking/VS2005DockPaneStrip.cs | 33 +++++-------------- src/Libraries/DockPanel_Src/patchnotes.txt | 3 +- 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/src/Libraries/DockPanel_Src/WinFormsUI/Docking/VS2005DockPaneStrip.cs b/src/Libraries/DockPanel_Src/WinFormsUI/Docking/VS2005DockPaneStrip.cs index e0e8470225..30abcd2154 100644 --- a/src/Libraries/DockPanel_Src/WinFormsUI/Docking/VS2005DockPaneStrip.cs +++ b/src/Libraries/DockPanel_Src/WinFormsUI/Docking/VS2005DockPaneStrip.cs @@ -308,26 +308,7 @@ namespace WeifenLuo.WinFormsUI.Docking return textFormat; } } - - private StringFormat ToolWindowStringFormat - { - get - { - StringFormat format = new StringFormat(); - format.Alignment = StringAlignment.Center; - format.LineAlignment = StringAlignment.Center; - format.FormatFlags = StringFormatFlags.NoWrap | StringFormatFlags.NoClip; - format.Trimming = StringTrimming.EllipsisPath; - - if (RightToLeft == RightToLeft.Yes) { - format.FormatFlags |= StringFormatFlags.DirectionRightToLeft; - format.LineAlignment = StringAlignment.Near; - } - - return format; - } - } - + private static int DocumentStripGapTop { get { return _DocumentStripGapTop; } @@ -870,7 +851,11 @@ namespace WeifenLuo.WinFormsUI.Docking int height = GetTabRectangle_Document(index).Height; - Size sizeText = TextRenderer.MeasureText(content.DockHandler.TabText, BoldFont, new Size(DocumentTabMaxWidth, height), DocumentTextFormat); + Size sizeText; + using (Graphics g = CreateGraphics()) { + SizeF sizeTextF = g.MeasureString(content.DockHandler.TabText, BoldFont, new Size(DocumentTabMaxWidth, height), DocumentStringFormat); + sizeText = new Size((int)Math.Ceiling(sizeTextF.Width), (int)Math.Ceiling(sizeTextF.Height)); + } if (DockPane.DockPanel.ShowDocumentIcon) return sizeText.Width + DocumentIconWidth + DocumentIconGapLeft + DocumentIconGapRight + DocumentTextGapRight; @@ -1080,8 +1065,7 @@ namespace WeifenLuo.WinFormsUI.Docking { g.FillPath(BrushToolWindowActiveBackground, path); g.DrawPath(PenToolWindowTabBorder, path); - using (SolidBrush brush = new SolidBrush(ColorToolWindowActiveText)) - g.DrawString(tab.Content.DockHandler.TabText, TextFont, brush, rectText, ToolWindowStringFormat); + TextRenderer.DrawText(g, tab.Content.DockHandler.TabText, TextFont, rectText, ColorToolWindowActiveText, ToolWindowTextFormat); } else { @@ -1091,8 +1075,7 @@ namespace WeifenLuo.WinFormsUI.Docking Point pt2 = new Point(rect.Right, rect.Bottom - ToolWindowTabSeperatorGapBottom); g.DrawLine(PenToolWindowTabBorder, DrawHelper.RtlTransform(this, pt1), DrawHelper.RtlTransform(this, pt2)); } - using (SolidBrush brush = new SolidBrush(ColorToolWindowInactiveText)) - g.DrawString(tab.Content.DockHandler.TabText, TextFont, brush, rectText, ToolWindowStringFormat); + TextRenderer.DrawText(g, tab.Content.DockHandler.TabText, TextFont, rectText, ColorToolWindowInactiveText, ToolWindowTextFormat); } if (rectTab.Contains(rectIcon)) diff --git a/src/Libraries/DockPanel_Src/patchnotes.txt b/src/Libraries/DockPanel_Src/patchnotes.txt index 412402e291..ec7c56ba85 100644 --- a/src/Libraries/DockPanel_Src/patchnotes.txt +++ b/src/Libraries/DockPanel_Src/patchnotes.txt @@ -32,4 +32,5 @@ Patch #5: Patch #6: In VS2005DockPaneStrip.cs: fixed SD2-1383 - Committed in revision 3744. \ No newline at end of file + Committed in revision 3744. + Bug introduced in patch was fixed in revision 3750. From c7c5017022c609026e5f6c41d0c360625f6c5473 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 16 Jan 2009 14:37:18 +0000 Subject: [PATCH 18/68] Change base class of ToolBarCommand from ToolStripMenuItem to ToolStripButton. This fixes the bug forum-8878 (focus rectangle is drawn for disabled toolbar buttons). git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3751 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/Main/ICSharpCode.Core.WinForms/ToolBar/ToolBarCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Main/ICSharpCode.Core.WinForms/ToolBar/ToolBarCommand.cs b/src/Main/ICSharpCode.Core.WinForms/ToolBar/ToolBarCommand.cs index 2bb2b669c1..b9ed747ab6 100644 --- a/src/Main/ICSharpCode.Core.WinForms/ToolBar/ToolBarCommand.cs +++ b/src/Main/ICSharpCode.Core.WinForms/ToolBar/ToolBarCommand.cs @@ -10,7 +10,7 @@ using System.Windows.Forms; namespace ICSharpCode.Core.WinForms { - public class ToolBarCommand : ToolStripMenuItem, IStatusUpdate + public class ToolBarCommand : ToolStripButton, IStatusUpdate { object caller; Codon codon; From 653e996b6f307edd01c85589557b390c5a15d443 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 17 Jan 2009 18:11:22 +0000 Subject: [PATCH 19/68] Fixed SD2-1477 - Unable to save project settings in .user file. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3753 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../ProjectOptions/AbstractBuildOptions.cs | 4 +- .../Project/Src/Project/AbstractProject.cs | 20 +- .../Project/Src/Project/CompilableProject.cs | 12 +- .../Src/Project/MSBuildBasedProject.cs | 325 ++++++++++++------ .../Project/Src/Project/MSBuildInternals.cs | 13 +- .../Project/Src/Project/Solution/Solution.cs | 11 +- 6 files changed, 259 insertions(+), 126 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AbstractBuildOptions.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AbstractBuildOptions.cs index fd52f30e34..5087cc5faa 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AbstractBuildOptions.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AbstractBuildOptions.cs @@ -243,7 +243,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels ComboBox targetFrameworkComboBox = (ComboBox)ControlDictionary["targetFrameworkComboBox"]; if (convertProjectToMSBuild35Button != null) { - if (project.MinimumSolutionVersion == Solution.SolutionVersionVS05) { + if (project.MinimumSolutionVersion == Solution.SolutionVersionVS2005) { // VS05 project targetFrameworkComboBox.Enabled = false; convertProjectToMSBuild35Button.Click += OnConvertProjectToMSBuild35ButtonClick; @@ -284,7 +284,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels } else { project.ConvertToMSBuild35(dlg.ChangeTargetFramework); } - if (project.MinimumSolutionVersion == Solution.SolutionVersionVS05) + if (project.MinimumSolutionVersion == Solution.SolutionVersionVS2005) throw new InvalidOperationException("Project did not convert to MSBuild 3.5"); ProjectService.SaveSolution(); InitTargetFramework(); diff --git a/src/Main/Base/Project/Src/Project/AbstractProject.cs b/src/Main/Base/Project/Src/Project/AbstractProject.cs index cf65ce3235..836919d2a1 100644 --- a/src/Main/Base/Project/Src/Project/AbstractProject.cs +++ b/src/Main/Base/Project/Src/Project/AbstractProject.cs @@ -455,7 +455,7 @@ namespace ICSharpCode.SharpDevelop.Project [Browsable(false)] public virtual int MinimumSolutionVersion { - get { return Solution.SolutionVersionVS05; } + get { return Solution.SolutionVersionVS2005; } } public virtual void ResolveAssemblyReferences() @@ -471,19 +471,21 @@ namespace ICSharpCode.SharpDevelop.Project public virtual ICollection GetBuildDependencies(ProjectBuildOptions buildOptions) { - List result = new List(); - foreach (ProjectSection section in this.ProjectSections) { - if (section.Name == "ProjectDependencies") { - foreach (SolutionItem item in section.Items) { - foreach (IProject p in ParentSolution.Projects) { - if (p.IdGuid == item.Name) { - result.Add(p); + lock (SyncRoot) { + List result = new List(); + foreach (ProjectSection section in this.ProjectSections) { + if (section.Name == "ProjectDependencies") { + foreach (SolutionItem item in section.Items) { + foreach (IProject p in ParentSolution.Projects) { + if (p.IdGuid == item.Name) { + result.Add(p); + } } } } } + return result; } - return result; } } } diff --git a/src/Main/Base/Project/Src/Project/CompilableProject.cs b/src/Main/Base/Project/Src/Project/CompilableProject.cs index 8f4b16901c..f79ce3251e 100644 --- a/src/Main/Base/Project/Src/Project/CompilableProject.cs +++ b/src/Main/Base/Project/Src/Project/CompilableProject.cs @@ -359,11 +359,13 @@ namespace ICSharpCode.SharpDevelop.Project protected override void OnPropertyChanged(ProjectPropertyChangedEventArgs e) { base.OnPropertyChanged(e); - if (reparseReferencesSensitiveProperties.Contains(e.PropertyName)) { - ParserService.Reparse(this, true, false); - } - if (reparseCodeSensitiveProperties.Contains(e.PropertyName)) { - ParserService.Reparse(this, false, true); + if (!isLoading) { + if (reparseReferencesSensitiveProperties.Contains(e.PropertyName)) { + ParserService.Reparse(this, true, false); + } + if (reparseCodeSensitiveProperties.Contains(e.PropertyName)) { + ParserService.Reparse(this, false, true); + } } } diff --git a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs index 1f5c04850a..2a4644b395 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs @@ -22,6 +22,10 @@ namespace ICSharpCode.SharpDevelop.Project { /// /// A project that is based on an MSBuild project file. + /// + /// Thread-safety: most members are thread-safe, but direct accesses on the underlying MSBuildProject + /// require locking on the SyncRoot. Methods that return underlying MSBuild objects require that + /// the caller locks on the SyncRoot. /// public class MSBuildBasedProject : AbstractProject, IProjectItemListProvider, IProjectAllowChangeConfigurations { @@ -30,6 +34,11 @@ namespace ICSharpCode.SharpDevelop.Project /// MSBuild.Project project; + /// + /// The '.user' part of the project. + /// + MSBuild.Project userProject; + /// /// A list of project properties that are saved after the normal properties. /// Use this for properties that could reference other properties, e.g. @@ -45,6 +54,7 @@ namespace ICSharpCode.SharpDevelop.Project if (engine == null) throw new ArgumentNullException("engine"); this.project = engine.CreateNewProject(); + this.userProject = engine.CreateNewProject(); } /// @@ -60,6 +70,9 @@ namespace ICSharpCode.SharpDevelop.Project base.Dispose(); // unload evaluatingTempProject if necessary: MSBuildInternals.EnsureCorrectTempProject(project, null, null, ref evaluatingTempProject); + // unload project + userProject: + project.ParentEngine.UnloadProject(project); + userProject.ParentEngine.UnloadProject(userProject); } public override int MinimumSolutionVersion { @@ -68,9 +81,9 @@ namespace ICSharpCode.SharpDevelop.Project if (string.IsNullOrEmpty(project.DefaultToolsVersion) || project.DefaultToolsVersion == "2.0") { - return Solution.SolutionVersionVS05; + return Solution.SolutionVersionVS2005; } else { - return Solution.SolutionVersionVS08; + return Solution.SolutionVersionVS2008; } } } @@ -195,8 +208,10 @@ namespace ICSharpCode.SharpDevelop.Project /// protected void AddImport(string projectFile, string condition) { - project.AddNewImport(projectFile, condition); - CreateItemsListFromMSBuild(); + lock (SyncRoot) { + project.AddNewImport(projectFile, condition); + CreateItemsListFromMSBuild(); + } } #endregion @@ -317,14 +332,19 @@ namespace ICSharpCode.SharpDevelop.Project protected bool EvaluateMSBuildCondition(string configuration, string platform, string condition) { - return MSBuildInternals.EvaluateCondition(project, configuration, platform, condition, - ref evaluatingTempProject); + lock (SyncRoot) { + return MSBuildInternals.EvaluateCondition(project, configuration, platform, condition, + ref evaluatingTempProject); + } } /// /// Finds the BuildProperty object used to store /// in the specified configuration/platform. /// + /// + /// Warning: you need to lock(project.SyncRoot) around calls to GetAllProperties + /// until you no longer need to access the BuildProperty objects! /// The configuration to use. /// The platform to use. /// The property to look for. @@ -339,6 +359,31 @@ namespace ICSharpCode.SharpDevelop.Project if (string.IsNullOrEmpty(configuration)) configuration = ActiveConfiguration; if (string.IsNullOrEmpty(platform)) platform = ActivePlatform; + // First try main project file + MSBuild.BuildProperty p = FindPropertyObjectInternal(project, configuration, platform, propertyName, out group); + if (p != null) { + location = MSBuildInternals.GetLocationFromCondition(group.Condition); + return p; + } else { + // try user project file + p = FindPropertyObjectInternal(userProject, configuration, platform, propertyName, out group); + if (p != null) { + location = PropertyStorageLocations.UserFile + | MSBuildInternals.GetLocationFromCondition(group.Condition); + return p; + } else { + location = PropertyStorageLocations.Unknown; + group = null; + return null; + } + } + } + + MSBuild.BuildProperty FindPropertyObjectInternal(MSBuild.Project project, + string configuration, string platform, + string propertyName, + out MSBuild.BuildPropertyGroup group) + { // We need to use ToList because EvaluateMSBuildCondition invalidates the list // of property groups. foreach (MSBuild.BuildPropertyGroup g @@ -351,13 +396,10 @@ namespace ICSharpCode.SharpDevelop.Project if (property == null) continue; if (EvaluateMSBuildCondition(configuration, platform, g.Condition)) { - location = MSBuildInternals.GetLocationFromCondition(g.Condition); group = g; return property; } } - - location = PropertyStorageLocations.Unknown; group = null; return null; } @@ -370,8 +412,16 @@ namespace ICSharpCode.SharpDevelop.Project /// Platform filter. Only use properties from this platform. /// Use null to allow properties from all platforms. /// The name of the property - string GetAnyUnevaluatedPropertyValue(string configuration, string platform, - string propertyName) + string GetAnyUnevaluatedPropertyValue(string configuration, string platform, string propertyName) + { + // first try main project file, then try user project file + MSBuild.BuildProperty p = GetAnyUnevaluatedProperty(project, configuration, platform, propertyName); + if (p == null) + p = GetAnyUnevaluatedProperty(userProject, configuration, platform, propertyName); + return p != null ? p.Value : null; + } + + static MSBuild.BuildProperty GetAnyUnevaluatedProperty(MSBuild.Project project, string configuration, string platform, string propertyName) { foreach (MSBuild.BuildPropertyGroup g in project.PropertyGroups) { if (g.IsImported) { @@ -387,7 +437,7 @@ namespace ICSharpCode.SharpDevelop.Project if ((configuration == null || configuration == gConfiguration || gConfiguration == null) && (platform == null || platform == gPlatform || gPlatform == null)) { - return property.Value; + return property; } } return null; @@ -395,6 +445,9 @@ namespace ICSharpCode.SharpDevelop.Project /// /// Get all instances of the specified property. + /// + /// Warning: you need to lock(project.SyncRoot) around calls to GetAllProperties + /// until you no longer need to access the BuildProperty objects! /// public IList GetAllProperties(string propertyName) { @@ -406,6 +459,13 @@ namespace ICSharpCode.SharpDevelop.Project l.Add(property); } } + foreach (MSBuild.BuildPropertyGroup g in userProject.PropertyGroups) { + if (g.IsImported) continue; + MSBuild.BuildProperty property = MSBuildInternals.GetProperty(g, propertyName); + if (property != null) { + l.Add(property); + } + } return l; } #endregion @@ -432,6 +492,13 @@ namespace ICSharpCode.SharpDevelop.Project return MSBuildInternals.GetLocationFromCondition(g.Condition); } } + foreach (MSBuild.BuildPropertyGroup g in userProject.PropertyGroups) { + if (g.IsImported) continue; + if (MSBuildInternals.GetProperty(g, propertyName) != null) { + return PropertyStorageLocations.UserFile | + MSBuildInternals.GetLocationFromCondition(g.Condition); + } + } return PropertyStorageLocations.Unknown; } @@ -513,12 +580,19 @@ namespace ICSharpCode.SharpDevelop.Project if (location == PropertyStorageLocations.Unchanged) { location = oldLocation; } + // determine the insertion position for the property MSBuild.PropertyPosition propertyInsertionPosition; if (saveAfterImportsProperties.Contains(propertyName)) { propertyInsertionPosition = MSBuild.PropertyPosition.UseExistingOrCreateAfterLastImport; } else { propertyInsertionPosition = MSBuild.PropertyPosition.UseExistingOrCreateAfterLastPropertyGroup; } + // get the project file where the property should be stored + MSBuild.Project targetProject; + if ((location & PropertyStorageLocations.UserFile) == PropertyStorageLocations.UserFile) + targetProject = userProject; + else + targetProject = project; if (oldLocation != location) { // move existing properties to new location, then use the normal property @@ -542,10 +616,10 @@ namespace ICSharpCode.SharpDevelop.Project // Recreate the property using the saved value foreach (KeyValuePair pair in oldValuesConf) { if (pair.Value != null) { - project.SetProperty(propertyName, pair.Value, - CreateCondition(pair.Key, null, location), - propertyInsertionPosition, - false); + targetProject.SetProperty(propertyName, pair.Value, + CreateCondition(pair.Key, null, location), + propertyInsertionPosition, + false); } } break; @@ -562,10 +636,10 @@ namespace ICSharpCode.SharpDevelop.Project // Recreate the property using the saved value foreach (KeyValuePair pair in oldValuesPlat) { if (pair.Value != null) { - project.SetProperty(propertyName, pair.Value, - CreateCondition(null, pair.Key, location), - propertyInsertionPosition, - false); + targetProject.SetProperty(propertyName, pair.Value, + CreateCondition(null, pair.Key, location), + propertyInsertionPosition, + false); } } break; @@ -584,10 +658,10 @@ namespace ICSharpCode.SharpDevelop.Project // Recreate the property using the saved value foreach (KeyValuePair pair in oldValues) { if (pair.Value != null) { - project.SetProperty(propertyName, pair.Value, - CreateCondition(pair.Key.First, pair.Key.Second, location), - propertyInsertionPosition, - false); + targetProject.SetProperty(propertyName, pair.Value, + CreateCondition(pair.Key.First, pair.Key.Second, location), + propertyInsertionPosition, + false); } } break; @@ -596,11 +670,12 @@ namespace ICSharpCode.SharpDevelop.Project } // update existingProperty and existingPropertyGroup after the move operation + PropertyStorageLocations tmpLocation; existingProperty = FindPropertyObject(configuration, platform, propertyName, out existingPropertyGroup, - out oldLocation); + out tmpLocation); } ProjectPropertyChangedEventArgs args; args = new ProjectPropertyChangedEventArgs(propertyName); @@ -618,20 +693,20 @@ namespace ICSharpCode.SharpDevelop.Project existingPropertyGroup.RemoveProperty(existingProperty); if (existingPropertyGroup.Count == 0) { - project.RemovePropertyGroup(existingPropertyGroup); + targetProject.RemovePropertyGroup(existingPropertyGroup); } } } else if (existingPropertyGroup != null && existingProperty != null) { args.OldValue = existingProperty.Value; - project.SetProperty(propertyName, newValue, - existingPropertyGroup.Condition, - propertyInsertionPosition, - treatPropertyValueAsLiteral); + targetProject.SetProperty(propertyName, newValue, + existingPropertyGroup.Condition, + propertyInsertionPosition, + treatPropertyValueAsLiteral); } else { - project.SetProperty(propertyName, newValue, - CreateCondition(configuration, platform, location), - propertyInsertionPosition, - treatPropertyValueAsLiteral); + targetProject.SetProperty(propertyName, newValue, + CreateCondition(configuration, platform, location), + propertyInsertionPosition, + treatPropertyValueAsLiteral); } return args; } @@ -640,6 +715,12 @@ namespace ICSharpCode.SharpDevelop.Project /// Removes the property from all configurations and platforms. /// void RemovePropertyCompletely(string propertyName) + { + RemovePropertyCompletely(project, propertyName); + RemovePropertyCompletely(userProject, propertyName); + } + + static void RemovePropertyCompletely(MSBuild.Project project, string propertyName) { List emptiedGroups = new List(); foreach (MSBuild.BuildPropertyGroup g in project.PropertyGroups) { @@ -752,8 +833,9 @@ namespace ICSharpCode.SharpDevelop.Project items.Add(CreateProjectItem(item)); } + + ClearFindFileCache(); } - ClearFindFileCache(); } void IProjectItemListProvider.AddProjectItem(ProjectItem item) @@ -890,59 +972,76 @@ namespace ICSharpCode.SharpDevelop.Project protected virtual void LoadProject(string fileName) { - isLoading = true; - try { - this.FileName = fileName; - - InitializeMSBuildProject(project); - + lock (SyncRoot) { + isLoading = true; try { - project.Load(fileName); - } catch (MSBuild.InvalidProjectFileException ex) { - LoggingService.Warn(ex); - LoggingService.Warn("ErrorCode = " + ex.ErrorCode); - bool isVS2003ProjectWithInvalidEncoding = false; - if (ex.ErrorCode == "MSB4025") { - // Invalid XML. - // This MIGHT be a VS2003 project in default encoding, so we have to use this - // ugly trick to detect old-style projects - using (StreamReader r = File.OpenText(fileName)) { - if (r.ReadLine() == "") { - isVS2003ProjectWithInvalidEncoding = true; - } + LoadProjectInternal(fileName); + } finally { + isLoading = false; + } + } + } + + void LoadProjectInternal(string fileName) + { + this.FileName = fileName; + + InitializeMSBuildProject(project); + + try { + project.Load(fileName); + } catch (MSBuild.InvalidProjectFileException ex) { + LoggingService.Warn(ex); + LoggingService.Warn("ErrorCode = " + ex.ErrorCode); + bool isVS2003ProjectWithInvalidEncoding = false; + if (ex.ErrorCode == "MSB4025") { + // Invalid XML. + // This MIGHT be a VS2003 project in default encoding, so we have to use this + // ugly trick to detect old-style projects + using (StreamReader r = File.OpenText(fileName)) { + if (r.ReadLine() == "") { + isVS2003ProjectWithInvalidEncoding = true; } } - if (ex.ErrorCode == "MSB4075" || isVS2003ProjectWithInvalidEncoding) { - // MSB4075 is: - // "The project file must be opened in VS IDE and converted to latest version - // before it can be build by MSBuild." - try { - Converter.PrjxToSolutionProject.ConvertVSNetProject(fileName); - project.Load(fileName); - } catch (System.Xml.XmlException ex2) { - throw new ProjectLoadException(ex2.Message, ex2); - } catch (MSBuild.InvalidProjectFileException ex2) { - throw new ProjectLoadException(ex2.Message, ex2); - } - } else { - throw new ProjectLoadException(ex.Message, ex); + } + if (ex.ErrorCode == "MSB4075" || isVS2003ProjectWithInvalidEncoding) { + // MSB4075 is: + // "The project file must be opened in VS IDE and converted to latest version + // before it can be build by MSBuild." + try { + Converter.PrjxToSolutionProject.ConvertVSNetProject(fileName); + project.Load(fileName); + } catch (System.Xml.XmlException ex2) { + throw new ProjectLoadException(ex2.Message, ex2); + } catch (MSBuild.InvalidProjectFileException ex2) { + throw new ProjectLoadException(ex2.Message, ex2); } + } else { + throw new ProjectLoadException(ex.Message, ex); + } + } + + string userFileName = fileName + ".user"; + if (File.Exists(userFileName)) { + try { + userProject.Load(userFileName); + } catch (MSBuild.InvalidProjectFileException ex) { + throw new ProjectLoadException("Error loading user part " + userFileName + ":\n" + ex.Message); } - this.ActiveConfiguration = GetEvaluatedProperty("Configuration") ?? this.ActiveConfiguration; - this.ActivePlatform = GetEvaluatedProperty("Platform") ?? this.ActivePlatform; - - // Some projects do not specify default configuration/platform, so we have to set - // Configuration and Platform in the global properties to be sure these properties exist - project.GlobalProperties.SetProperty("Configuration", this.ActiveConfiguration, true); - project.GlobalProperties.SetProperty("Platform", this.ActivePlatform, true); - - CreateItemsListFromMSBuild(); - LoadConfigurationPlatformNamesFromMSBuild(); - - base.IdGuid = GetEvaluatedProperty(ProjectGuidPropertyName); - } finally { - isLoading = false; } + + this.ActiveConfiguration = GetEvaluatedProperty("Configuration") ?? this.ActiveConfiguration; + this.ActivePlatform = GetEvaluatedProperty("Platform") ?? this.ActivePlatform; + + // Some projects do not specify default configuration/platform, so we have to set + // Configuration and Platform in the global properties to be sure these properties exist + project.GlobalProperties.SetProperty("Configuration", this.ActiveConfiguration, true); + project.GlobalProperties.SetProperty("Platform", this.ActivePlatform, true); + + CreateItemsListFromMSBuild(); + LoadConfigurationPlatformNamesFromMSBuild(); + + base.IdGuid = GetEvaluatedProperty(ProjectGuidPropertyName); } [Browsable(false)] @@ -955,7 +1054,10 @@ namespace ICSharpCode.SharpDevelop.Project try { // save fixed project project.Save(this.FileName); - } catch {} + } catch (IOException) { + } catch (AccessViolationException) { + // Ignore errors writing the fixed project file + } } base.IdGuid = value; } @@ -967,6 +1069,11 @@ namespace ICSharpCode.SharpDevelop.Project { lock (SyncRoot) { project.Save(fileName); + bool userProjectDirty = userProject.IsDirty; + string userFile = fileName + ".user"; + if (File.Exists(userFile) || userProject.PropertyGroups.Count > 0) { + userProject.Save(userFile); + } } } #endregion @@ -1000,19 +1107,23 @@ namespace ICSharpCode.SharpDevelop.Project public override ICollection ConfigurationNames { get { - if (configurationNames == null) { - LoadConfigurationPlatformNamesFromMSBuild(); + lock (SyncRoot) { + if (configurationNames == null) { + LoadConfigurationPlatformNamesFromMSBuild(); + } + return configurationNames; } - return configurationNames; } } public override ICollection PlatformNames { get { - if (platformNames == null) { - LoadConfigurationPlatformNamesFromMSBuild(); + lock (SyncRoot) { + if (platformNames == null) { + LoadConfigurationPlatformNamesFromMSBuild(); + } + return platformNames; } - return platformNames; } } @@ -1025,6 +1136,25 @@ namespace ICSharpCode.SharpDevelop.Project Set configurationNames = new Set(); Set platformNames = new Set(); + LoadConfigurationPlatformNamesFromMSBuildInternal(project, configurationNames, platformNames); + LoadConfigurationPlatformNamesFromMSBuildInternal(userProject, configurationNames, platformNames); + + if (configurationNames.Count == 0) { + configurationNames.Add("Debug"); + configurationNames.Add("Release"); + } + if (platformNames.Count == 0) { + platformNames.Add("AnyCPU"); + } + + this.configurationNames = configurationNames.AsReadOnly(); + this.platformNames = platformNames.AsReadOnly(); + } + + static void LoadConfigurationPlatformNamesFromMSBuildInternal( + MSBuild.Project project, + Set configurationNames, Set platformNames) + { foreach (MSBuild.BuildPropertyGroup g in project.PropertyGroups) { if (g.IsImported) { continue; @@ -1037,11 +1167,9 @@ namespace ICSharpCode.SharpDevelop.Project if (prop != null && !string.IsNullOrEmpty(prop.FinalValue)) { platformNames.Add(prop.FinalValue); } - + string gConfiguration, gPlatform; - MSBuildInternals.GetConfigurationAndPlatformFromCondition(g.Condition, - out gConfiguration, - out gPlatform); + MSBuildInternals.GetConfigurationAndPlatformFromCondition(g.Condition, out gConfiguration, out gPlatform); if (gConfiguration != null) { configurationNames.Add(gConfiguration); } @@ -1049,17 +1177,6 @@ namespace ICSharpCode.SharpDevelop.Project platformNames.Add(gPlatform); } } - - if (configurationNames.Count == 0) { - configurationNames.Add("Debug"); - configurationNames.Add("Release"); - } - if (platformNames.Count == 0) { - platformNames.Add("AnyCPU"); - } - - this.configurationNames = configurationNames.AsReadOnly(); - this.platformNames = platformNames.AsReadOnly(); } #endregion diff --git a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs index 4b3a79a8b8..0f3860da8c 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs @@ -308,6 +308,11 @@ namespace ICSharpCode.SharpDevelop.Project } static void EndXmlManipulation(MSBuild.Project project) + { + MarkProjectAsDirtyForReprocessXml(project); + } + + internal static void MarkProjectAsDirtyForReprocessXml(MSBuild.Project project) { typeof(MSBuild.Project).InvokeMember( "MarkProjectAsDirtyForReprocessXml", @@ -318,14 +323,14 @@ namespace ICSharpCode.SharpDevelop.Project internal static void ResolveAssemblyReferences(MSBuildBasedProject baseProject, ReferenceProjectItem[] referenceReplacements) { - MSBuild.Engine engine; + MSBuild.Engine tempEngine; MSBuild.Project tempProject; IEnumerable references; lock (baseProject.SyncRoot) { // create a copy of the project - engine = CreateEngine(); - tempProject = engine.CreateNewProject(); + tempEngine = CreateEngine(); + tempProject = tempEngine.CreateNewProject(); // tell MSBuild the path so that projects containing // can be loaded tempProject.FullFileName = baseProject.MSBuildProject.FullFileName; @@ -402,6 +407,8 @@ namespace ICSharpCode.SharpDevelop.Project LoggingService.Warn("Unknown item " + originalInclude); } } + + tempEngine.UnloadAllProjects(); // unload temp project } } } diff --git a/src/Main/Base/Project/Src/Project/Solution/Solution.cs b/src/Main/Base/Project/Src/Project/Solution/Solution.cs index 01110f718e..a92d5d2dcc 100644 --- a/src/Main/Base/Project/Src/Project/Solution/Solution.cs +++ b/src/Main/Base/Project/Src/Project/Solution/Solution.cs @@ -28,7 +28,12 @@ namespace ICSharpCode.SharpDevelop.Project public class Solution : SolutionFolder, IDisposable, IMSBuildEngineProvider, IBuildable { + public const int SolutionVersionVS2005 = 9; + public const int SolutionVersionVS2008 = 10; + + [Obsolete("Use SolutionVersionVS2005 instead")] public const int SolutionVersionVS05 = 9; + [Obsolete("Use SolutionVersionVS2008 instead")] public const int SolutionVersionVS08 = 10; /// contains <GUID, (IProject/ISolutionFolder)> pairs. @@ -351,16 +356,16 @@ namespace ICSharpCode.SharpDevelop.Project // we need to specify UTF8 because MSBuild needs the BOM using (StreamWriter sw = new StreamWriter(fileName, false, Encoding.UTF8)) { sw.WriteLine(); - int versionNumber = SolutionVersionVS05; + int versionNumber = SolutionVersionVS2005; foreach (IProject p in this.Projects) { if (p.MinimumSolutionVersion > versionNumber) versionNumber = p.MinimumSolutionVersion; } sw.WriteLine("Microsoft Visual Studio Solution File, Format Version " + versionNumber + ".00"); - if (versionNumber == SolutionVersionVS05) { + if (versionNumber == SolutionVersionVS2005) { sw.WriteLine("# Visual Studio 2005"); - } else if (versionNumber == SolutionVersionVS08) { + } else if (versionNumber == SolutionVersionVS2008) { sw.WriteLine("# Visual Studio 2008"); } sw.WriteLine("# SharpDevelop " + RevisionClass.FullVersion); From e8edfd0864ce41486c4937fdf2dd9a80935d3cd1 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 17 Jan 2009 19:05:51 +0000 Subject: [PATCH 20/68] Fixed updating properties in .user file. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3754 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Project/MSBuildBasedProject.cs | 79 ++++++++++--------- .../LanguageBindingDescriptor.cs | 1 + 2 files changed, 44 insertions(+), 36 deletions(-) diff --git a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs index 2a4644b395..a36273f229 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs @@ -9,14 +9,14 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; -using System.Linq; using System.IO; +using System.Linq; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Internal.Templates; using MSBuild = Microsoft.Build.BuildEngine; -using StringPair = ICSharpCode.SharpDevelop.Pair; +using StringPair = ICSharpCode.SharpDevelop.Pair; namespace ICSharpCode.SharpDevelop.Project { @@ -616,10 +616,10 @@ namespace ICSharpCode.SharpDevelop.Project // Recreate the property using the saved value foreach (KeyValuePair pair in oldValuesConf) { if (pair.Value != null) { - targetProject.SetProperty(propertyName, pair.Value, - CreateCondition(pair.Key, null, location), - propertyInsertionPosition, - false); + MSBuildSetProperty(targetProject, propertyName, pair.Value, + CreateCondition(pair.Key, null, location), + propertyInsertionPosition, + false); } } break; @@ -636,10 +636,10 @@ namespace ICSharpCode.SharpDevelop.Project // Recreate the property using the saved value foreach (KeyValuePair pair in oldValuesPlat) { if (pair.Value != null) { - targetProject.SetProperty(propertyName, pair.Value, - CreateCondition(null, pair.Key, location), - propertyInsertionPosition, - false); + MSBuildSetProperty(targetProject, propertyName, pair.Value, + CreateCondition(null, pair.Key, location), + propertyInsertionPosition, + false); } } break; @@ -658,10 +658,10 @@ namespace ICSharpCode.SharpDevelop.Project // Recreate the property using the saved value foreach (KeyValuePair pair in oldValues) { if (pair.Value != null) { - targetProject.SetProperty(propertyName, pair.Value, - CreateCondition(pair.Key.First, pair.Key.Second, location), - propertyInsertionPosition, - false); + MSBuildSetProperty(targetProject, propertyName, pair.Value, + CreateCondition(pair.Key.First, pair.Key.Second, location), + propertyInsertionPosition, + false); } } break; @@ -687,30 +687,44 @@ namespace ICSharpCode.SharpDevelop.Project args.NewValue = treatPropertyValueAsLiteral ? MSBuildInternals.Escape(newValue) : newValue; } - if (newValue == null) { - if (existingPropertyGroup != null && existingProperty != null) { - args.OldValue = existingProperty.Value; - + if (existingPropertyGroup != null && existingProperty != null) { + // update or delete existing property + args.OldValue = existingProperty.Value; + MSBuildSetProperty(targetProject, propertyName, newValue ?? "", + existingPropertyGroup.Condition, + propertyInsertionPosition, + treatPropertyValueAsLiteral); + if (newValue == null) { + // delete existing property existingPropertyGroup.RemoveProperty(existingProperty); + if (existingPropertyGroup.Count == 0) { targetProject.RemovePropertyGroup(existingPropertyGroup); } } - } else if (existingPropertyGroup != null && existingProperty != null) { - args.OldValue = existingProperty.Value; - targetProject.SetProperty(propertyName, newValue, - existingPropertyGroup.Condition, - propertyInsertionPosition, - treatPropertyValueAsLiteral); - } else { - targetProject.SetProperty(propertyName, newValue, - CreateCondition(configuration, platform, location), - propertyInsertionPosition, - treatPropertyValueAsLiteral); + } else if (newValue != null) { + // create new property + MSBuildSetProperty(targetProject, propertyName, newValue, + CreateCondition(configuration, platform, location), + propertyInsertionPosition, + treatPropertyValueAsLiteral); } return args; } + void MSBuildSetProperty(MSBuild.Project targetProject, string propertyName, string newValue, + string groupCondition, MSBuild.PropertyPosition position, + bool treatPropertyValueAsLiteral) + { + if (targetProject == project) { + project.SetProperty(propertyName, newValue, groupCondition, position, treatPropertyValueAsLiteral); + } else if (targetProject == userProject) { + project.SetImportedProperty(propertyName, newValue, groupCondition, userProject, position, treatPropertyValueAsLiteral); + } else { + throw new ArgumentException(); + } + } + /// /// Removes the property from all configurations and platforms. /// @@ -1051,13 +1065,6 @@ namespace ICSharpCode.SharpDevelop.Project if (base.IdGuid == null) { // Save the GUID in the project if the project does not yet have a GUID. SetPropertyInternal(null, null, ProjectGuidPropertyName, value, PropertyStorageLocations.Base, true); - try { - // save fixed project - project.Save(this.FileName); - } catch (IOException) { - } catch (AccessViolationException) { - // Ignore errors writing the fixed project file - } } base.IdGuid = value; } diff --git a/src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingDescriptor.cs b/src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingDescriptor.cs index 9fffa18bf7..bdb58f6efa 100644 --- a/src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingDescriptor.cs +++ b/src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingDescriptor.cs @@ -40,6 +40,7 @@ namespace ICSharpCode.SharpDevelop } } + public string Guid { get { return codon.Properties["guid"]; From 61a20439ea0e499fc7632fe242f130ffe13ae1a6 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 17 Jan 2009 19:37:56 +0000 Subject: [PATCH 21/68] fixed bugs in Extract Method git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3755 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Misc/SharpRefactoring/Src/CSharpMethodExtractor.cs | 1 - .../Misc/SharpRefactoring/Src/ExtractMethodCommand.cs | 6 +++--- .../Misc/SharpRefactoring/Src/Forms/ExtractMethodForm.cs | 9 +++++++-- .../Misc/SharpRefactoring/Src/MethodExtractorBase.cs | 4 ++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/AddIns/Misc/SharpRefactoring/Src/CSharpMethodExtractor.cs b/src/AddIns/Misc/SharpRefactoring/Src/CSharpMethodExtractor.cs index 1eeba16840..29bbfa361c 100644 --- a/src/AddIns/Misc/SharpRefactoring/Src/CSharpMethodExtractor.cs +++ b/src/AddIns/Misc/SharpRefactoring/Src/CSharpMethodExtractor.cs @@ -125,7 +125,6 @@ namespace SharpRefactoring otherReturnValues.Add(new VariableDeclaration(variable.Name, variable.Initializer, variable.TypeRef)); } - FindReferenceVisitor frv = new FindReferenceVisitor(true, variable.Name, start, end); parentNode.AcceptVisitor(frv, null); diff --git a/src/AddIns/Misc/SharpRefactoring/Src/ExtractMethodCommand.cs b/src/AddIns/Misc/SharpRefactoring/Src/ExtractMethodCommand.cs index e640723683..e1fe90c703 100644 --- a/src/AddIns/Misc/SharpRefactoring/Src/ExtractMethodCommand.cs +++ b/src/AddIns/Misc/SharpRefactoring/Src/ExtractMethodCommand.cs @@ -5,7 +5,6 @@ // $Revision$ // -using ICSharpCode.TextEditor; using System; using System.Collections.Generic; using System.IO; @@ -20,6 +19,7 @@ using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Refactoring; +using ICSharpCode.TextEditor; using ICSharpCode.TextEditor.Document; using SharpRefactoring.Forms; using SharpRefactoring.Transformers; @@ -54,11 +54,11 @@ namespace SharpRefactoring MethodExtractorBase GetCurrentExtractor(TextEditorControl editor) { - switch (ProjectService.CurrentProject.Language) { + switch (LanguageBindingService.GetCodonPerCodeFileName(editor.FileName).Language) { case "C#": return new CSharpMethodExtractor(editor, editor.ActiveTextAreaControl.SelectionManager.SelectionCollection[0]); default: - MessageService.ShowError(string.Format(StringParser.Parse("${res:AddIns.SharpRefactoring.ExtractMethodNotSupported}"), ProjectService.CurrentProject.Language)); + MessageService.ShowError(string.Format(StringParser.Parse("${res:AddIns.SharpRefactoring.ExtractMethodNotSupported}"), LanguageBindingService.GetCodonPerCodeFileName(editor.FileName).Language)); return null; } } diff --git a/src/AddIns/Misc/SharpRefactoring/Src/Forms/ExtractMethodForm.cs b/src/AddIns/Misc/SharpRefactoring/Src/Forms/ExtractMethodForm.cs index f89013bcbf..ae54c52e69 100644 --- a/src/AddIns/Misc/SharpRefactoring/Src/Forms/ExtractMethodForm.cs +++ b/src/AddIns/Misc/SharpRefactoring/Src/Forms/ExtractMethodForm.cs @@ -8,8 +8,11 @@ */ using System; +using System.Collections.Generic; using System.Drawing; +using System.Linq; using System.Windows.Forms; + using ICSharpCode.Core; namespace SharpRefactoring.Forms @@ -54,9 +57,11 @@ namespace SharpRefactoring.Forms string afterName = text.Substring(text.IndexOf('(')); - string type = text.Split(' ')[0]; + List list = text.Split(' ').ToList(); + + list.RemoveAt(list.Count - 1); - this.txtPreview.Text = type + " " + this.txtName.Text + afterName; + this.txtPreview.Text = string.Join(" ", list.ToArray()) + " " + this.txtName.Text + afterName; } } } diff --git a/src/AddIns/Misc/SharpRefactoring/Src/MethodExtractorBase.cs b/src/AddIns/Misc/SharpRefactoring/Src/MethodExtractorBase.cs index 910961b0f8..79dcbd6ed9 100644 --- a/src/AddIns/Misc/SharpRefactoring/Src/MethodExtractorBase.cs +++ b/src/AddIns/Misc/SharpRefactoring/Src/MethodExtractorBase.cs @@ -64,7 +64,7 @@ namespace SharpRefactoring Statement caller; InvocationExpression expr = new InvocationExpression(new IdentifierExpression(method.Name), CreateArgumentExpressions(method.Parameters)); - if (method.TypeReference.Type != "void") { + if (method.TypeReference.Type != "System.Void") { if (parent is MethodDeclaration) { if (method.TypeReference == (parent as MethodDeclaration).TypeReference) caller = new ReturnStatement(expr); @@ -100,7 +100,7 @@ namespace SharpRefactoring newMethod.Body.Children.Add(new ReturnStatement(new IdentifierExpression(possibleReturnValues[possibleReturnValues.Count - 1].Name))); this.returnedVariable = possibleReturnValues[possibleReturnValues.Count - 1]; } else { - newMethod.TypeReference = new TypeReference("void"); + newMethod.TypeReference = new TypeReference("System.Void", true); this.returnedVariable = null; } } From efc40af0ffe239e6b4a220e46829d38343174667 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 17 Jan 2009 20:51:31 +0000 Subject: [PATCH 22/68] Fixed SD2-1504: Tooltip not shown when code folded git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3756 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Gui/TextAreaMouseHandler.cs | 6 ++- .../Project/Src/Gui/TextView.cs | 43 +++++++++++-------- .../Test/Output/CSharp/CSharpOutputTest.cs | 6 +++ 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs index 442495606d..b969b8ba55 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs @@ -362,7 +362,11 @@ namespace ICSharpCode.TextEditor clickedOnSelectedText = true; } - textArea.SelectionManager.SetSelection(new DefaultSelection(textArea.TextView.Document, new TextLocation(marker.StartColumn, marker.StartLine), new TextLocation(marker.EndColumn, marker.EndLine))); + TextLocation startLocation = new TextLocation(marker.StartColumn, marker.StartLine); + TextLocation endLocation = new TextLocation(marker.EndColumn, marker.EndLine); + textArea.SelectionManager.SetSelection(new DefaultSelection(textArea.TextView.Document, startLocation, endLocation)); + textArea.Caret.Position = startLocation; + textArea.SetDesiredColumn(); textArea.Focus(); return; } diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextView.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextView.cs index 5bdfb82fe3..d3c2407cc8 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextView.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextView.cs @@ -774,26 +774,35 @@ namespace ICSharpCode.TextEditor int result; using (Graphics g = textArea.CreateGraphics()) { - do { + // call GetLogicalColumnInternal to skip over text, + // then skip over fold markers + // and repeat as necessary. + // The loop terminates once the correct logical column is reached in + // GetLogicalColumnInternal or inside a fold marker. + while (true) { + LineSegment line = Document.GetLineSegment(lineNumber); FoldMarker nextFolding = FindNextFoldedFoldingOnLineAfterColumn(lineNumber, start-1); int end = nextFolding != null ? nextFolding.StartColumn : int.MaxValue; result = GetLogicalColumnInternal(g, line, start, end, ref posX, visualPosX); - if (result < 0) { - // reached fold marker - lineNumber = nextFolding.EndLine; - start = nextFolding.EndColumn; - int newPosX = posX + 1 + MeasureStringWidth(g, nextFolding.FoldText, TextEditorProperties.FontContainer.RegularFont); - if (newPosX >= visualPosX) { - inFoldMarker = nextFolding; - if (IsNearerToAThanB(visualPosX, posX, newPosX)) - return new TextLocation(nextFolding.StartColumn, nextFolding.StartLine); - else - return new TextLocation(nextFolding.EndColumn, nextFolding.EndLine); - } - posX = newPosX; + + // break when GetLogicalColumnInternal found the result column + if (result < end) + break; + + // reached fold marker + lineNumber = nextFolding.EndLine; + start = nextFolding.EndColumn; + int newPosX = posX + 1 + MeasureStringWidth(g, nextFolding.FoldText, TextEditorProperties.FontContainer.RegularFont); + if (newPosX >= visualPosX) { + inFoldMarker = nextFolding; + if (IsNearerToAThanB(visualPosX, posX, newPosX)) + return new TextLocation(nextFolding.StartColumn, nextFolding.StartLine); + else + return new TextLocation(nextFolding.EndColumn, nextFolding.EndLine); } - } while (result < 0); + posX = newPosX; + } } return new TextLocation(result, lineNumber); } @@ -801,7 +810,7 @@ namespace ICSharpCode.TextEditor int GetLogicalColumnInternal(Graphics g, LineSegment line, int start, int end, ref int drawingPos, int targetVisualPosX) { if (start == end) - return -1; + return end; Debug.Assert(start < end); Debug.Assert(drawingPos < targetVisualPosX); @@ -824,7 +833,7 @@ namespace ICSharpCode.TextEditor for (int i = 0; i < words.Count; i++) { TextWord word = words[i]; if (wordOffset >= end) { - return -1; + return wordOffset; } if (wordOffset + word.Length >= start) { int newDrawingPos; diff --git a/src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs b/src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs index 3589e940b8..54e5780d22 100644 --- a/src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs +++ b/src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs @@ -89,6 +89,12 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter TestTypeMember("void Method() { }"); } + [Test] + public void StaticMethod() + { + TestTypeMember("static void Method() { }"); + } + [Test] public void PartialModifier() { From 2fd53108e14d767b703ac0fc57ca893fc401ffc5 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 17 Jan 2009 21:21:01 +0000 Subject: [PATCH 23/68] Renamed "OK" button in solution configuration editor to "Close" (there's no way to cancel the changes). git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3757 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- ...tAvailableConfigurationsDialog.Designer.cs | 22 +++++++-------- .../SolutionConfigurationEditor.Designer.cs | 28 +++++++++---------- .../SolutionConfigurationEditor.cs | 2 +- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/EditAvailableConfigurationsDialog.Designer.cs b/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/EditAvailableConfigurationsDialog.Designer.cs index 840b4afe24..0246c04637 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/EditAvailableConfigurationsDialog.Designer.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/EditAvailableConfigurationsDialog.Designer.cs @@ -36,7 +36,7 @@ namespace ICSharpCode.SharpDevelop.Gui private void InitializeComponent() { this.listBox = new System.Windows.Forms.ListBox(); - this.okButton = new System.Windows.Forms.Button(); + this.closeButton = new System.Windows.Forms.Button(); this.removeButton = new System.Windows.Forms.Button(); this.renameButton = new System.Windows.Forms.Button(); this.addButton = new System.Windows.Forms.Button(); @@ -56,14 +56,14 @@ namespace ICSharpCode.SharpDevelop.Gui // // okButton // - this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; - this.okButton.Location = new System.Drawing.Point(222, 111); - this.okButton.Name = "okButton"; - this.okButton.Size = new System.Drawing.Size(75, 23); - this.okButton.TabIndex = 1; - this.okButton.Text = "${res:Global.OKButtonText}"; - this.okButton.UseVisualStyleBackColor = true; + this.closeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.closeButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.closeButton.Location = new System.Drawing.Point(222, 111); + this.closeButton.Name = "closeButton"; + this.closeButton.Size = new System.Drawing.Size(75, 23); + this.closeButton.TabIndex = 1; + this.closeButton.Text = "${res:Global.CloseButtonText}"; + this.closeButton.UseVisualStyleBackColor = true; // // removeButton // @@ -106,7 +106,7 @@ namespace ICSharpCode.SharpDevelop.Gui this.Controls.Add(this.addButton); this.Controls.Add(this.renameButton); this.Controls.Add(this.removeButton); - this.Controls.Add(this.okButton); + this.Controls.Add(this.closeButton); this.Controls.Add(this.listBox); this.MinimumSize = new System.Drawing.Size(230, 165); this.Name = "EditAvailableConfigurationsDialog"; @@ -119,6 +119,6 @@ namespace ICSharpCode.SharpDevelop.Gui private System.Windows.Forms.Button renameButton; private System.Windows.Forms.Button removeButton; private System.Windows.Forms.ListBox listBox; - private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button closeButton; } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/SolutionConfigurationEditor.Designer.cs b/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/SolutionConfigurationEditor.Designer.cs index b9384a6f1b..9ca567c793 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/SolutionConfigurationEditor.Designer.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/SolutionConfigurationEditor.Designer.cs @@ -45,7 +45,7 @@ namespace ICSharpCode.SharpDevelop.Gui this.configurationColumn = new System.Windows.Forms.DataGridViewComboBoxColumn(); this.platformColumn = new System.Windows.Forms.DataGridViewComboBoxColumn(); this.panel2 = new System.Windows.Forms.Panel(); - this.okButton = new System.Windows.Forms.Button(); + this.closeButton = new System.Windows.Forms.Button(); this.panel1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.grid)).BeginInit(); this.panel2.SuspendLayout(); @@ -118,8 +118,8 @@ namespace ICSharpCode.SharpDevelop.Gui this.grid.Size = new System.Drawing.Size(504, 192); this.grid.TabIndex = 1; this.grid.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.GridCellValueChanged); - this.grid.DataError += new System.Windows.Forms.DataGridViewDataErrorEventHandler(this.GridDataError); this.grid.EditingControlShowing += new System.Windows.Forms.DataGridViewEditingControlShowingEventHandler(this.GridEditingControlShowing); + this.grid.DataError += new System.Windows.Forms.DataGridViewDataErrorEventHandler(this.GridDataError); // // projectNameColumn // @@ -140,27 +140,27 @@ namespace ICSharpCode.SharpDevelop.Gui // // panel2 // - this.panel2.Controls.Add(this.okButton); + this.panel2.Controls.Add(this.closeButton); this.panel2.Dock = System.Windows.Forms.DockStyle.Bottom; this.panel2.Location = new System.Drawing.Point(0, 229); this.panel2.Name = "panel2"; this.panel2.Size = new System.Drawing.Size(504, 30); this.panel2.TabIndex = 2; // - // okButton + // closeButton // - this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; - this.okButton.Location = new System.Drawing.Point(417, 3); - this.okButton.Name = "okButton"; - this.okButton.Size = new System.Drawing.Size(75, 23); - this.okButton.TabIndex = 0; - this.okButton.Text = "${res:Global.OKButtonText}"; - this.okButton.UseVisualStyleBackColor = true; + this.closeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.closeButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.closeButton.Location = new System.Drawing.Point(417, 3); + this.closeButton.Name = "closeButton"; + this.closeButton.Size = new System.Drawing.Size(75, 23); + this.closeButton.TabIndex = 0; + this.closeButton.Text = "${res:Global.CloseButtonText}"; + this.closeButton.UseVisualStyleBackColor = true; // // SolutionConfigurationEditor // - this.AcceptButton = this.okButton; + this.AcceptButton = this.closeButton; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(504, 259); @@ -176,10 +176,10 @@ namespace ICSharpCode.SharpDevelop.Gui this.panel2.ResumeLayout(false); this.ResumeLayout(false); } + private System.Windows.Forms.Button closeButton; private System.Windows.Forms.DataGridView grid; private System.Windows.Forms.ComboBox configurationComboBox; private System.Windows.Forms.ComboBox platformComboBox; - private System.Windows.Forms.Button okButton; private System.Windows.Forms.Panel panel2; private System.Windows.Forms.DataGridViewComboBoxColumn platformColumn; private System.Windows.Forms.DataGridViewComboBoxColumn configurationColumn; diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/SolutionConfigurationEditor.cs b/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/SolutionConfigurationEditor.cs index 681323361e..3c7b526de6 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/SolutionConfigurationEditor.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/SolutionConfiguration/SolutionConfigurationEditor.cs @@ -37,7 +37,7 @@ namespace ICSharpCode.SharpDevelop.Gui this.Text = StringParser.Parse(this.Text); label1.Text = StringParser.Parse(label1.Text); label2.Text = StringParser.Parse(label2.Text); - okButton.Text = StringParser.Parse(okButton.Text); + closeButton.Text = StringParser.Parse(closeButton.Text); projectNameColumn.HeaderText = StringParser.Parse(projectNameColumn.HeaderText); configurationColumn.HeaderText = StringParser.Parse(configurationColumn.HeaderText); platformColumn.HeaderText = StringParser.Parse(platformColumn.HeaderText); From 4bc08d161a37ba51c0e9e0c0b476cc75fd37f726 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 17 Jan 2009 22:07:51 +0000 Subject: [PATCH 24/68] Add PrintDocument to default Toolbox. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3758 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- data/options/SharpDevelopControlLibrary.sdcl | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/data/options/SharpDevelopControlLibrary.sdcl b/data/options/SharpDevelopControlLibrary.sdcl index 04b42668d7..5494a05d91 100644 --- a/data/options/SharpDevelopControlLibrary.sdcl +++ b/data/options/SharpDevelopControlLibrary.sdcl @@ -3,6 +3,7 @@ + @@ -52,10 +53,6 @@ - - - - @@ -81,5 +78,12 @@ + + + + + + + From c2d6a0cb800826e600c8d66e87de748a168fe037 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 18 Jan 2009 11:18:30 +0000 Subject: [PATCH 25/68] fixed Bugs in ExtractInterface git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3759 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Gui/Dialogs/ExtractInterfaceDialog.cs | 5 +- .../FindReferencesAndRenameHelper.cs | 14 +- .../NRefactoryRefactoringProvider.cs | 251 ++---------------- .../Src/Refactoring/RefactoringProvider.cs | 9 +- 4 files changed, 39 insertions(+), 240 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ExtractInterfaceDialog.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ExtractInterfaceDialog.cs index bfee3263b0..76e88ca639 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ExtractInterfaceDialog.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ExtractInterfaceDialog.cs @@ -34,7 +34,6 @@ namespace ICSharpCode.SharpDevelop.Gui InitializeComponent(); this.Owner = WorkbenchSingleton.MainForm; - this.TopMost = true; this.possibleInterfaceMembers = new List(); this.hasSetFilenameExplicitly = false; @@ -147,6 +146,10 @@ namespace ICSharpCode.SharpDevelop.Gui foreach (int i in selectMembersListBox.CheckedIndices) { this.options.ChosenMembers.Add(this.possibleInterfaceMembers[i]); } + if (this.options.ChosenMembers.Count == 0) { + MessageService.ShowError("Please select at least one member from the list!"); + return; + } this.options.IncludeComments = cbIncludeComments.CheckState == CheckState.Checked; this.options.AddInterfaceToClass = cbAddToClass.CheckState == CheckState.Checked; this.DialogResult = DialogResult.OK; diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs index 270e898285..2dc6e5b5c7 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs @@ -62,16 +62,12 @@ namespace ICSharpCode.SharpDevelop.Refactoring LanguageProperties language = c.ProjectContent.Language; string classFileName = c.CompilationUnit.FileName; string existingClassCode = ParserService.GetParseableFileContent(classFileName); - + // build the new interface... - string newInterfaceCode = - language.RefactoringProvider.GenerateInterfaceForClass(extractInterface.NewInterfaceName, - extractInterface.ChosenMembers, - extractInterface.IncludeComments, - c.Namespace, - c.Name, - existingClassCode - ); + string newInterfaceCode = language.RefactoringProvider.GenerateInterfaceForClass(extractInterface.NewInterfaceName, + existingClassCode, + extractInterface.ChosenMembers, + c, extractInterface.IncludeComments); if (newInterfaceCode == null) return; diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryRefactoringProvider.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryRefactoringProvider.cs index b3c72b0f6d..a8b42bc000 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryRefactoringProvider.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryRefactoringProvider.cs @@ -93,238 +93,43 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring } } - class ExtractInterfaceTransformer : NR.Visitors.AbstractAstTransformer + public override string GenerateInterfaceForClass(string newInterfaceName, string existingCode, IList membersToKeep, IClass sourceClass, bool preserveComments) { - string newInterfaceName; - string sourceClassName; - string sourceNamespace; - List membersToInclude; - - public ExtractInterfaceTransformer(string newInterfaceName, - string sourceNamespace, - string sourceClassName, - IList chosenMembers) { - this.newInterfaceName = newInterfaceName; - this.sourceNamespace = sourceNamespace; - this.sourceClassName = sourceClassName; - - membersToInclude = chosenMembers.ToList(); - } - - public override object VisitNamespaceDeclaration(NamespaceDeclaration namespaceDeclaration, object data) - { - TypeDeclaration type = LookupTypeDeclaration(namespaceDeclaration.Children, namespaceDeclaration.Name); - - RemoveCurrentNode(); - - if (type != null && namespaceDeclaration.Parent is CompilationUnit) - ((CompilationUnit)namespaceDeclaration.Parent).AddChild(type); - - return base.VisitNamespaceDeclaration(namespaceDeclaration, data); - } - - public override object VisitUsingDeclaration(UsingDeclaration usingDeclaration, object data) - { - RemoveCurrentNode(); - return base.VisitUsingDeclaration(usingDeclaration, data); - } - - TypeDeclaration LookupTypeDeclaration(List nodes, string nameSpace) - { - TypeDeclaration td = null; - - foreach (INode node in nodes) { - if (node is TypeDeclaration) { - TypeDeclaration type = node as TypeDeclaration; - string name = nameSpace + "." + type.Name; - string lookFor = sourceNamespace + "." + sourceClassName; - if (lookFor == name) - return type; - else - td = LookupTypeDeclaration(node.Children, name); + Modifiers modifiers = CodeGenerator.ConvertModifier(sourceClass.Modifiers, new ClassFinder(membersToKeep[0])); + TypeDeclaration interfaceDef = new TypeDeclaration(modifiers, new List()); + interfaceDef.Name = newInterfaceName; + interfaceDef.Type = NR.Ast.ClassType.Interface; + interfaceDef.Templates = CodeGenerator.ConvertTemplates(sourceClass.TypeParameters, new ClassFinder(membersToKeep[0])); + + foreach (IMember member in membersToKeep) { + AttributedNode an = CodeGenerator.ConvertMember(member, new ClassFinder(member)); + INode node = null; + if (an is MethodDeclaration) { + MethodDeclaration m = an as MethodDeclaration; + m.Body = BlockStatement.Null; + m.Modifier = Modifiers.None; + node = m; + } else { + if (an is PropertyDeclaration) { + PropertyDeclaration p = an as PropertyDeclaration; + p.GetRegion.Block = BlockStatement.Null; + p.SetRegion.Block= BlockStatement.Null; + p.Modifier = Modifiers.None; + node = p; } } - return td; - } - - static bool MethodEquals(MethodDeclaration md1, MethodDeclaration md2) - { - if (md2 == null) - throw new ArgumentNullException("md2"); - if (md1 == null) - throw new ArgumentNullException("md1"); - - // see C# Spec 3, page 65, 3.6 - - return md1.Name == md2.Name && - (MethodDeclaration.GetCollectionString(md1.Parameters) == MethodDeclaration.GetCollectionString(md2.Parameters)) && - (MethodDeclaration.GetCollectionString(md1.Templates) == MethodDeclaration.GetCollectionString(md2.Templates)); - } - - static bool PropertyEquals(PropertyDeclaration pd1, PropertyDeclaration pd2) - { - if (pd1 == null) - throw new ArgumentNullException("pd1"); - if (pd2 == null) - throw new ArgumentNullException("pd2"); - - return pd1.Name == pd2.Name; - } - - bool ContainsMethod(MethodDeclaration md) - { - if (md == null) - throw new ArgumentNullException("md"); - - foreach (IMember mem in this.membersToInclude) { - if (mem is IMethod && MethodEquals(CodeGenerator.ConvertMember(mem as IMethod, new ClassFinder(mem)) as MethodDeclaration, md)) - return true; - } - - return false; - } - - bool ContainsProperty(PropertyDeclaration pd) - { - if (pd == null) - throw new ArgumentNullException("pd"); - - foreach (IMember mem in this.membersToInclude) { - if (mem is IProperty && PropertyEquals(CodeGenerator.ConvertMember(mem as IProperty, new ClassFinder(mem)) as PropertyDeclaration, pd)) - return true; - } - - return false; - } - - public override object VisitTypeDeclaration(TypeDeclaration typeDeclaration, object data) - { - if (typeDeclaration.Name != sourceClassName) { - return base.VisitTypeDeclaration(typeDeclaration, data); - } - - // rewrite the type declaration to an interface - typeDeclaration.Attributes.Clear(); - typeDeclaration.BaseTypes.Clear(); - - typeDeclaration.Type = NR.Ast.ClassType.Interface; - typeDeclaration.Name = newInterfaceName; + if (node == null) + throw new NotSupportedException(); - // remove those children who are not explicitly listed in our 'membersToInclude' dictionary - // we walk backwards so that deletions don't affect the iteration - bool keepIt; - MethodDeclaration method; - PropertyDeclaration property; - object child; - for (int i = typeDeclaration.Children.Count-1; i >= 0; i--) { - keepIt = false; - child = typeDeclaration.Children[i]; - if (child is MethodDeclaration) { - method = (MethodDeclaration)child; - if (ContainsMethod(method) && ((method.Modifier & Modifiers.Static) != Modifiers.Static)) - keepIt = true; - } else if (child is PropertyDeclaration) { - property = (PropertyDeclaration)child; - if (ContainsProperty(property) && ((property.Modifier & Modifiers.Static) != Modifiers.Static)) - keepIt = true; - } - - if (!keepIt) { - typeDeclaration.Children.RemoveAt(i); - } - } - - // must call the base method to ensure that this type's children get visited - return base.VisitTypeDeclaration(typeDeclaration, data); + interfaceDef.AddChild(node); } - public override object VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data) - { - if (ContainsMethod(methodDeclaration) && ((methodDeclaration.Modifier & Modifiers.Static) != Modifiers.Static)) { - // strip out the public modifier... - methodDeclaration.Modifier = NR.Ast.Modifiers.None; - - // ...and the method body - methodDeclaration.Body = BlockStatement.Null; - } else { - RemoveCurrentNode(); - } - - return null; - } - - public override object VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration, object data) - { - if (ContainsProperty(propertyDeclaration) && ((propertyDeclaration.Modifier & Modifiers.Static) != Modifiers.Static)) { - // strip out the public modifiers... - propertyDeclaration.Modifier = NR.Ast.Modifiers.None; - - // ... and the body of any get block... - if (propertyDeclaration.HasGetRegion) { - propertyDeclaration.GetRegion.Block = BlockStatement.Null; - } - - // ... and the body of any set block... - if (propertyDeclaration.HasSetRegion) { - propertyDeclaration.SetRegion.Block = BlockStatement.Null; - } - } else { - RemoveCurrentNode(); - } - - return null; - } - } - - public override string GenerateInterfaceForClass(string newInterfaceName, - IList membersToKeep, - bool preserveComments, - string sourceNamespace, - string sourceClassName, - string existingCode - ) - { - string codeForNewInterface = ""; - NR.IParser parser = ParseFile(null, existingCode); - if (parser == null) { - return null; - } - // use a custom IAstVisitor to strip our class out of this file, - // rewrite it as our desired interface, and strip out every - // member except those we want to keep in our new interface. - ExtractInterfaceTransformer extractInterfaceTransformer = new ExtractInterfaceTransformer(newInterfaceName, - sourceNamespace, - sourceClassName, - membersToKeep); - parser.CompilationUnit.AcceptVisitor(extractInterfaceTransformer, null); - - // now use an output visitor for the appropriate language (based on - // extension of the existing code file) to format the new interface. - IOutputAstVisitor output = GetOutputVisitor(); - if (preserveComments) { - // run the output visitor with the specials inserter to insert comments - // NOTE: *all* comments will be preserved, even for code that has been - // removed to create the interface... - // TODO: is it worth enhancing the SpecialsNodeInserter to attach comments directly to code so they can be filtered based on what is preserved after a transformation? - using (SpecialNodesInserter.Install(parser.Lexer.SpecialTracker.RetrieveSpecials(), output)) { - parser.CompilationUnit.AcceptVisitor(output, null); - } - } else { - // run the output visitor without the specials inserter - parser.CompilationUnit.AcceptVisitor(output, null); - } + IOutputAstVisitor printer = this.GetOutputVisitor(); - parser.Dispose(); + interfaceDef.AcceptVisitor(printer, null); - if (output.Errors.Count == 0) { - // get the output - codeForNewInterface = output.Text; - } else { - // dump errors into the new interface file... - codeForNewInterface = String.Format("{0} {1}", - this.CommentToken, output.Errors.ErrorOutput); - } + string codeForNewInterface = printer.Text; // wrap the new code in the same comments/usings/namespace as the the original class file. string newFileContent = CreateNewFileLikeExisting(existingCode, codeForNewInterface); diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/RefactoringProvider.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/RefactoringProvider.cs index 6cefdf26c4..7896f666ab 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/RefactoringProvider.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/RefactoringProvider.cs @@ -36,13 +36,8 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring return false; } } - public virtual string GenerateInterfaceForClass(string newInterfaceName, - IList membersToExtract, - bool preserveComments, - string sourceNamespace, - string sourceClassName, - string existingCode - ) + public virtual string GenerateInterfaceForClass(string newInterfaceName, string existingCode, IList membersToKeep, IClass sourceClass, bool preserveComments) + { throw new NotSupportedException(); } From 5f1fccd9ce7a444de67fb22cc784c5a9263fae2b Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 18 Jan 2009 11:20:27 +0000 Subject: [PATCH 26/68] improved ExtractMethod git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3760 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/CSharpMethodExtractor.cs | 9 +- .../Src/ExtractMethodCommand.cs | 2 +- .../Src/Forms/ExtractMethodForm.Designer.cs | 206 +++++++++--------- .../Src/Forms/ExtractMethodForm.cs | 82 ++++--- .../Src/MethodExtractorBase.cs | 32 +-- 5 files changed, 168 insertions(+), 163 deletions(-) diff --git a/src/AddIns/Misc/SharpRefactoring/Src/CSharpMethodExtractor.cs b/src/AddIns/Misc/SharpRefactoring/Src/CSharpMethodExtractor.cs index 29bbfa361c..d8533548d2 100644 --- a/src/AddIns/Misc/SharpRefactoring/Src/CSharpMethodExtractor.cs +++ b/src/AddIns/Misc/SharpRefactoring/Src/CSharpMethodExtractor.cs @@ -27,7 +27,7 @@ namespace SharpRefactoring public class CSharpMethodExtractor : MethodExtractorBase { public CSharpMethodExtractor(ICSharpCode.TextEditor.TextEditorControl textEditor, ISelection selection) - : base(textEditor, selection, new CSharpOutputVisitor()) + : base(textEditor, selection) { } @@ -176,9 +176,16 @@ namespace SharpRefactoring CreateReturnStatement(newMethod, possibleReturnValues); + newMethod.Name = "NewMethod"; + this.extractedMethod = newMethod; return true; } + + public override IOutputAstVisitor GetOutputVisitor() + { + return new CSharpOutputVisitor(); + } } } diff --git a/src/AddIns/Misc/SharpRefactoring/Src/ExtractMethodCommand.cs b/src/AddIns/Misc/SharpRefactoring/Src/ExtractMethodCommand.cs index e1fe90c703..e7aec5fe42 100644 --- a/src/AddIns/Misc/SharpRefactoring/Src/ExtractMethodCommand.cs +++ b/src/AddIns/Misc/SharpRefactoring/Src/ExtractMethodCommand.cs @@ -36,7 +36,7 @@ namespace SharpRefactoring MethodExtractorBase extractor = GetCurrentExtractor(textEditor); if (extractor != null) { if (extractor.Extract()) { - ExtractMethodForm form = new ExtractMethodForm("NewMethod", extractor.CreatePreview()); + ExtractMethodForm form = new ExtractMethodForm(extractor.ExtractedMethod, new Func(extractor.GetOutputVisitor)); if (form.ShowDialog() == DialogResult.OK) { extractor.ExtractedMethod.Name = form.Text; diff --git a/src/AddIns/Misc/SharpRefactoring/Src/Forms/ExtractMethodForm.Designer.cs b/src/AddIns/Misc/SharpRefactoring/Src/Forms/ExtractMethodForm.Designer.cs index 5431897823..1771211f71 100644 --- a/src/AddIns/Misc/SharpRefactoring/Src/Forms/ExtractMethodForm.Designer.cs +++ b/src/AddIns/Misc/SharpRefactoring/Src/Forms/ExtractMethodForm.Designer.cs @@ -36,109 +36,109 @@ namespace SharpRefactoring.Forms /// private void InitializeComponent() { - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.txtName = new System.Windows.Forms.TextBox(); - this.txtPreview = new System.Windows.Forms.TextBox(); - this.btnCancel = new System.Windows.Forms.Button(); - this.btnOK = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // label1 - // - this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 9); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(167, 13); - this.label1.TabIndex = 0; - this.label1.Text = "Enter a name for the new method:"; - // - // label2 - // - this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(12, 48); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(48, 13); - this.label2.TabIndex = 1; - this.label2.Text = "Preview:"; - // - // txtName - // - this.txtName.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtName.Location = new System.Drawing.Point(12, 25); - this.txtName.Name = "txtName"; - this.txtName.Size = new System.Drawing.Size(467, 20); - this.txtName.TabIndex = 2; - this.txtName.TextChanged += new System.EventHandler(this.txtName_TextChanged); - // - // txtPreview - // - this.txtPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtPreview.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.txtPreview.Location = new System.Drawing.Point(12, 64); - this.txtPreview.Multiline = true; - this.txtPreview.Name = "txtPreview"; - this.txtPreview.ReadOnly = true; - this.txtPreview.Size = new System.Drawing.Size(467, 151); - this.txtPreview.TabIndex = 3; - // - // btnCancel - // - this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.btnCancel.Location = new System.Drawing.Point(404, 221); - this.btnCancel.Name = "btnCancel"; - this.btnCancel.Size = new System.Drawing.Size(75, 23); - this.btnCancel.TabIndex = 4; - this.btnCancel.Text = "Cancel"; - this.btnCancel.UseVisualStyleBackColor = true; - this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); - // - // btnOK - // - this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnOK.Location = new System.Drawing.Point(323, 221); - this.btnOK.Name = "btnOK"; - this.btnOK.Size = new System.Drawing.Size(75, 23); - this.btnOK.TabIndex = 5; - this.btnOK.Text = "OK"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.btnOK_Click); - // - // ExtractMethodForm - // - this.AcceptButton = this.btnOK; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnCancel; - this.ClientSize = new System.Drawing.Size(491, 252); - this.Controls.Add(this.btnOK); - this.Controls.Add(this.btnCancel); - this.Controls.Add(this.txtPreview); - this.Controls.Add(this.txtName); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ExtractMethodForm"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "Extract Method"; - this.ResumeLayout(false); - this.PerformLayout(); - + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.txtName = new System.Windows.Forms.TextBox(); + this.txtPreview = new System.Windows.Forms.TextBox(); + this.btnCancel = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(167, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Enter a name for the new method:"; + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 48); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(48, 13); + this.label2.TabIndex = 1; + this.label2.Text = "Preview:"; + // + // txtName + // + this.txtName.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtName.Location = new System.Drawing.Point(12, 25); + this.txtName.Name = "txtName"; + this.txtName.Size = new System.Drawing.Size(467, 20); + this.txtName.TabIndex = 2; + this.txtName.TextChanged += new System.EventHandler(this.txtNameTextChanged); + // + // txtPreview + // + this.txtPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtPreview.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtPreview.Location = new System.Drawing.Point(12, 64); + this.txtPreview.Multiline = true; + this.txtPreview.Name = "txtPreview"; + this.txtPreview.ReadOnly = true; + this.txtPreview.Size = new System.Drawing.Size(467, 151); + this.txtPreview.TabIndex = 3; + // + // btnCancel + // + this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.Location = new System.Drawing.Point(404, 221); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(75, 23); + this.btnCancel.TabIndex = 4; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancelClick); + // + // btnOK + // + this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnOK.Location = new System.Drawing.Point(323, 221); + this.btnOK.Name = "btnOK"; + this.btnOK.Size = new System.Drawing.Size(75, 23); + this.btnOK.TabIndex = 5; + this.btnOK.Text = "OK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOKClick); + // + // ExtractMethodForm + // + this.AcceptButton = this.btnOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnCancel; + this.ClientSize = new System.Drawing.Size(491, 252); + this.Controls.Add(this.btnOK); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.txtPreview); + this.Controls.Add(this.txtName); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ExtractMethodForm"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Extract Method"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ExtractMethodFormFormClosing); + this.ResumeLayout(false); + this.PerformLayout(); } private System.Windows.Forms.Label label1; diff --git a/src/AddIns/Misc/SharpRefactoring/Src/Forms/ExtractMethodForm.cs b/src/AddIns/Misc/SharpRefactoring/Src/Forms/ExtractMethodForm.cs index ae54c52e69..abe58d1d22 100644 --- a/src/AddIns/Misc/SharpRefactoring/Src/Forms/ExtractMethodForm.cs +++ b/src/AddIns/Misc/SharpRefactoring/Src/Forms/ExtractMethodForm.cs @@ -7,13 +7,14 @@ * Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern. */ +using ICSharpCode.SharpDevelop.Refactoring; using System; using System.Collections.Generic; -using System.Drawing; using System.Linq; using System.Windows.Forms; - -using ICSharpCode.Core; +using ICSharpCode.NRefactory; +using ICSharpCode.NRefactory.Ast; +using ICSharpCode.NRefactory.PrettyPrinter; namespace SharpRefactoring.Forms { @@ -22,46 +23,59 @@ namespace SharpRefactoring.Forms /// public partial class ExtractMethodForm : Form { - public ExtractMethodForm(string name, string preview) + Func generator; + MethodDeclaration declaration; + BlockStatement body; + bool cancelUnload = false; + + public ExtractMethodForm(MethodDeclaration declaration, Func generator) { // // The InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent(); - - this.txtName.Text = name; - this.txtPreview.Text = preview; - txtName_TextChanged(null, EventArgs.Empty); - - this.txtName.SelectAll(); + this.declaration = declaration; + this.generator = generator; + IOutputAstVisitor visitor = this.generator.Invoke(); + body = declaration.Body; + declaration.Body = new BlockStatement(); + + declaration.AcceptVisitor(visitor, null); + + this.txtName.Text = this.declaration.Name; + this.txtPreview.Text = visitor.Text; + + this.txtName.SelectAll(); } - private void btnOK_Click(object sender, EventArgs e) - { - this.Text = this.txtName.Text; - this.DialogResult = DialogResult.OK; - } - - private void btnCancel_Click(object sender, EventArgs e) - { - this.DialogResult = DialogResult.Cancel; - } - - private void txtName_TextChanged(object sender, EventArgs e) - { - string text = this.txtPreview.Text; - - if (string.IsNullOrEmpty(text)) - return; + void btnOKClick(object sender, EventArgs e) + { + if (FindReferencesAndRenameHelper.CheckName(this.txtName.Text, string.Empty)) { + this.Text = this.txtName.Text; + this.DialogResult = DialogResult.OK; + this.declaration.Body = body; + cancelUnload = false; + } else + cancelUnload = true; + } - string afterName = text.Substring(text.IndexOf('(')); - - List list = text.Split(' ').ToList(); - - list.RemoveAt(list.Count - 1); + void btnCancelClick(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } - this.txtPreview.Text = string.Join(" ", list.ToArray()) + " " + this.txtName.Text + afterName; - } + void txtNameTextChanged(object sender, EventArgs e) + { + declaration.Name = this.txtName.Text; + IOutputAstVisitor visitor = this.generator.Invoke(); + declaration.AcceptVisitor(visitor, null); + this.txtPreview.Text = visitor.Text; + } + + void ExtractMethodFormFormClosing(object sender, FormClosingEventArgs e) + { + e.Cancel = cancelUnload; + } } } diff --git a/src/AddIns/Misc/SharpRefactoring/Src/MethodExtractorBase.cs b/src/AddIns/Misc/SharpRefactoring/Src/MethodExtractorBase.cs index 79dcbd6ed9..7dea6962b4 100644 --- a/src/AddIns/Misc/SharpRefactoring/Src/MethodExtractorBase.cs +++ b/src/AddIns/Misc/SharpRefactoring/Src/MethodExtractorBase.cs @@ -27,7 +27,7 @@ namespace SharpRefactoring /// /// Description of MethodExtractorBase. /// - public class MethodExtractorBase + public abstract class MethodExtractorBase { protected ICSharpCode.TextEditor.TextEditorControl textEditor; protected ISelection currentSelection; @@ -36,7 +36,6 @@ namespace SharpRefactoring protected ParametrizedNode parentNode; protected Statement caller; protected List beforeCallDeclarations; - protected IOutputAstVisitor output; protected VariableDeclaration returnedVariable; protected List specialsList; @@ -51,12 +50,11 @@ namespace SharpRefactoring get { return extractedMethod; } } - public MethodExtractorBase(ICSharpCode.TextEditor.TextEditorControl textEditor, ISelection selection, IOutputAstVisitor output) + public MethodExtractorBase(ICSharpCode.TextEditor.TextEditorControl textEditor, ISelection selection) { this.currentDocument = textEditor.Document; this.textEditor = textEditor; this.currentSelection = selection; - this.output = output; } protected static Statement CreateCaller(ParametrizedNode parent, MethodDeclaration method, VariableDeclaration returnVariable) @@ -106,18 +104,6 @@ namespace SharpRefactoring } } - public string CreatePreview() - { - BlockStatement body = this.extractedMethod.Body; - this.extractedMethod.Body = new BlockStatement(); - - this.extractedMethod.AcceptVisitor(output, null); - - this.extractedMethod.Body = body; - - return output.Text; - } - public void InsertCall() { string call = GenerateCode(CreateCaller(this.parentNode, this.extractedMethod, this.returnedVariable), false); @@ -132,7 +118,9 @@ namespace SharpRefactoring public void InsertAfterCurrentMethod() { - using (SpecialNodesInserter.Install(this.specialsList, this.output)) { + IOutputAstVisitor outputVisitor = this.GetOutputVisitor(); + + using (SpecialNodesInserter.Install(this.specialsList, outputVisitor)) { string code = "\r\n\r\n" + GenerateCode(this.extractedMethod, true); code = code.TrimEnd('\r', '\n', ' ', '\t'); @@ -299,13 +287,9 @@ namespace SharpRefactoring return hav.HasAssignment; } - - public virtual bool Extract() - { - throw new InvalidOperationException("Cannot use plain MethodExtractor, please use a language specific implementation!"); - } + public abstract IOutputAstVisitor GetOutputVisitor(); + + public abstract bool Extract(); } - - } From 381262f7651b8b0fbf12b2cc6b64caf734b2aa0c Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 18 Jan 2009 13:30:27 +0000 Subject: [PATCH 27/68] Updated to WiX 3.0.4917.0 git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3761 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- data/schemas/firewall.xsd | 6 +- data/schemas/iis.xsd | 27 +++- data/schemas/netfx.xsd | 6 +- data/schemas/util.xsd | 62 +++++++-- data/schemas/wix.xsd | 281 ++++++++++++++++++++++++++++++++++++-- 5 files changed, 353 insertions(+), 29 deletions(-) diff --git a/data/schemas/firewall.xsd b/data/schemas/firewall.xsd index f111dfec20..e9f8b7ae87 100644 --- a/data/schemas/firewall.xsd +++ b/data/schemas/firewall.xsd @@ -82,7 +82,7 @@ - + Port to allow through the firewall for this exception. If you use Port, you @@ -96,15 +96,13 @@ IP protocol used for this firewall exception. If not specified, "tcp" is assumed. If you use Protocol, you must also specify Port and you cannot - also use File or Program. Note that using "any" requires Windows Firewall - with Advanced Security on Windows Vista and will fail on Windows XP. + also use File or Program. - diff --git a/data/schemas/iis.xsd b/data/schemas/iis.xsd index 20ba99b137..cd0911faf9 100644 --- a/data/schemas/iis.xsd +++ b/data/schemas/iis.xsd @@ -431,6 +431,7 @@ Used to install and unintall certificates. + @@ -740,7 +741,22 @@ - For IP address "All Unassigned", do not specify this attribute or specify its value as "*". + + The IP address to locate an existing WebSite or create a new WebSite. When the WebAddress is part of a WebSite element + used to locate an existing web site the following rules are used: + + When this attribute is not specified only the “All Unassigned†IP address will be located. + When this attribute is explicitly specified only the specified IP address will be located. + When this attribute has the value “*†then any IP address including the “All Unassigned†IP address will be located + + When the WebAddress is part of a WebSite element used to create a new web site the following rules are used: + + When this attribute is not specified or the value is "*" the "All Unassigned" IP address will be used. + When this attribute is explicitly specified the IP address will use that value. + + The IP attribute can contain a formatted string that is processed at install time to insert the values of properties using + [PropertyName] syntax. + @@ -918,7 +934,14 @@ - Optional attribute to directly specify the site id of the WebSite. Use this to ensure all web sites in a web garden get the same site id. Be sure the site id is unique. Must be a number or a formatted value that resolves to a number or blank. + + Optional attribute to directly specify the site id of the WebSite. Use this to ensure all web + sites in a web garden get the same site id. If a number is provided, the site id must be unique + on all target machines. If "*" is used, the Description attribute will be hashed to create a unique + value for the site id. This value must be a positive number or a "*" or a formatted value that resolves + to "-1" (for the same behavior as "*") or a positive number or blank. If this attribute is absent then + the web site will be located using the WebAddress element associated with the web site. + diff --git a/data/schemas/netfx.xsd b/data/schemas/netfx.xsd index 01fb3c1d52..405f61cfd9 100644 --- a/data/schemas/netfx.xsd +++ b/data/schemas/netfx.xsd @@ -51,9 +51,9 @@ The identifier of the directory to use for locating dependent assemblies. - For DLL assemblies and assemblies installed to the GAC, this attribute - should be set to the directory of the application which loads this assembly. - For EXE assemblies, this attribute does not need to be set because NGen + For DLL assemblies and assemblies installed to the Global Assembly Cache (GAC), + this attribute should be set to the directory of the application which loads this + assembly. For EXE assemblies, this attribute does not need to be set because NGen will use the directory of the assembly file by default. diff --git a/data/schemas/util.xsd b/data/schemas/util.xsd index 20ae911b68..8b972637a3 100644 --- a/data/schemas/util.xsd +++ b/data/schemas/util.xsd @@ -124,6 +124,13 @@ + + + + Marks the EventSource registry as the key path of the component it belongs to. + + + Name of the event source's log. @@ -291,12 +298,28 @@ - Group for all kinds of things + + Finds user groups on the local machine or specified Active Directory domain. The local machine will be + searched for the group first then fallback to looking in Active Directory. This element is not capable + of creating new groups but can be used to add new or existing users to an existing group. + - - - + + + Unique identifier in your installation package for this group. + + + + + A Formatted string that contains the name of the group to be found. + + + + + An optional Formatted string that specifies the domain for the group. + + @@ -460,6 +483,7 @@ + Used to install Perfmon counters. @@ -657,6 +681,8 @@ Service configuration information for failure actions. + + Nesting a ServiceConfig element under a ServiceInstall element will result in the service being installed to be configured. @@ -751,19 +777,33 @@ + + A Formatted string that contains the name of the user account. + + + A Formatted string that contains the local machine or Active Directory domain for the user. + Usually a Property that is passed in on the command-line to keep it more secure. - - + + + The account's password never expires. Equivalent to UF_DONT_EXPIRE_PASSWD. + + + + + The user cannot change the account's password. Equivalent to UF_PASSWD_CANT_CHANGE. + + - Indicates whether the user account should be left behind on uninstall. + Indicates whether the user account should be removed or left behind on uninstall. @@ -786,7 +826,11 @@ Indicates whether the user must change their password on their first login. - + + + The account is disabled. Equivalent to UF_ACCOUNTDISABLE. + + Indicates whether or not to create the user. User creation can be skipped if all that is desired is to join a user to groups. @@ -812,7 +856,7 @@ - The XPath of the element to be modified. Note that this is a formatted field and therefore, square brackets in the XPath must be escapted. + The XPath of the element to be modified. Note that this is a formatted field and therefore, square brackets in the XPath must be escaped. diff --git a/data/schemas/wix.xsd b/data/schemas/wix.xsd index f6860af577..a7ea0c6c8d 100644 --- a/data/schemas/wix.xsd +++ b/data/schemas/wix.xsd @@ -2415,9 +2415,10 @@ - + - + + Unique identifier for the shortcut. This value will serve as the primary key for the row. @@ -2581,6 +2582,27 @@ + + + + + + + Property values for a shortcut. + + + + Unique identifier for MsiShortcutProperty table. If omitted, a stable identifier will be generated from the parent shortcut identifier and Key value. + + + Sets a default value for the property. The value will be overwritten if the Property is used for a search. + + + Sets a default value for the property. The value will be overwritten if the Property is used for a search. + + + + @@ -2662,6 +2684,41 @@ + + + + Sets ACLs on File, Registry, or CreateFolder. When under a Registry element, this cannot be used + if the Action attribute's value is remove or removeKeyOnInstall. This element is only available + when installing with MSI 5.0. For downlevel support, see the PermissionEx element from the + WixUtilExtension. + + + + + + + + + + Optional condition that controls whether the permissions are applied. + + + + + + + Primary key used to identify this particular entry. If this is not specified the parent element's Id attribute + will be used instead. + + + + + Security descriptor to apply to parent object. + + + + + @@ -2790,6 +2847,9 @@ Used to configure the ACLs for this file. + + Can also configure the ACLs for this file. + Used to create a duplicate of this file elsewhere. @@ -2919,7 +2979,7 @@ Specifies if this File is a Win32 Assembly or .NET Assembly that needs to be installed into the - Global Assembly Cache. If the value is '.net' or 'win32', this file must also be the key path of the Component. + Global Assembly Cache (GAC). If the value is '.net' or 'win32', this file must also be the key path of the Component. @@ -2962,7 +3022,7 @@ Specifies the file identifier of the application file. This assembly will be isolated to the same directory as the application file. - If this attribute is absent, the assembly will be installed to the Global Assembly Cache. + If this attribute is absent, the assembly will be installed to the Global Assembly Cache (GAC). This attribute may only be specified if the Assembly attribute is set to '.net' or 'win32'. @@ -3006,7 +3066,7 @@ Specifies the Media this File should be sourced on. This attribute overrides the default DiskId attribute from the parent Component element. If no DiskId attribute is specifed, the default is "1". - Specifies the path to the File in the build process. This attribute must be set if no source information can be gathered from parent directories. + Specifies the path to the File in the build process. Overrides default source path set by parent directories and Name attribute. This attribute must be set if no source information can be gathered from parent directories. For more information, see Specifying source files. @@ -3072,6 +3132,9 @@ ACL permission + + Can also configure the ACLs for this registry key. + @@ -3158,6 +3221,9 @@ + + Can also configure the ACLs for this registry value. + @@ -3422,6 +3488,9 @@ + + Can also configure the ACLs for this registry key. + @@ -3769,6 +3838,9 @@ ACL permission + + Can also configure the ACLs for this folder. + @@ -4486,8 +4558,12 @@ The Class identifier (CLSID) of a COM server. - - The server context(s) for this server. + + + The server context(s) for this COM server. This attribute is optional for VB6 libraries that are marked "PublicNotCreateable". + Class elements marked Advertised must specify at least one server context. It is most common for there to be a single value + for the Context attribute. + @@ -4659,6 +4735,9 @@ Name for COM Interface. + + Identifies the interface from which the current interface is derived. + GUID CLSID for proxy stub to COM Interface. @@ -4741,6 +4820,8 @@ ordered list of dependencies when installing services + + @@ -4750,8 +4831,11 @@ - - Unique identifier for this service. + + + Unique identifier for this service configuration. This value will default to the Name attribute if not + specified. + This column is the string that gives the service name to install. @@ -5015,6 +5099,177 @@ + + + + Privilege required by service configured by ServiceConfig parent. Valid values are a privilege constant or a + Formatted property that resolves to a privilege constant. + + + + + + + + + + + Configures a service being installed or one that already exists. + + + + + + + + + List of privileges to apply to service. + + + + + + Unique identifier for this service configuration. This value will default to the ServiceName attribute if not + specified. + + + + + This attribute specifies whether an auto-start service should delay its start until after all other auto-start + services. This attribute only affects auto-start services. Allowed values are "yes", "no" or a Formatted property that + resolves to "1" (for "yes") or "0" (for "no"). If this attribute is not present the setting is not configured. + + + + + This attribute specifies when failure actions should be applied. Allowed values are "failedToStop", "failedToStopOrReturnedError" + or a Formatted property that resolves to "1" (for "failedToStopOrReturnedError") or "0" (for "failedToStop"). If this attribute + is not present the setting is not configured. + + + + + This attribute specifies time in milliseconds that the Service Control Manager (SCM) waits after notifying the service of a system + shutdown. If this attribute is not present the default value, 3 minutes, is used. + + + + + Specifies whether to configure the service when the parent Component is installed. This attribute may be combined with OnReinstall + and OnUninstall. + + + + + Specifies whether to configure the service when the parent Component is reinstalled. This attribute may be combined with OnInstall + and OnUninstall. + + + + + Specifies whether to configure the service when the parent Component is uninstalled. This attribute may be combined with OnInstall + and OnReinstall. + + + + + Specifies the name of the service to configure. This value will default to the ServiceInstall/@Name attribute when nested under + a ServiceInstall element. + + + + + Specifies the service SID to apply to the service. Valid values are "none", "restricted", "unrestricted" or a Formatted property + that resolves to "0" (for "none"), "3" (for "restricted") or "1" (for "unrestricted"). If this attribute is not present the + setting is not configured. + + + + + + + Failure action for a ServiceConfigFailureActions element. + + + + Specifies the action to take when the service fails. Valid values are "none", "restartComputer", "restartService", "runCommand" or a Formatted property + that resolves to "0" (for "none"), "1" (for "restartService"), "2" (for "restartComputer") or "3" (for "runCommand"). + + + + + Specifies the time in milliseconds to wait before performing the value from the Action attribute. + + + + + + + + + Configures the failure actions for a service being installed or one that already exists. + + + + + + + + + Ordered list of failure actions to apply to service. + + + + + + Unique identifier for this service configuration. This value will default to the ServiceName attribute if not + specified. + + + + + This attribute specifies command to execute when a "runCommand" failure action hit. If an empty string is provided it clears + the existing command. If this attribute is not present the setting is not changed. + + + + + Specifies whether to configure the service when the parent Component is installed. This attribute may be combined with OnReinstall + and OnUninstall. + + + + + Specifies whether to configure the service when the parent Component is reinstalled. This attribute may be combined with OnInstall + and OnUninstall. + + + + + Specifies whether to configure the service when the parent Component is uninstalled. This attribute may be combined with OnInstall + and OnReinstall. + + + + + Specifies the message to show for a reboot failure action. If an empty string is provided it clears any existing reboot message. If this + attribute is not present the setting is not changed. + + + + + Specifies the time in seconds to reset the failure count. If this attribute is not present the failure count will not be reset. + + + + + Specifies the name of the service to configure. This value will default to the ServiceInstall/@Name attribute when nested under + a ServiceInstall element. + + + + + @@ -5281,6 +5536,8 @@ + + @@ -5736,7 +5993,7 @@ - Used to set the file system source for this directory's child elements. + Used to set the file system source for this directory's child elements. For more information, see Specifying source files. @@ -5855,7 +6112,7 @@ - Used to set the file system source for this DirectoryRef's child elements. + Used to set the file system source for this DirectoryRef's child elements. For more information, see Specifying source files. @@ -8480,6 +8737,7 @@ If the Property attribute is specified, set the value of this attribute to the new value for the property. To set a property to null, do not set this attribute (the ControlEvent Argument column will be set to '{}'). Otherwise, this attribute's value should be the argument for the event specified in the Event attribute. + If the event doesn't take an attribute, a common value to use is "0". @@ -9300,6 +9558,7 @@ + From dcbc8d5fdd2d8c9e1076d49628e88670f17e3a3f Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 18 Jan 2009 15:15:57 +0000 Subject: [PATCH 28/68] added support for implicitly typed local variables in ExtractMethod, now the type is resolved before using it as a parameter in the new method's signature. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3762 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/CSharpMethodExtractor.cs | 34 ++++++++++++++----- .../Src/MethodExtractorBase.cs | 30 +++++++++++++--- 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/AddIns/Misc/SharpRefactoring/Src/CSharpMethodExtractor.cs b/src/AddIns/Misc/SharpRefactoring/Src/CSharpMethodExtractor.cs index d8533548d2..a5270e477f 100644 --- a/src/AddIns/Misc/SharpRefactoring/Src/CSharpMethodExtractor.cs +++ b/src/AddIns/Misc/SharpRefactoring/Src/CSharpMethodExtractor.cs @@ -4,7 +4,7 @@ // // $Revision: 3287 $ // -using ICSharpCode.SharpDevelop; +using ICSharpCode.TextEditor; using System; using System.Collections.Generic; using System.Diagnostics; @@ -15,6 +15,7 @@ using ICSharpCode.NRefactory.Ast; using ICSharpCode.NRefactory.AstBuilder; using ICSharpCode.NRefactory.PrettyPrinter; using ICSharpCode.NRefactory.Visitors; +using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver; using ICSharpCode.SharpDevelop.Project; using ICSharpCode.TextEditor.Document; @@ -116,13 +117,23 @@ namespace SharpRefactoring Location end = new Location(this.currentSelection.EndPosition.Column + 1, this.currentSelection.EndPosition.Line + 1); foreach (KeyValuePair> pair in ltv.Variables) { - foreach (LocalLookupVariable variable in pair.Value) { + foreach (LocalLookupVariable v in pair.Value) { + Variable variable = new Variable(v); if (variable.StartPos > end || variable.EndPos < start) continue; + variable.IsReferenceType = true; // TODO : implement check for reference type + + if (variable.Type.Type == "var") { + Dom.ParseInformation info = ParserService.GetParseInformation(this.textEditor.FileName); + Dom.ExpressionResult res = new Dom.ExpressionResult(variable.Name, Dom.DomRegion.FromLocation(variable.StartPos, variable.EndPos), Dom.ExpressionContext.Default, null); + Dom.ResolveResult result = this.GetResolver().Resolve(res, info, this.textEditor.Document.TextContent); + variable.Type = Dom.Refactoring.CodeGenerator.ConvertType(result.ResolvedType, new Dom.ClassFinder(result.CallingMember)); + } + if (IsInSel(variable.StartPos, this.currentSelection) && HasOccurrencesAfter(true, this.parentNode, new Location(this.currentSelection.EndPosition.Column + 1, this.currentSelection.EndPosition.Line + 1), variable.Name, variable.StartPos, variable.EndPos)) { - possibleReturnValues.Add(new VariableDeclaration(variable.Name, variable.Initializer, variable.TypeRef)); - otherReturnValues.Add(new VariableDeclaration(variable.Name, variable.Initializer, variable.TypeRef)); + possibleReturnValues.Add(new VariableDeclaration(variable.Name, variable.Initializer, variable.Type)); + otherReturnValues.Add(new VariableDeclaration(variable.Name, variable.Initializer, variable.Type)); } FindReferenceVisitor frv = new FindReferenceVisitor(true, variable.Name, start, end); @@ -136,18 +147,18 @@ namespace SharpRefactoring bool getsAssigned = pair.Value.Count > 0; if (hasOccurrencesAfter && isInitialized) - newMethod.Parameters.Add(new ParameterDeclarationExpression(variable.TypeRef, variable.Name, ParameterModifiers.Ref)); + newMethod.Parameters.Add(new ParameterDeclarationExpression(variable.Type, variable.Name, ParameterModifiers.Ref)); else { if (hasOccurrencesAfter && hasAssignment) - newMethod.Parameters.Add(new ParameterDeclarationExpression(variable.TypeRef, variable.Name, ParameterModifiers.Out)); + newMethod.Parameters.Add(new ParameterDeclarationExpression(variable.Type, variable.Name, ParameterModifiers.Out)); else { if (!hasOccurrencesAfter && getsAssigned) - newMethod.Parameters.Add(new ParameterDeclarationExpression(variable.TypeRef, variable.Name, ParameterModifiers.None)); + newMethod.Parameters.Add(new ParameterDeclarationExpression(variable.Type, variable.Name, ParameterModifiers.None)); else { if (!hasOccurrencesAfter && !isInitialized) - newMethod.Body.Children.Insert(0, new LocalVariableDeclaration(new VariableDeclaration(variable.Name, variable.Initializer, variable.TypeRef))); + newMethod.Body.Children.Insert(0, new LocalVariableDeclaration(new VariableDeclaration(variable.Name, variable.Initializer, variable.Type))); else - newMethod.Parameters.Add(new ParameterDeclarationExpression(variable.TypeRef, variable.Name, ParameterModifiers.In)); + newMethod.Parameters.Add(new ParameterDeclarationExpression(variable.Type, variable.Name, ParameterModifiers.In)); } } } @@ -187,5 +198,10 @@ namespace SharpRefactoring { return new CSharpOutputVisitor(); } + + public override Dom.IResolver GetResolver() + { + return new NRefactoryResolver(Dom.LanguageProperties.CSharp); + } } } diff --git a/src/AddIns/Misc/SharpRefactoring/Src/MethodExtractorBase.cs b/src/AddIns/Misc/SharpRefactoring/Src/MethodExtractorBase.cs index 7dea6962b4..10341c6e4a 100644 --- a/src/AddIns/Misc/SharpRefactoring/Src/MethodExtractorBase.cs +++ b/src/AddIns/Misc/SharpRefactoring/Src/MethodExtractorBase.cs @@ -9,13 +9,13 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Text; - using ICSharpCode.Core; using ICSharpCode.NRefactory; using ICSharpCode.NRefactory.Ast; using ICSharpCode.NRefactory.PrettyPrinter; using ICSharpCode.NRefactory.Visitors; using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver; using ICSharpCode.SharpDevelop.Project; using ICSharpCode.TextEditor; using ICSharpCode.TextEditor.Document; @@ -260,7 +260,7 @@ namespace SharpRefactoring return false; } - protected bool IsInitializedVariable(bool caseSensitive, ParametrizedNode member, LocalLookupVariable variable) + protected bool IsInitializedVariable(bool caseSensitive, ParametrizedNode member, Variable variable) { if (!(variable.Initializer.IsNull)) { return true; @@ -279,9 +279,11 @@ namespace SharpRefactoring return false; } - protected static bool HasAssignment(MethodDeclaration method, LocalLookupVariable variable) + + + protected static bool HasAssignment(MethodDeclaration method, Variable variable) { - HasAssignmentsVisitor hav = new HasAssignmentsVisitor(variable.Name, variable.TypeRef, variable.StartPos, variable.EndPos); + HasAssignmentsVisitor hav = new HasAssignmentsVisitor(variable.Name, variable.Type, variable.StartPos, variable.EndPos); method.AcceptVisitor(hav, null); @@ -291,5 +293,25 @@ namespace SharpRefactoring public abstract IOutputAstVisitor GetOutputVisitor(); public abstract bool Extract(); + + public abstract Dom.IResolver GetResolver(); + } + + public class Variable { + public TypeReference Type { get; set; } + public string Name { get; set; } + public Location StartPos { get; set; } + public Location EndPos { get; set; } + public Expression Initializer { get; set; } + public bool IsReferenceType { get; set; } + + public Variable(LocalLookupVariable v) + { + this.Type = v.TypeRef; + this.Name = v.Name; + this.StartPos = v.StartPos; + this.EndPos = v.EndPos; + this.Initializer = v.Initializer; + } } } From 885afa299e6d1e24b29e396596d672c272628584 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 18 Jan 2009 20:34:34 +0000 Subject: [PATCH 29/68] More debug output when building (trying to find the cause of SD2-1485). Run IProject.StartBuild on its own thread, so it runs outside of any locks taken by the build engine. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3763 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Project/CSharpProject.cs | 2 +- .../Project/Src/Project/VBNetProject.cs | 2 +- .../Test/Output/CSharp/CSharpOutputTest.cs | 6 ++++++ .../Base/Project/Configuration/AssemblyInfo.cs | 1 + .../Src/Gui/Workbench/SingleInstanceHelper.cs | 4 ++-- src/Main/Base/Project/Src/Project/BuildEngine.cs | 14 ++++++++++---- .../Base/Project/Src/Project/IBuildFeedbackSink.cs | 2 +- src/Main/Base/Project/Src/Project/MSBuildEngine.cs | 6 +++++- .../Core/Project/Configuration/AssemblyInfo.cs | 2 ++ .../ICSharpCode.Core.WinForms/Menu/MenuCommand.cs | 2 +- .../Properties/AssemblyInfo.cs | 9 +++++++-- .../ToolBar/ToolBarCommand.cs | 2 +- .../Program.cs | 5 ++++- .../Project/Configuration/AssemblyInfo.cs | 2 ++ src/Main/StartUp/Project/app.template.config | 6 ++++++ 15 files changed, 50 insertions(+), 15 deletions(-) diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs index 6d569a37b8..07efeaaee4 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs @@ -88,7 +88,7 @@ namespace CSharpBinding public override void StartBuild(ProjectBuildOptions options, IBuildFeedbackSink feedbackSink) { - if (this.MinimumSolutionVersion == 9) { + if (this.MinimumSolutionVersion == Solution.SolutionVersionVS2005) { MSBuildEngine.StartBuild(this, options, feedbackSink, diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs index 67510354bb..c21bb6db35 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs @@ -109,7 +109,7 @@ namespace VBNetBinding public override void StartBuild(ProjectBuildOptions options, IBuildFeedbackSink feedbackSink) { - if (this.MinimumSolutionVersion == 9) { + if (this.MinimumSolutionVersion == Solution.SolutionVersionVS2005) { MSBuildEngine.StartBuild(this, options, feedbackSink, diff --git a/src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs b/src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs index 54e5780d22..57de764725 100644 --- a/src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs +++ b/src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs @@ -107,6 +107,12 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter TestProgram("public class Foo where T : IDisposable, ICloneable { }"); } + [Test] + public void InterfaceWithOutParameters() + { + TestProgram("public interface ITest { void Method(out int a, ref double b); }"); + } + [Test] public void GenericClassDefinitionWithBaseType() { diff --git a/src/Main/Base/Project/Configuration/AssemblyInfo.cs b/src/Main/Base/Project/Configuration/AssemblyInfo.cs index 9c07f58a75..b197949a6f 100644 --- a/src/Main/Base/Project/Configuration/AssemblyInfo.cs +++ b/src/Main/Base/Project/Configuration/AssemblyInfo.cs @@ -20,6 +20,7 @@ using System.Runtime.CompilerServices; [assembly: Dependency("ICSharpCode.NRefactory", LoadHint.Always)] [assembly: Dependency("ICSharpCode.SharpDevelop.Dom", LoadHint.Always)] [assembly: Dependency("ICSharpCode.SharpDevelop.Widgets", LoadHint.Always)] +[assembly: Dependency("System.Core", LoadHint.Always)] [assembly: Dependency("System.Drawing", LoadHint.Always)] [assembly: Dependency("System.Xml", LoadHint.Always)] [assembly: Dependency("System.Windows.Forms", LoadHint.Always)] diff --git a/src/Main/Base/Project/Src/Gui/Workbench/SingleInstanceHelper.cs b/src/Main/Base/Project/Src/Gui/Workbench/SingleInstanceHelper.cs index b2f248799f..c9a892ca83 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/SingleInstanceHelper.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/SingleInstanceHelper.cs @@ -25,7 +25,7 @@ namespace ICSharpCode.SharpDevelop.Gui public static bool OpenFilesInPreviousInstance(string[] fileList) { - LoggingService.Debug("Trying to pass arguments to previous instance..."); + LoggingService.Info("Trying to pass arguments to previous instance..."); int currentProcessId = Process.GetCurrentProcess().Id; string currentFile = Assembly.GetEntryAssembly().Location; int number = new Random().Next(); @@ -65,7 +65,7 @@ namespace ICSharpCode.SharpDevelop.Gui return false; long fileNumber = m.WParam.ToInt64(); long openEvenIfProjectIsOpened = m.LParam.ToInt64(); - LoggingService.Debug("Receiving custom message..."); + LoggingService.Info("Receiving custom message..."); if (openEvenIfProjectIsOpened == 0 && ProjectService.OpenSolution != null) { m.Result = new IntPtr(RESULT_PROJECT_IS_OPEN); } else { diff --git a/src/Main/Base/Project/Src/Project/BuildEngine.cs b/src/Main/Base/Project/Src/Project/BuildEngine.cs index 68bcceb99d..c853b0043e 100644 --- a/src/Main/Base/Project/Src/Project/BuildEngine.cs +++ b/src/Main/Base/Project/Src/Project/BuildEngine.cs @@ -107,7 +107,7 @@ namespace ICSharpCode.SharpDevelop.Project EventHandler eh = null; lock (lockObject) { if (isCancelAllowed && !isCancelled) { - ICSharpCode.Core.LoggingService.Debug("Cancel build"); + ICSharpCode.Core.LoggingService.Info("Cancel build"); isCancelled = true; eh = Cancelled; } @@ -261,6 +261,11 @@ namespace ICSharpCode.SharpDevelop.Project this.project = project; } + public void DoStartBuild(object state) + { + project.StartBuild(options, this); + } + public void ReportError(BuildError error) { engine.ReportError(this, error); @@ -416,7 +421,7 @@ namespace ICSharpCode.SharpDevelop.Project hasDependencyErrors |= n.hasErrors; } - ICSharpCode.Core.LoggingService.Debug("Start building " + node.project.Name); + ICSharpCode.Core.LoggingService.Info("Start building " + node.project.Name); runningWorkers++; projectsCurrentlyBuilding.Add(node); if (hasDependencyErrors) { @@ -424,7 +429,8 @@ namespace ICSharpCode.SharpDevelop.Project node.hasErrors = true; node.Done(false); } else { - node.project.StartBuild(node.options, node); + // do not run "DoStartBuild" inside lock - run it async on the thread pool + System.Threading.ThreadPool.QueueUserWorkItem(node.DoStartBuild); } } } @@ -458,7 +464,7 @@ namespace ICSharpCode.SharpDevelop.Project void OnBuildFinished(BuildNode node, bool success) { - ICSharpCode.Core.LoggingService.Debug("Finished building " + node.project.Name); + ICSharpCode.Core.LoggingService.Info("Finished building " + node.project.Name); lock (this) { if (node.buildFinished) { throw new InvalidOperationException("This node already finished building, do not call IBuildFeedbackSink.Done() multiple times!"); diff --git a/src/Main/Base/Project/Src/Project/IBuildFeedbackSink.cs b/src/Main/Base/Project/Src/Project/IBuildFeedbackSink.cs index 647d412305..d4667e7b06 100644 --- a/src/Main/Base/Project/Src/Project/IBuildFeedbackSink.cs +++ b/src/Main/Base/Project/Src/Project/IBuildFeedbackSink.cs @@ -28,7 +28,7 @@ namespace ICSharpCode.SharpDevelop.Project /// /// Notifies the build engine that the build of a project has finished. - /// You sould not call any methods after the Done() call. + /// You should not call any methods after the Done() call. /// This member is thread-safe. /// void Done(bool success); diff --git a/src/Main/Base/Project/Src/Project/MSBuildEngine.cs b/src/Main/Base/Project/Src/Project/MSBuildEngine.cs index 76965b4ff5..af851baab3 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildEngine.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildEngine.cs @@ -224,6 +224,7 @@ namespace ICSharpCode.SharpDevelop.Project if (buildInProcess) { settings.BuildDoneCallback = delegate(bool success) { + LoggingService.Debug("BuildInProcess: Received BuildDoneCallback"); if (Interlocked.Exchange(ref isBuildingInProcess, 0) != 1) { MessageService.ShowError("isBuildingInProcess should have been 1!"); } @@ -233,15 +234,18 @@ namespace ICSharpCode.SharpDevelop.Project Thread thread = new Thread(new ThreadStart( delegate { + LoggingService.Debug("Acquiring InProcessMSBuildLock"); lock (MSBuildInternals.InProcessMSBuildLock) { WorkerManager.RunBuildInProcess(job, settings); + LoggingService.Debug("Leaving InProcessMSBuildLock"); } })); - thread.Name = "InProcess build thread"; + thread.Name = "InProcess build thread " + thread.ManagedThreadId; thread.SetApartmentState(ApartmentState.STA); thread.Start(); } else { settings.BuildDoneCallback = delegate(bool success) { + LoggingService.Debug("BuildOutOfProcess: Received BuildDoneCallback"); logger.FlushCurrentError(); feedbackSink.Done(success); }; diff --git a/src/Main/Core/Project/Configuration/AssemblyInfo.cs b/src/Main/Core/Project/Configuration/AssemblyInfo.cs index 2583bb9518..e626e94bf0 100644 --- a/src/Main/Core/Project/Configuration/AssemblyInfo.cs +++ b/src/Main/Core/Project/Configuration/AssemblyInfo.cs @@ -12,6 +12,8 @@ using System.Runtime.CompilerServices; [assembly: CLSCompliant(true)] [assembly: StringFreezing()] +[assembly: Dependency("System.Xml", LoadHint.Always)] + [assembly: AssemblyTitle("ICSharpCode.Core")] [assembly: AssemblyDescription("The ICSharpCode Core containing the AddInTree and service Subsystem")] [assembly: AssemblyConfiguration("")] diff --git a/src/Main/ICSharpCode.Core.WinForms/Menu/MenuCommand.cs b/src/Main/ICSharpCode.Core.WinForms/Menu/MenuCommand.cs index 7ac040dc5c..4148bcf36c 100644 --- a/src/Main/ICSharpCode.Core.WinForms/Menu/MenuCommand.cs +++ b/src/Main/ICSharpCode.Core.WinForms/Menu/MenuCommand.cs @@ -115,7 +115,7 @@ namespace ICSharpCode.Core.WinForms if (GetVisible() && Enabled) { ICommand cmd = Command; if (cmd != null) { - LoggingService.Debug("Run command " + cmd.GetType().FullName); + LoggingService.Info("Run command " + cmd.GetType().FullName); cmd.Run(); } } diff --git a/src/Main/ICSharpCode.Core.WinForms/Properties/AssemblyInfo.cs b/src/Main/ICSharpCode.Core.WinForms/Properties/AssemblyInfo.cs index f876a4bc0f..cf20b15cca 100644 --- a/src/Main/ICSharpCode.Core.WinForms/Properties/AssemblyInfo.cs +++ b/src/Main/ICSharpCode.Core.WinForms/Properties/AssemblyInfo.cs @@ -12,8 +12,13 @@ using System.Runtime.CompilerServices; [assembly: CLSCompliant(true)] [assembly: StringFreezing()] -[assembly: AssemblyTitle("ICSharpCode.Core")] -[assembly: AssemblyDescription("The ICSharpCode Core containing the AddInTree and service Subsystem")] +[assembly: Dependency("ICSharpCode.Core", LoadHint.Always)] +[assembly: Dependency("System.Xml", LoadHint.Always)] +[assembly: Dependency("System.Drawing", LoadHint.Always)] +[assembly: Dependency("System.Windows.Forms", LoadHint.Always)] + +[assembly: AssemblyTitle("ICSharpCode.Core.WinForms")] +[assembly: AssemblyDescription("Windows Forms binding for ICSharpCode.Core")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/src/Main/ICSharpCode.Core.WinForms/ToolBar/ToolBarCommand.cs b/src/Main/ICSharpCode.Core.WinForms/ToolBar/ToolBarCommand.cs index b9ed747ab6..5a24815823 100644 --- a/src/Main/ICSharpCode.Core.WinForms/ToolBar/ToolBarCommand.cs +++ b/src/Main/ICSharpCode.Core.WinForms/ToolBar/ToolBarCommand.cs @@ -45,7 +45,7 @@ namespace ICSharpCode.Core.WinForms } if (menuCommand != null) { menuCommand.Owner = caller; - LoggingService.Debug("Run command " + menuCommand.GetType().FullName); + LoggingService.Info("Run command " + menuCommand.GetType().FullName); menuCommand.Run(); } } diff --git a/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs b/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs index 9075d1a850..5298997dd7 100644 --- a/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs +++ b/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs @@ -151,7 +151,7 @@ namespace ICSharpCode.SharpDevelop.BuildWorker | ToolsetDefinitionLocations.ConfigurationFile); engine.RegisterLogger(new ForwardingLogger(this)); - engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Diagnostic)); + //engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Diagnostic)); return engine; } @@ -209,13 +209,16 @@ namespace ICSharpCode.SharpDevelop.BuildWorker engine.GlobalProperties.SetProperty(pair.Key, pair.Value); } + Log("Loading " + currentJob.ProjectFileName); Project project = LoadProject(engine, currentJob.ProjectFileName); if (project == null) return false; if (string.IsNullOrEmpty(currentJob.Target)) { + Log("Building default target in " + currentJob.ProjectFileName); return engine.BuildProject(project); } else { + Log("Building target '" + currentJob.Target + "' in " + currentJob.ProjectFileName); return engine.BuildProject(project, currentJob.Target.Split(';')); } } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Configuration/AssemblyInfo.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Configuration/AssemblyInfo.cs index c0c433a20b..c6a53d6d6b 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Configuration/AssemblyInfo.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Configuration/AssemblyInfo.cs @@ -13,6 +13,8 @@ using System.Security.Permissions; [assembly: CLSCompliant(true)] [assembly: StringFreezing()] +[assembly: Dependency("System.Core", LoadHint.Always)] + [assembly: AssemblyTitle("ICSharpCode.SharpDevelop.Dom")] [assembly: AssemblyDescription("Code-completion library")] [assembly: AssemblyConfiguration("")] diff --git a/src/Main/StartUp/Project/app.template.config b/src/Main/StartUp/Project/app.template.config index b47ecd6a89..813be4d64b 100644 --- a/src/Main/StartUp/Project/app.template.config +++ b/src/Main/StartUp/Project/app.template.config @@ -96,6 +96,12 @@ + + + + + + From 02d3d085d2ca8c8f1c4bbcb33f8e04945aa24f25 Mon Sep 17 00:00:00 2001 From: Robert Pickering Date: Mon, 19 Jan 2009 22:04:49 +0000 Subject: [PATCH 30/68] Build F# plugin with --standalone switch to avoid dependency problems. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3764 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/FSharpBinding.fsproj | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/FSharpBinding.fsproj b/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/FSharpBinding.fsproj index e97aa5d25e..9d0d2c94ec 100644 --- a/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/FSharpBinding.fsproj +++ b/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/FSharpBinding.fsproj @@ -30,6 +30,9 @@ prompt 3 + + --standalone + @@ -56,6 +59,84 @@ System.Configuration System.configuration.dll + + System.Security + System.Security.dll + + + System.Web + System.Web.dll + + + System.EnterpriseServices + System.EnterpriseServices.dll + + + System.Runtime.Remoting + System.Runtime.Remoting.dll + + + System.DirectoryServices + System.DirectoryServices.dll + + + System.Runtime.Serialization.Formatters.Soap + System.Runtime.Serialization.Formatters.Soap.dll + + + System.Transactions + System.Transactions.dll + + + System.DirectoryServices.Protocols + System.DirectoryServices.Protocols.dll + + + System.Web.RegularExpressions + System.Web.RegularExpressions.dll + + + System.Web.Services + System.Web.Services.dll + + + System.Data + System.Data.dll + + + System.Design + System.Design.dll + + + System.Drawing.Design + System.Drawing.Design.dll + + + System.Deployment + System.Deployment.dll + + + Accessibility + Accessibility.dll + + + System.Data.OracleClient + System.Data.OracleClient.dll + + + System.ServiceProcess + System.ServiceProcess.dll + + + System.Configuration.Install + System.Configuration.Install.dll + + + + + Microsoft.VisualC + Microsoft.VisualC.dll + 3.5 @@ -71,6 +152,24 @@ System.Xml System.XML.dll + + log4net + ..\..\..\..\..\Libraries\log4net\log4net.dll + + + Mono.Cecil + ..\..\..\..\..\Libraries\Mono.Cecil.dll + + + WeifenLuo.WinFormsUI.Docking + ..\..\..\..\..\Libraries\SHFB\WeifenLuo.WinFormsUI.Docking.dll + + + + ICSharpCode.Core.WinForms + {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288} + True + ICSharpCode.TextEditor {2d18be89-d210-49eb-a9dd-2246fbb3df6d} From a8dd913eb112a5b08c3e78bec8f7391ad57a45d2 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 20 Jan 2009 17:46:19 +0000 Subject: [PATCH 31/68] Fixed build. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3765 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Boo/BooBinding/Test/ResolverTests.cs | 2 +- .../NRefactoryRefactoringProviderTests.cs | 50 ++++++------------- src/Main/StartUp/Project/app.template.config | 5 ++ 3 files changed, 22 insertions(+), 35 deletions(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs index 616128efae..776362b231 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs @@ -59,7 +59,7 @@ namespace Grunwald.BooBinding.Tests pc.ReferencedContents.Add(booLangPC); ICompilationUnit cu = new BooParser().Parse(pc, fileName, prog); ParserService.RegisterParseInformation(fileName, cu); - cu.Classes.Foreach(pc.AddClassToNamespaceList); + cu.Classes.ForEach(pc.AddClassToNamespaceList); } void GetPos(string prog, string marker, out int line, out int column) diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Tests/ICSharpCode.SharpDevelop.Dom.Tests/NRefactoryRefactoringProviderTests.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Tests/ICSharpCode.SharpDevelop.Dom.Tests/NRefactoryRefactoringProviderTests.cs index b13ea87e45..ae5596c466 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Tests/ICSharpCode.SharpDevelop.Dom.Tests/NRefactoryRefactoringProviderTests.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Tests/ICSharpCode.SharpDevelop.Dom.Tests/NRefactoryRefactoringProviderTests.cs @@ -52,7 +52,7 @@ namespace ExtractInterface.Tests { string Configure {set;} IList GetRange(string subject); - int MultiplyBy5(int x, + int MultiplyBy5(int x, out bool success); event EventHandler ConfigurationChanged; @@ -60,17 +60,17 @@ namespace ExtractInterface.Tests { } "; } - + private class TestClass { public const string FileName = "TestCase.cs"; - + // TODO: write TestClass.FileContent to refactor the string literal code blocks // from the following tests. public const string FileContent = @""; } #region Sanity Test - + [Test] /// /// ensures that the custom assertions in this test fixture are working properly @@ -151,12 +151,8 @@ namespace ExtractInterfaceImplicitPropertyTest { string sourceClassName = c.Name; string sourceNamespace = c.Namespace; - string interfaceCode = csharpRefactoringProvider.GenerateInterfaceForClass(interfaceName, - membersToExtract, - false, - sourceNamespace, - sourceClassName, - fileContent); + string interfaceCode = csharpRefactoringProvider.GenerateInterfaceForClass( + interfaceName, fileContent, membersToExtract, c, false); ICompilationUnit icu = helper.Parse(TestClass.FileName, interfaceCode); IClass i = icu.Classes[0]; @@ -206,12 +202,8 @@ namespace ExtractInterfaceImplicitPropertyTest { string sourceClassName = c.Name; string sourceNamespace = c.Namespace; - string interfaceCode = csharpRefactoringProvider.GenerateInterfaceForClass(interfaceName, - membersToExtract, - false, - sourceNamespace, - sourceClassName, - fileContent); + string interfaceCode = csharpRefactoringProvider.GenerateInterfaceForClass( + interfaceName, fileContent, membersToExtract, c, false); ICompilationUnit icu = helper.Parse(TestClass.FileName, interfaceCode); IClass i = icu.Classes[0]; @@ -265,12 +257,8 @@ namespace ExtractInterfaceImplicitPropertyTest { string sourceClassName = c.Name; string sourceNamespace = c.Namespace; - string interfaceCode = csharpRefactoringProvider.GenerateInterfaceForClass(interfaceName, - membersToExtract, - false, - sourceNamespace, - sourceClassName, - fileContent); + string interfaceCode = csharpRefactoringProvider.GenerateInterfaceForClass( + interfaceName, fileContent, membersToExtract, c, false); ICompilationUnit icu = helper.Parse(ITestClass.FileName, interfaceCode); IClass i = icu.Classes[0]; @@ -331,12 +319,8 @@ namespace ExtractInterfaceImplicitPropertyTest { string sourceClassName = c.Name; string sourceNamespace = c.Namespace; - string interfaceCode = csharpRefactoringProvider.GenerateInterfaceForClass(interfaceName, - membersToExtract, - false, - sourceNamespace, - sourceClassName, - fileContent); + string interfaceCode = csharpRefactoringProvider.GenerateInterfaceForClass( + interfaceName, fileContent, membersToExtract, c, false); ICompilationUnit icu = helper.Parse(ITestClass.FileName, interfaceCode); IClass i = icu.Classes[0]; @@ -354,6 +338,8 @@ namespace ExtractInterfaceImplicitPropertyTest { } [Test] + [Ignore("This test is not necessary: we shouldn't require that GenerateInterfaceForClass ignores static methods, " + + "they cannot be selected as memberToExtract in the UI anyways.")] public void GenerateInterfaceWithStaticMethodsTest() { string fileContent = @" using System; @@ -390,12 +376,8 @@ namespace ExtractInterfaceImplicitPropertyTest { string sourceClassName = c.Name; string sourceNamespace = c.Namespace; - string interfaceCode = csharpRefactoringProvider.GenerateInterfaceForClass(interfaceName, - membersToExtract, - false, - sourceNamespace, - sourceClassName, - fileContent); + string interfaceCode = csharpRefactoringProvider.GenerateInterfaceForClass( + interfaceName, fileContent, membersToExtract, c, false); ICompilationUnit icu = helper.Parse(ITestClass.FileName, interfaceCode); IClass i = icu.Classes[0]; diff --git a/src/Main/StartUp/Project/app.template.config b/src/Main/StartUp/Project/app.template.config index 813be4d64b..ff1d56b167 100644 --- a/src/Main/StartUp/Project/app.template.config +++ b/src/Main/StartUp/Project/app.template.config @@ -70,6 +70,7 @@ + @@ -96,12 +97,14 @@ + + @@ -109,12 +112,14 @@ + + From 086444c2e326180c20e411551b9c351e13bf9915 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 20 Jan 2009 19:04:52 +0000 Subject: [PATCH 32/68] Trying to fix build of F# binding. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3766 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/FSharpBinding.fsproj | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/FSharpBinding.fsproj b/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/FSharpBinding.fsproj index 9d0d2c94ec..995d720fcf 100644 --- a/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/FSharpBinding.fsproj +++ b/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/FSharpBinding.fsproj @@ -50,10 +50,18 @@ + + ..\..\..\..\..\Libraries\log4net\log4net.dll + False + Microsoft.Build.Engine Microsoft.Build.Engine.dll + + ..\..\..\..\..\Libraries\Mono.Cecil\Mono.Cecil.dll + False + System.Configuration @@ -131,8 +139,6 @@ System.Configuration.Install System.Configuration.Install.dll - - Microsoft.VisualC Microsoft.VisualC.dll @@ -152,68 +158,62 @@ System.Xml System.XML.dll - - log4net - ..\..\..\..\..\Libraries\log4net\log4net.dll - - - Mono.Cecil - ..\..\..\..\..\Libraries\Mono.Cecil.dll - - - WeifenLuo.WinFormsUI.Docking - ..\..\..\..\..\Libraries\SHFB\WeifenLuo.WinFormsUI.Docking.dll - - ICSharpCode.Core.WinForms {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288} - True + False ICSharpCode.TextEditor {2d18be89-d210-49eb-a9dd-2246fbb3df6d} - True + False NRefactory {3a9ae6aa-bc07-4a2f-972c-581e3ae2f195} - True + False ICSharpCode.SharpDevelop {2748ad25-9c63-4e12-877b-4dce96fbed54} - True + False ICSharpCode.Core {35cef10f-2d4c-45f2-9dd1-161e0fec583c} - True - - - ICSharpCode.SharpDevelop.BuildWorker - {c3cbc8e3-81d8-4c5b-9941-dccd12d50b1f} - True + False ICSharpCode.SharpDevelop.Dom {924ee450-603d-49c1-a8e5-4afaa31ce6f3} - True + False ICSharpCode.SharpDevelop.Widgets {8035765f-d51f-4a0c-a746-2fd100e19419} - True + False + + + + + {D3C782BA-178E-4235-A3BA-8C11DEBB6BEE} + WinFormsUI + False + + + {C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F} + ICSharpCode.SharpDevelop.BuildWorker + False - - - - - - - - - + + + + + + + + + \ No newline at end of file From 3b591a0b8dda3890c3dbb5cdefd3eeb46a76a727 Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Tue, 20 Jan 2009 19:58:18 +0000 Subject: [PATCH 33/68] Release candidate designation for setup git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3767 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/Setup/Setup.wxs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Setup/Setup.wxs b/src/Setup/Setup.wxs index 156db0b61c..040e007c28 100644 --- a/src/Setup/Setup.wxs +++ b/src/Setup/Setup.wxs @@ -8,7 +8,7 @@ --> Date: Wed, 21 Jan 2009 15:40:52 +0000 Subject: [PATCH 34/68] Fixed SD2-1510: Too slow startup when DesignerViewContent.cs was open git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3768 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/CecilReader.cs | 5 +- .../Src/Implementations/DefaultClass.cs | 128 ++++++++++++------ .../Src/ReflectionLayer/ReflectionClass.cs | 7 +- 3 files changed, 94 insertions(+), 46 deletions(-) diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CecilReader.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CecilReader.cs index 461566feb4..4977256f0f 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CecilReader.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CecilReader.cs @@ -174,12 +174,15 @@ namespace ICSharpCode.SharpDevelop.Dom || type.BaseType.FullName == "System.MulticastDelegate"; } + protected override bool KeepInheritanceTree { + get { return true; } + } + public CecilClass(ICompilationUnit compilationUnit, IClass declaringType, TypeDefinition td, string fullName) : base(compilationUnit, declaringType) { this.FullyQualifiedName = fullName; - this.KeepInheritanceTree = true; AddAttributes(compilationUnit.ProjectContent, this.Attributes, td.CustomAttributes); diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs index 20b8f45561..607f0390af 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs @@ -6,8 +6,9 @@ // using System; -using System.Linq; using System.Collections.Generic; +using System.Linq; +using System.Threading; namespace ICSharpCode.SharpDevelop.Dom { @@ -373,59 +374,102 @@ namespace ICSharpCode.SharpDevelop.Dom return CompareTo((IClass)o); } - volatile List inheritanceTreeCache; + sealed class InheritanceTreeCache + { + internal IClass[] inheritanceTree; + internal bool isCreating; + } + + volatile InheritanceTreeCache inheritanceTreeCache; public IEnumerable ClassInheritanceTree { get { - List visitedList = inheritanceTreeCache; - if (visitedList != null) - return visitedList; - visitedList = new List(); - Queue typesToVisit = new Queue(); - bool enqueuedLastBaseType = false; - bool hasErrors = false; - IClass currentClass = this; - IReturnType nextType; - do { - if (currentClass != null) { - if (!visitedList.Contains(currentClass)) { - visitedList.Add(currentClass); - foreach (IReturnType type in currentClass.BaseTypes) { - typesToVisit.Enqueue(type); - } - } - } - if (typesToVisit.Count > 0) { - nextType = typesToVisit.Dequeue(); - } else { - nextType = enqueuedLastBaseType ? null : GetBaseTypeByClassType(this); - enqueuedLastBaseType = true; - } - if (nextType != null) { - currentClass = nextType.GetUnderlyingClass(); - if (currentClass == null) - hasErrors = true; - } - } while (nextType != null); + // Notes: + // the ClassInheritanceTree must work even if the following things happen: + // - cyclic inheritance + // - multithreaded calls + // - recursive calls (the SearchType request done by GetUnderlyingClass() uses ClassInheritanceTree) + // Especially the recursive calls are tricky, this has caused incorrect behavior (SD2-1474) + // or performance problems (SD2-1510) in the past. + // get the inheritanceTreeCache, creating it if required + // (on demand-creation saves memory - lots of classes never need a ClassInheritanceTree) + InheritanceTreeCache inheritanceTreeCache = this.inheritanceTreeCache; + if (inheritanceTreeCache == null) { + // but ensure only one is created, even when ClassInheritanceTree is called by multiple threads + InheritanceTreeCache newCache = new InheritanceTreeCache(); + #pragma warning disable 420 + // Warning CS0420: 'ICSharpCode.SharpDevelop.Dom.DefaultClass.inheritanceTreeCache': a reference to a volatile field will not be treated as volatile + // We disable this warning because Interlocked.* treats the location as volatile, even though + // normally ref-parameters in C# lose the volatile modifier. + inheritanceTreeCache = Interlocked.CompareExchange(ref this.inheritanceTreeCache, newCache, null) ?? newCache; + #pragma warning restore 420 + } - // A SearchType request causes the inheritance tree to be generated, but if it was - // this classes' base type that caused the SearchType request, the GetUnderlyingClass() - // will fail and we will produce an incomplete inheritance tree. - // So we don't cache incomplete inheritance trees for parsed classes (fixes SD2-1474). - if (!hasErrors || KeepInheritanceTree) { - inheritanceTreeCache = visitedList; - if (!KeepInheritanceTree) - DomCache.RegisterForClear(delegate { inheritanceTreeCache = null; }); + // now we have the inheritanceTreeCache -> lock on it + lock (inheritanceTreeCache) { + if (inheritanceTreeCache.inheritanceTree == null) { + // inheritance tree does not exist yet + if (inheritanceTreeCache.isCreating) { + // this is a recursive call -> don't produce inheritance tree + return EmptyList.Instance; + } else { + // now produce the actual inheritance tree + inheritanceTreeCache.isCreating = true; + inheritanceTreeCache.inheritanceTree = CalculateClassInheritanceTree(); + inheritanceTreeCache.isCreating = false; + if (!KeepInheritanceTree) + DomCache.RegisterForClear(ClearCachedInheritanceTree); + } + } + + return inheritanceTreeCache.inheritanceTree; } - return visitedList; } } + void ClearCachedInheritanceTree() + { + lock (inheritanceTreeCache) { + inheritanceTreeCache.inheritanceTree = null; + } + } + + IClass[] CalculateClassInheritanceTree() + { + List visitedList = new List(); + Queue typesToVisit = new Queue(); + bool enqueuedLastBaseType = false; + IClass currentClass = this; + IReturnType nextType; + do { + if (currentClass != null) { + if (!visitedList.Contains(currentClass)) { + visitedList.Add(currentClass); + foreach (IReturnType type in currentClass.BaseTypes) { + typesToVisit.Enqueue(type); + } + } + } + if (typesToVisit.Count > 0) { + nextType = typesToVisit.Dequeue(); + } else { + nextType = enqueuedLastBaseType ? null : GetBaseTypeByClassType(this); + enqueuedLastBaseType = true; + } + if (nextType != null) { + currentClass = nextType.GetUnderlyingClass(); + } + } while (nextType != null); + return visitedList.ToArray(); + } + /// /// Specifies whether to keep the inheritance tree when the DomCache is cleared. /// - protected bool KeepInheritanceTree = false; + protected virtual bool KeepInheritanceTree { + get { return false; } + } public IReturnType GetBaseType(int index) { diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/ReflectionClass.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/ReflectionClass.cs index 6d24ab937c..3d444a44e4 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/ReflectionClass.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/ReflectionClass.cs @@ -105,8 +105,6 @@ namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer FullyQualifiedName = fullName; } - this.KeepInheritanceTree = true; - try { AddAttributes(compilationUnit.ProjectContent, this.Attributes, CustomAttributeData.GetCustomAttributes(type)); } catch (Exception ex) { @@ -184,6 +182,9 @@ namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer } } } + + protected override bool KeepInheritanceTree { + get { return true; } + } } - } From aef568859349e3c1641bef352fc4d2aef0d184b8 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 21 Jan 2009 16:35:54 +0000 Subject: [PATCH 35/68] Fixed SD2-1510: Too slow startup when DesignerViewContent.cs was open (different solution to the problem, the previous commit introduced errors) git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3769 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Implementations/DefaultClass.cs | 53 +++++-------------- .../Implementations/SearchClassReturnType.cs | 21 +++++++- .../NRefactoryASTConvertVisitor.cs | 20 +++---- .../Src/NRefactoryResolver/TypeVisitor.cs | 41 +++++++++++--- .../Src/ProjectContent/IProjectContent.cs | 35 +++++++++--- 5 files changed, 103 insertions(+), 67 deletions(-) diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs index 607f0390af..04cdc4f642 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs @@ -374,13 +374,7 @@ namespace ICSharpCode.SharpDevelop.Dom return CompareTo((IClass)o); } - sealed class InheritanceTreeCache - { - internal IClass[] inheritanceTree; - internal bool isCreating; - } - - volatile InheritanceTreeCache inheritanceTreeCache; + volatile IClass[] inheritanceTreeCache; public IEnumerable ClassInheritanceTree { get { @@ -392,47 +386,24 @@ namespace ICSharpCode.SharpDevelop.Dom // Especially the recursive calls are tricky, this has caused incorrect behavior (SD2-1474) // or performance problems (SD2-1510) in the past. - // get the inheritanceTreeCache, creating it if required - // (on demand-creation saves memory - lots of classes never need a ClassInheritanceTree) - InheritanceTreeCache inheritanceTreeCache = this.inheritanceTreeCache; - if (inheritanceTreeCache == null) { - // but ensure only one is created, even when ClassInheritanceTree is called by multiple threads - InheritanceTreeCache newCache = new InheritanceTreeCache(); - #pragma warning disable 420 - // Warning CS0420: 'ICSharpCode.SharpDevelop.Dom.DefaultClass.inheritanceTreeCache': a reference to a volatile field will not be treated as volatile - // We disable this warning because Interlocked.* treats the location as volatile, even though - // normally ref-parameters in C# lose the volatile modifier. - inheritanceTreeCache = Interlocked.CompareExchange(ref this.inheritanceTreeCache, newCache, null) ?? newCache; - #pragma warning restore 420 + IClass[] inheritanceTree = this.inheritanceTreeCache; + if (inheritanceTree != null) { + return inheritanceTree; } - // now we have the inheritanceTreeCache -> lock on it - lock (inheritanceTreeCache) { - if (inheritanceTreeCache.inheritanceTree == null) { - // inheritance tree does not exist yet - if (inheritanceTreeCache.isCreating) { - // this is a recursive call -> don't produce inheritance tree - return EmptyList.Instance; - } else { - // now produce the actual inheritance tree - inheritanceTreeCache.isCreating = true; - inheritanceTreeCache.inheritanceTree = CalculateClassInheritanceTree(); - inheritanceTreeCache.isCreating = false; - if (!KeepInheritanceTree) - DomCache.RegisterForClear(ClearCachedInheritanceTree); - } - } - - return inheritanceTreeCache.inheritanceTree; - } + inheritanceTree = CalculateClassInheritanceTree(); + + this.inheritanceTreeCache = inheritanceTree; + if (!KeepInheritanceTree) + DomCache.RegisterForClear(ClearCachedInheritanceTree); + + return inheritanceTree; } } void ClearCachedInheritanceTree() { - lock (inheritanceTreeCache) { - inheritanceTreeCache.inheritanceTree = null; - } + inheritanceTreeCache = null; } IClass[] CalculateClassInheritanceTree() diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/SearchClassReturnType.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/SearchClassReturnType.cs index 99e590b037..1fdbc70afd 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/SearchClassReturnType.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/SearchClassReturnType.cs @@ -24,6 +24,7 @@ namespace ICSharpCode.SharpDevelop.Dom string name; string shortName; int typeParameterCount; + bool lookForInnerClassesInDeclaringClass = true; public SearchClassReturnType(IProjectContent projectContent, IClass declaringClass, int caretLine, int caretColumn, string name, int typeParameterCount) { @@ -42,6 +43,19 @@ namespace ICSharpCode.SharpDevelop.Dom shortName = name.Substring(pos + 1); } + /// + /// Gets/Sets whether to look for inner classes in the declaring class. + /// The default is true. + /// Set this property to false for return types that are used as base type references. + /// + public bool LookForInnerClassesInDeclaringClass { + get { return lookForInnerClassesInDeclaringClass; } + set { + lookForInnerClassesInDeclaringClass = value; + ClearCachedBaseType(); + } + } + volatile IReturnType cachedBaseType; int isSearching; // 0=false, 1=true @@ -58,7 +72,12 @@ namespace ICSharpCode.SharpDevelop.Dom if (Interlocked.CompareExchange(ref isSearching, 1, 0) != 0) return null; try { - type = pc.SearchType(new SearchTypeRequest(name, typeParameterCount, declaringClass, caretLine, caretColumn)).Result; + SearchTypeRequest request = new SearchTypeRequest(name, typeParameterCount, declaringClass, caretLine, caretColumn); + if (!lookForInnerClassesInDeclaringClass) { + // skip looking for inner classes by adjusting the CurrentType for the lookup + request.CurrentType = declaringClass.DeclaringType; + } + type = pc.SearchType(request).Result; cachedBaseType = type; if (type != null) DomCache.RegisterForClear(ClearCachedBaseType); diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryASTConvertVisitor.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryASTConvertVisitor.cs index fc6d30b1e7..681e199325 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryASTConvertVisitor.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryASTConvertVisitor.cs @@ -388,7 +388,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver if (c.ClassType != ClassType.Enum && typeDeclaration.BaseTypes != null) { foreach (AST.TypeReference type in typeDeclaration.BaseTypes) { - IReturnType rt = CreateReturnType(type); + IReturnType rt = CreateReturnType(type, null, TypeVisitor.ReturnTypeOptions.BaseTypeReference); if (rt != null) { c.BaseTypes.Add(rt); } @@ -508,7 +508,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver internal static IParameter CreateParameter(AST.ParameterDeclarationExpression par, IMethod method, IClass currentClass, ICompilationUnit cu) { - IReturnType parType = CreateReturnType(par.TypeReference, method, currentClass, cu); + IReturnType parType = CreateReturnType(par.TypeReference, method, currentClass, cu, TypeVisitor.ReturnTypeOptions.None); DefaultParameter p = new DefaultParameter(par.ParameterName, parType, GetRegion(par.StartLocation, par.EndLocation)); p.Modifiers = (ParameterModifiers)par.ParamModifier; return p; @@ -524,7 +524,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver method.IsExtensionMethod = methodDeclaration.IsExtensionMethod; method.Documentation = GetDocumentation(region.BeginLine, methodDeclaration.Attributes); ConvertTemplates(methodDeclaration.Templates, method); - method.ReturnType = CreateReturnType(methodDeclaration.TypeReference, method); + method.ReturnType = CreateReturnType(methodDeclaration.TypeReference, method, TypeVisitor.ReturnTypeOptions.None); ConvertAttributes(methodDeclaration, method); if (methodDeclaration.Parameters.Count > 0) { foreach (AST.ParameterDeclarationExpression par in methodDeclaration.Parameters) { @@ -559,7 +559,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver method.Documentation = GetDocumentation(region.BeginLine, declareDeclaration.Attributes); method.Modifiers |= ModifierEnum.Extern | ModifierEnum.Static; - method.ReturnType = CreateReturnType(declareDeclaration.TypeReference, method); + method.ReturnType = CreateReturnType(declareDeclaration.TypeReference, method, TypeVisitor.ReturnTypeOptions.None); ConvertAttributes(declareDeclaration, method); foreach (AST.ParameterDeclarationExpression par in declareDeclaration.Parameters) { @@ -753,23 +753,23 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver return null; } - IReturnType CreateReturnType(AST.TypeReference reference, IMethod method) + IReturnType CreateReturnType(AST.TypeReference reference, IMethod method, TypeVisitor.ReturnTypeOptions options) { - return CreateReturnType(reference, method, GetCurrentClass(), cu); + return CreateReturnType(reference, method, GetCurrentClass(), cu, options); } - static IReturnType CreateReturnType(AST.TypeReference reference, IMethod method, IClass currentClass, ICompilationUnit cu) + static IReturnType CreateReturnType(AST.TypeReference reference, IMethod method, IClass currentClass, ICompilationUnit cu, TypeVisitor.ReturnTypeOptions options) { if (currentClass == null) { - return TypeVisitor.CreateReturnType(reference, new DefaultClass(cu, "___DummyClass"), method, 1, 1, cu.ProjectContent, true); + return TypeVisitor.CreateReturnType(reference, new DefaultClass(cu, "___DummyClass"), method, 1, 1, cu.ProjectContent, options | TypeVisitor.ReturnTypeOptions.Lazy); } else { - return TypeVisitor.CreateReturnType(reference, currentClass, method, currentClass.Region.BeginLine + 1, 1, cu.ProjectContent, true); + return TypeVisitor.CreateReturnType(reference, currentClass, method, currentClass.Region.BeginLine + 1, 1, cu.ProjectContent, options | TypeVisitor.ReturnTypeOptions.Lazy); } } IReturnType CreateReturnType(AST.TypeReference reference) { - return CreateReturnType(reference, null); + return CreateReturnType(reference, null, TypeVisitor.ReturnTypeOptions.None); } } } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/TypeVisitor.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/TypeVisitor.cs index aefb823405..83d5a256fd 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/TypeVisitor.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/TypeVisitor.cs @@ -20,24 +20,47 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver // TODO: Rename this class, the visitor functionality was moved to ResolveVisitor public static class TypeVisitor { + [Flags] + public enum ReturnTypeOptions + { + None = 0, + Lazy = 1, + BaseTypeReference = 2 + } + public static IReturnType CreateReturnType(TypeReference reference, NRefactoryResolver resolver) { return CreateReturnType(reference, resolver.CallingClass, resolver.CallingMember, resolver.CaretLine, resolver.CaretColumn, - resolver.ProjectContent, false); + resolver.ProjectContent, ReturnTypeOptions.None); } + [Obsolete("Use the overload with ReturnTypeOptions instead")] public static IReturnType CreateReturnType(TypeReference reference, IClass callingClass, IMember callingMember, int caretLine, int caretColumn, IProjectContent projectContent, bool useLazyReturnType) + { + return CreateReturnType(reference, callingClass, callingMember, caretLine, caretColumn, + projectContent, + useLazyReturnType ? ReturnTypeOptions.Lazy : ReturnTypeOptions.None); + } + + public static IReturnType CreateReturnType(TypeReference reference, IClass callingClass, + IMember callingMember, int caretLine, int caretColumn, + IProjectContent projectContent, + ReturnTypeOptions options) { if (reference == null) return null; if (reference.IsNull) return null; if (reference is InnerClassTypeReference) { reference = ((InnerClassTypeReference)reference).CombineToNormalTypeReference(); } + + bool useLazyReturnType = (options & ReturnTypeOptions.Lazy) == ReturnTypeOptions.Lazy; + bool isBaseTypeReference = (options & ReturnTypeOptions.BaseTypeReference) == ReturnTypeOptions.BaseTypeReference; + LanguageProperties languageProperties = projectContent.Language; IReturnType t = null; if (callingClass != null && !reference.IsGlobal) { @@ -57,7 +80,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver } } if (t == null) { - if (reference.Type != reference.Type) { + if (reference.IsKeyword) { // keyword-type like void, int, string etc. IClass c = projectContent.GetClass(reference.Type, 0); if (c != null) @@ -66,11 +89,15 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver t = new GetClassReturnType(projectContent, reference.Type, 0); } else { int typeParameterCount = reference.GenericTypes.Count; - if (useLazyReturnType) { - if (reference.IsGlobal || reference.IsKeyword) + if (useLazyReturnType || isBaseTypeReference) { + if (reference.IsGlobal) { t = new GetClassReturnType(projectContent, reference.Type, typeParameterCount); - else if (callingClass != null) - t = new SearchClassReturnType(projectContent, callingClass, caretLine, caretColumn, reference.Type, typeParameterCount); + } else if (callingClass != null) { + SearchClassReturnType scrt = new SearchClassReturnType(projectContent, callingClass, caretLine, caretColumn, reference.Type, typeParameterCount); + if (isBaseTypeReference) + scrt.LookForInnerClassesInDeclaringClass = false; + t = scrt; + } } else { IClass c; if (reference.IsGlobal || reference.IsKeyword) { @@ -88,7 +115,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver if (reference.GenericTypes.Count > 0) { List para = new List(reference.GenericTypes.Count); for (int i = 0; i < reference.GenericTypes.Count; ++i) { - para.Add(CreateReturnType(reference.GenericTypes[i], callingClass, callingMember, caretLine, caretColumn, projectContent, useLazyReturnType)); + para.Add(CreateReturnType(reference.GenericTypes[i], callingClass, callingMember, caretLine, caretColumn, projectContent, options)); } t = new ConstructedReturnType(t, para); } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/IProjectContent.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/IProjectContent.cs index c1eb3c4ac3..d18efae547 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/IProjectContent.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/IProjectContent.cs @@ -138,15 +138,34 @@ namespace ICSharpCode.SharpDevelop.Dom Default = LookInReferences | LookForInnerClass } - public struct SearchTypeRequest + public sealed class SearchTypeRequest { - public readonly string Name; - public readonly int TypeParameterCount; - public readonly ICompilationUnit CurrentCompilationUnit; - public readonly IClass CurrentType; - public readonly int CaretLine; - public readonly int CaretColumn; - public readonly IUsingScope CurrentUsingScope; + IUsingScope currentUsingScope; + ICompilationUnit currentCompilationUnit; + + public string Name { get; set; } + public int TypeParameterCount { get; set; } + public IClass CurrentType { get; set; } + public int CaretLine { get; set; } + public int CaretColumn { get; set; } + + public ICompilationUnit CurrentCompilationUnit { + get { return currentCompilationUnit; } + set { + if (value == null) + throw new ArgumentNullException("CurrentCompilationUnit"); + currentCompilationUnit = value; + } + } + + public IUsingScope CurrentUsingScope { + get { return currentUsingScope; } + set { + if (value == null) + throw new ArgumentNullException("CurrentUsingScope"); + currentUsingScope = value; + } + } public SearchTypeRequest(string name, int typeParameterCount, IClass currentType, int caretLine, int caretColumn) { From 1b7cd191591679343c718d71de4ba44184c2dac2 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 21 Jan 2009 17:16:15 +0000 Subject: [PATCH 36/68] Minor changes to BuildWorker. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3770 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Interprocess/HostProcess.cs | 4 ++-- .../Interprocess/IHostObject.cs | 2 +- .../Program.cs | 2 +- .../WorkerManager.cs | 14 +++++++++----- .../Project/Src/Implementations/DefaultClass.cs | 17 +++++++++++++++-- 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/HostProcess.cs b/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/HostProcess.cs index a972fcae8d..af42f27f76 100644 --- a/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/HostProcess.cs +++ b/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/HostProcess.cs @@ -98,10 +98,10 @@ namespace ICSharpCode.SharpDevelop.BuildWorker.Interprocess mc.CallOn(workerObject); } catch (TargetInvocationException ex) { Program.Log(ex.ToString()); - CallMethodOnHost("ReportException", ex.InnerException); + CallMethodOnHost("ReportException", ex.InnerException.ToString()); } catch (Exception ex) { Program.Log(ex.ToString()); - CallMethodOnHost("ReportException", ex); + CallMethodOnHost("ReportException", ex.ToString()); } } } diff --git a/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/IHostObject.cs b/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/IHostObject.cs index 74a82b13f5..df1e484c6c 100644 --- a/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/IHostObject.cs +++ b/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/IHostObject.cs @@ -11,6 +11,6 @@ namespace ICSharpCode.SharpDevelop.BuildWorker.Interprocess { public interface IHostObject { - void ReportException(Exception ex); + void ReportException(string exceptionText); } } diff --git a/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs b/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs index 5298997dd7..1c1bc11d8e 100644 --- a/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs +++ b/src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs @@ -128,7 +128,7 @@ namespace ICSharpCode.SharpDevelop.BuildWorker } success = DoBuild(); } catch (Exception ex) { - host.CallMethodOnHost("ReportException", ex); + host.CallMethodOnHost("ReportException", ex.ToString()); } finally { Program.Log("BuildDone"); diff --git a/src/Main/ICSharpCode.SharpDevelop.BuildWorker/WorkerManager.cs b/src/Main/ICSharpCode.SharpDevelop.BuildWorker/WorkerManager.cs index b152aac617..b28bd949f7 100644 --- a/src/Main/ICSharpCode.SharpDevelop.BuildWorker/WorkerManager.cs +++ b/src/Main/ICSharpCode.SharpDevelop.BuildWorker/WorkerManager.cs @@ -189,6 +189,7 @@ namespace ICSharpCode.SharpDevelop.BuildWorker void OnWorkerLost(object sender, EventArgs e) { + BuildRun buildRun; lock (lockObject) { workerProcessCount--; freeWorkerProcesses.Remove(this); @@ -204,8 +205,8 @@ namespace ICSharpCode.SharpDevelop.BuildWorker Monitor.Enter(lockObject); } } + buildRun = Interlocked.Exchange(ref currentBuildRun, null); } - BuildRun buildRun = Interlocked.Exchange(ref currentBuildRun, null); if (buildRun != null) { buildRun.RaiseError("Worker process lost during build"); buildRun.Done(false); @@ -231,7 +232,10 @@ namespace ICSharpCode.SharpDevelop.BuildWorker [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public void BuildDone(bool success) { - BuildRun buildRun = Interlocked.Exchange(ref currentBuildRun, null); + BuildRun buildRun; + lock (lockObject) { + buildRun = Interlocked.Exchange(ref currentBuildRun, null); + } if (buildRun != null) { // OnReady must be called before buildRun.Done - the callback // might trigger another build, and if this worker process @@ -243,7 +247,7 @@ namespace ICSharpCode.SharpDevelop.BuildWorker } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] - public void ReportException(Exception ex) + public void ReportException(string exceptionText) { // shutdown worker if it produced an exception try { @@ -251,9 +255,9 @@ namespace ICSharpCode.SharpDevelop.BuildWorker } catch {} if (ShowError != null) - ShowError(ex); + ShowError(new Exception(exceptionText)); else - Program.ShowMessageBox(ex.ToString()); + Program.ShowMessageBox(exceptionText); } } } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs index 04cdc4f642..47c0a76308 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs @@ -382,9 +382,22 @@ namespace ICSharpCode.SharpDevelop.Dom // the ClassInheritanceTree must work even if the following things happen: // - cyclic inheritance // - multithreaded calls - // - recursive calls (the SearchType request done by GetUnderlyingClass() uses ClassInheritanceTree) - // Especially the recursive calls are tricky, this has caused incorrect behavior (SD2-1474) + + // Recursive calls are possible if the SearchType request done by GetUnderlyingClass() + // uses ClassInheritanceTree. + // Such recursive calls are tricky, they have caused incorrect behavior (SD2-1474) // or performance problems (SD2-1510) in the past. + // As of revision 3769, NRefactoryAstConvertVisitor sets up the SearchClassReturnType + // used for base types so that it does not look up inner classes in the class itself, + // so the ClassInheritanceTree is not used created in those cases. + // However, other language bindings might not set up base types correctly, so it's + // still possible that ClassInheritanceTree is called recursivly. + // In that case, we'll return an invalid inheritance tree because of + // ProxyReturnType's automatic stack overflow prevention. + + // We do not use locks to protect against multithreaded calls because + // resolving one class's base types can cause getting the inheritance tree + // of another class -> beware of deadlocks IClass[] inheritanceTree = this.inheritanceTreeCache; if (inheritanceTree != null) { From 7a71e053169dcdd032d28e5de544e1cafb9c56fe Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 21 Jan 2009 17:40:03 +0000 Subject: [PATCH 37/68] Fixed context menu of side bar: 'Cannot create object: ICSharpCode.SharpDevelop.Commands.SideBarDeleteTabItem' git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3771 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/Main/Base/Project/Src/Commands/SideBarCommands.cs | 2 -- .../Src/Gui/Components/SideBar/SharpDevelopSideBar.cs | 9 +++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Main/Base/Project/Src/Commands/SideBarCommands.cs b/src/Main/Base/Project/Src/Commands/SideBarCommands.cs index 22c0c43ac5..d0afef8d42 100644 --- a/src/Main/Base/Project/Src/Commands/SideBarCommands.cs +++ b/src/Main/Base/Project/Src/Commands/SideBarCommands.cs @@ -13,7 +13,6 @@ using ICSharpCode.SharpDevelop.Widgets.SideBar; namespace ICSharpCode.SharpDevelop.Commands { - /* public class SideBarRenameTabItem : AbstractMenuCommand { public override void Run() @@ -167,5 +166,4 @@ namespace ICSharpCode.SharpDevelop.Commands } } } - */ } diff --git a/src/Main/Base/Project/Src/Gui/Components/SideBar/SharpDevelopSideBar.cs b/src/Main/Base/Project/Src/Gui/Components/SideBar/SharpDevelopSideBar.cs index 8a55f111b0..4275e435aa 100644 --- a/src/Main/Base/Project/Src/Gui/Components/SideBar/SharpDevelopSideBar.cs +++ b/src/Main/Base/Project/Src/Gui/Components/SideBar/SharpDevelopSideBar.cs @@ -200,5 +200,14 @@ namespace ICSharpCode.SharpDevelop.Gui } public event SideTabEventHandler SideTabDeleted; + + + public Point SideBarMousePosition { get; private set; } + + protected override void OnMouseMove(MouseEventArgs e) + { + base.OnMouseMove(e); + this.SideBarMousePosition = new Point(e.X, e.Y); + } } } From d8ff8210c51b60df2c1ff466481cc461015462b5 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 21 Jan 2009 18:55:55 +0000 Subject: [PATCH 38/68] Remove abstract/sealed modifiers from interface when extracting an interface from a class. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3772 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../RefactoringService/FindReferencesAndRenameHelper.cs | 2 +- .../Project/Src/Services/MessageService/IMessageService.cs | 2 +- .../Project/Src/Services/MessageService/MessageService.cs | 2 +- .../Project/Src/Refactoring/NRefactoryRefactoringProvider.cs | 4 ++++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs index 2dc6e5b5c7..4235d30ed7 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs @@ -54,7 +54,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring 1, "${res:Global.ReplaceButtonText}", "${res:Global.AbortButtonText}"); - if (confirmReplace == 1) { + if (confirmReplace != 0) { return; } } diff --git a/src/Main/Core/Project/Src/Services/MessageService/IMessageService.cs b/src/Main/Core/Project/Src/Services/MessageService/IMessageService.cs index bd9fd54973..711362f8ac 100644 --- a/src/Main/Core/Project/Src/Services/MessageService/IMessageService.cs +++ b/src/Main/Core/Project/Src/Services/MessageService/IMessageService.cs @@ -48,7 +48,7 @@ namespace ICSharpCode.Core.Services /// Use -1 if you don't want to have a cancel button. /// /// The captions of the buttons. - /// The number of the button that was clicked. + /// The number of the button that was clicked, or -1 if the dialog was closed without clicking a button. int ShowCustomDialog(string caption, string dialogText, int acceptButtonIndex, int cancelButtonIndex, params string[] buttontexts); string ShowInputBox(string caption, string dialogText, string defaultValue); void ShowMessage(string message, string caption); diff --git a/src/Main/Core/Project/Src/Services/MessageService/MessageService.cs b/src/Main/Core/Project/Src/Services/MessageService/MessageService.cs index 0c07648b72..083b166266 100644 --- a/src/Main/Core/Project/Src/Services/MessageService/MessageService.cs +++ b/src/Main/Core/Project/Src/Services/MessageService/MessageService.cs @@ -142,7 +142,7 @@ namespace ICSharpCode.Core /// Use -1 if you don't want to have a cancel button. /// /// The captions of the buttons. - /// The number of the button that was clicked. + /// The number of the button that was clicked, or -1 if the dialog was closed without clicking a button. public static int ShowCustomDialog(string caption, string dialogText, int acceptButtonIndex, int cancelButtonIndex, params string[] buttontexts) { return ServiceManager.MessageService.ShowCustomDialog(caption, dialogText, acceptButtonIndex, cancelButtonIndex, buttontexts); diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryRefactoringProvider.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryRefactoringProvider.cs index a8b42bc000..97ab793c07 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryRefactoringProvider.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryRefactoringProvider.cs @@ -96,6 +96,10 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring public override string GenerateInterfaceForClass(string newInterfaceName, string existingCode, IList membersToKeep, IClass sourceClass, bool preserveComments) { Modifiers modifiers = CodeGenerator.ConvertModifier(sourceClass.Modifiers, new ClassFinder(membersToKeep[0])); + // keep only visibility modifiers and 'unsafe' modifier + // -> remove abstract,sealed,static + modifiers &= Modifiers.Visibility | Modifiers.Unsafe; + TypeDeclaration interfaceDef = new TypeDeclaration(modifiers, new List()); interfaceDef.Name = newInterfaceName; interfaceDef.Type = NR.Ast.ClassType.Interface; From a2c4a6783f7ac7793bb31cf69d6b51fe7fba30b2 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 21 Jan 2009 19:44:01 +0000 Subject: [PATCH 39/68] Use EditRawProperty for strong name key: allow using MSBuild properties in the key file path. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3773 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Dialogs/OptionPanels/ProjectOptions/Signing.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/Signing.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/Signing.cs index 2cccaddfd5..a5fdd909fd 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/Signing.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/Signing.cs @@ -35,7 +35,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels keyFile = Get("keyFile"); - b = helper.BindString(keyFile, "AssemblyOriginatorKeyFile", TextBoxEditMode.EditEvaluatedProperty); + b = helper.BindString(keyFile, "AssemblyOriginatorKeyFile", TextBoxEditMode.EditRawProperty); b.RegisterLocationButton(locationButton); FindKeys(baseDirectory); if (keyFile.Text.Length > 0) { @@ -74,13 +74,13 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels while (true) { try { foreach (string fileName in Directory.GetFiles(directory, "*.snk")) { - keyFile.Items.Add(FileUtility.GetRelativePath(baseDirectory, fileName)); + keyFile.Items.Add(MSBuildInternals.Escape(FileUtility.GetRelativePath(baseDirectory, fileName))); } foreach (string fileName in Directory.GetFiles(directory, "*.pfx")) { - keyFile.Items.Add(FileUtility.GetRelativePath(baseDirectory, fileName)); + keyFile.Items.Add(MSBuildInternals.Escape(FileUtility.GetRelativePath(baseDirectory, fileName))); } foreach (string fileName in Directory.GetFiles(directory, "*.key")) { - keyFile.Items.Add(FileUtility.GetRelativePath(baseDirectory, fileName)); + keyFile.Items.Add(MSBuildInternals.Escape(FileUtility.GetRelativePath(baseDirectory, fileName))); } } catch { // can happen for networked drives / network locations @@ -96,7 +96,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels void BrowseKeyFile() { keyFile.SelectedIndex = -1; - BrowseForFile(ControlDictionary["keyFileComboBox"], "${res:SharpDevelop.FileFilter.KeyFiles} (" + KeyFileExtensions + ")|" + KeyFileExtensions + "|${res:SharpDevelop.FileFilter.AllFiles}|*.*", TextBoxEditMode.EditEvaluatedProperty); + BrowseForFile(ControlDictionary["keyFileComboBox"], "${res:SharpDevelop.FileFilter.KeyFiles} (" + KeyFileExtensions + ")|" + KeyFileExtensions + "|${res:SharpDevelop.FileFilter.AllFiles}|*.*", TextBoxEditMode.EditRawProperty); } void CreateKeyFile() @@ -105,7 +105,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels using (CreateKeyForm createKey = new CreateKeyForm(baseDirectory)) { createKey.KeyFile = project.Name; if (createKey.ShowDialog(WorkbenchSingleton.MainForm) == DialogResult.OK) { - keyFile.Text = createKey.KeyFile; + keyFile.Text = MSBuildInternals.Escape(createKey.KeyFile); return; } } From 0583126bf3a1d905db14560c47215f470e4c7fae Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 22 Jan 2009 00:00:15 +0000 Subject: [PATCH 40/68] Update to Boo 0.9.0.3153. This fixes SD2-1495. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3774 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../BackendBindings/Boo/BooBinding/Project/PostBuildEvent.proj | 1 + .../Boo/BooBinding/Project/Src/CodeCompletion/BooParser.cs | 2 +- .../BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs | 1 + src/Setup/Files.wxs | 3 +++ src/Setup/Setup.wxs | 1 + 5 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/PostBuildEvent.proj b/src/AddIns/BackendBindings/Boo/BooBinding/Project/PostBuildEvent.proj index a585d08204..1f0b39861d 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/PostBuildEvent.proj +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/PostBuildEvent.proj @@ -7,6 +7,7 @@ + diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooParser.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooParser.cs index f0e4f4dc39..afbd80ee32 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooParser.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooParser.cs @@ -158,7 +158,7 @@ namespace Grunwald.BooBinding.CodeCompletion private ICompilationUnit Parse(IProjectContent projectContent, string fileName, int[] lineLength, BooCompiler compiler) { compiler.Parameters.OutputWriter = new StringWriter(); - compiler.Parameters.TraceSwitch.Level = System.Diagnostics.TraceLevel.Off; + compiler.Parameters.TraceLevel = System.Diagnostics.TraceLevel.Off; Compile compilePipe = new Compile(); BooParsingStep parsingStep = (BooParsingStep)compilePipe[0]; diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs index 3736935aed..b477e23094 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs @@ -501,6 +501,7 @@ namespace Grunwald.BooBinding.CodeCompletion if (node.Setter != null && node.Setter.Body != null) { property.SetterRegion = GetClientRegion(node.Setter); } + property.IsIndexer = (node.Name == "self"); OuterClass.Properties.Add(property); property.UserData = node; } diff --git a/src/Setup/Files.wxs b/src/Setup/Files.wxs index 1d000e8123..65d9959daa 100644 --- a/src/Setup/Files.wxs +++ b/src/Setup/Files.wxs @@ -1187,6 +1187,9 @@ + + + diff --git a/src/Setup/Setup.wxs b/src/Setup/Setup.wxs index 040e007c28..387a4b9b79 100644 --- a/src/Setup/Setup.wxs +++ b/src/Setup/Setup.wxs @@ -326,6 +326,7 @@ + From 17c95c5a352407d329846fc3b610db81b79a7b37 Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Thu, 22 Jan 2009 15:56:32 +0000 Subject: [PATCH 41/68] Remove setup\bin directory to get rid of the .wixpdb file git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3775 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/Automated.proj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Automated.proj b/src/Automated.proj index 7d128cf3ed..9dd4b1ab5d 100644 --- a/src/Automated.proj +++ b/src/Automated.proj @@ -106,6 +106,10 @@ + + + From adff7b48bfd8a3974fc0961c677ec8a123b29b21 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Thu, 22 Jan 2009 22:13:40 +0000 Subject: [PATCH 42/68] Project options now working for F# projects. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3776 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../FSharp/FSharpBinding/Project/FSharpBinding.addin | 2 ++ .../BackendBindings/FSharp/FSharpBinding/Project/Src/project.fs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/FSharpBinding.addin b/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/FSharpBinding.addin index 8e9cee4b11..3f87ffbcdf 100644 --- a/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/FSharpBinding.addin +++ b/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/FSharpBinding.addin @@ -5,12 +5,14 @@ + + diff --git a/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/Src/project.fs b/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/Src/project.fs index ba2af047f3..144ac511d3 100644 --- a/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/Src/project.fs +++ b/src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/Src/project.fs @@ -221,7 +221,7 @@ type FsOptions() = override x.LoadPanelContents() = let this = (typeof) let caller = this.Assembly - x.SetupFromXmlStream(caller.GetManifestResourceStream("FSharpBindings.Resources.FsOptions.xfrm")) + x.SetupFromXmlStream(caller.GetManifestResourceStream("FsOptions.xfrm")) x.InitializeHelper() x.helper.BindBoolean(x.Get("standalone"), "Standalone", false) |> ignore x.helper.BindBoolean(x.Get("nomllib"), "NoMLLib", false) |> ignore From e0791cefb37898ba560bf2978410706c9297556a Mon Sep 17 00:00:00 2001 From: Christian Hornung Date: Sat, 24 Jan 2009 08:02:49 +0000 Subject: [PATCH 43/68] ResourceToolkit: Show a message instead of an exception when a resource file cannot be read or written when deleting or renaming keys. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3777 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- data/resources/StringResources.de.resources | Bin 309746 -> 309933 bytes .../resources/StringResources.es-mx.resources | Bin 330101 -> 330771 bytes data/resources/StringResources.es.resources | Bin 330172 -> 330861 bytes data/resources/StringResources.nl.resources | Bin 324587 -> 325213 bytes data/resources/StringResources.no.resources | Bin 300917 -> 319378 bytes data/resources/StringResources.pt.resources | Bin 299982 -> 300787 bytes data/resources/StringResources.se.resources | Bin 204038 -> 226658 bytes .../Src/Gui/UnusedResourceKeysViewContent.cs | 31 +++++++++------ .../Refactoring/ResourceRefactoringService.cs | 37 ++++++++++++------ .../Resources/StringResources.resources | Bin 316668 -> 316844 bytes 10 files changed, 46 insertions(+), 22 deletions(-) diff --git a/data/resources/StringResources.de.resources b/data/resources/StringResources.de.resources index 2bee253689d5b0cef9d668264b14864e6a0c5e1b..f8651387b35c1ef09e80d89e9b911eb4efc22b25 100644 GIT binary patch delta 29981 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

I7rY#zY?CC$*Vyv7R&bh#0wTK>D>vZ2MD$7m- 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 M?ppl4+x_@~ delta 29955 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

j3+xl#FOIkmh&vE=O=Fnf$S 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 B3Dy7r diff --git a/data/resources/StringResources.es-mx.resources b/data/resources/StringResources.es-mx.resources index 83086ee74f0184237ae55dff36a5b449c5857351..272a0ba4a0c2081d3f28b6a570ccde2533f2bbf6 100644 GIT binary patch delta 42009 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 E0DR7C(f|Me delta 40828 zcmaHz1zgqF|Nr0TT(2S`A|e)3Y%Ihs>@L7=1$1_R-C) zbGgRwOZ9Lq_1Zeb`JIxr zsg*p*>X5l_wfuQcr1CA18u^uES)}A$f06o`wM?$=kd|H!Y47KdVR=M;@fL{+R&s8u zlFvOIa(S|flP;&VluGT8*<-YP6Qt$qp;|t@ujQYeTCzPCS=d)g-8@=C*C?4VPGmuG zCBai2(q*zkIu26OF;2wWPf3L>9Hf<&!uyr986vW39fz30Cb>l(-dA${lt`zoB9$sQ zqz`+n3sCaHGtMC&+AHZWLd&m3L_Q5s61YT5xnW9P`8#C(9W6D(9P$$rYqQ9gF-oe! zr8LbM-%Vt~agnYoMIQNyoSEm4L+zAIuIG?z^R@J6-E(1DMr9NUa)}fe?vT~#9WrE{ z7N6H#q>)3;a(Hod*K%cslGLq40z5^^=hSj{wa5=}VNNfH4DF{R{8JHM4%48K$j+=R z{F}&0`FAxGZBZrJ>wwnOH93F{)1q+P9L_6sm0TXY(R{+uz>G(DoNE=$=w!O+MxAKFKVgrw@CO)C5_`A zimdR|;+&=B3*qKk%du@DS2k%W-b+hBU1YXcNuf4c@_Z)Jp{z(3r$g>z5yHGGr<9!J z5R0*Zw#AgJ z=;)Bv@mk`>IHY_t%yXocw2>U{3ggB)yayL-Py+>LG<#foRo+20c@fC-BQ_vxy zxgD~lkH|NNw4DE3%Zd70^3M_3j*d*|sN`!d`s$jNO(<;ZSuoE_NyW{`zauBRGhRuj zv04sAIb;yF`g>)OQ(2V!T2Q23w313kv=ju%f)cir-n5h~#~)CXg>>RWCmP5QO;*dgHL7q%t{hKLdPbN?h_p1)k?|f zYFhkDi);l>^MB%ya{&%10|xZ|Tx17wEs>1{@dLpb9g_aCNa}&i{R&$v|P?FG9)dgRSSq6j)SSD zBxXGdlS;|o!?mPd4-!_?5l`<-v(BSAl#O&Y_K37NP79(ty7krfO-oMX#6~6iKM~;8AqCD0nkml+CcluX60EGf|N#&5-wEwsbf|gZsF$bkG7ogf z2$VGDJ4~zzz;sZ{yDosrGw=bkY7Vx0H&wD{7kDyLNkEvAkOIJbRS*&!xrR~}<6v1H zV*g)t(Bg%erG~}vRlsF#ls^G`?I+Uc7vwj?AqQKC%*+d%;tBV#&^o|r+8vQ~jqrjf zU_cExz{!SBNAAV7?8adoSp~;#APN+_&;czs8)*rIJ2#@xx1~xB)^td#joAM$MIExQ zl0zEbMjj7Ay2fZ`D~E(<=TF{n?$=!-dmZbs7e%Io`25W(3r?1G-hL~w? zSc_JlBrv&ITS>NjT6z%=G^we?5K}atfG+rJDf$hu0}y^^Ke`e};LvO&a_@+JUnBw= zt;M&b67RxFW(;*m6Xg02w|#jCg*l_8_RpA~ua;bR$mXJ?$Z(YPJCSkkwQS_@-bFQs z1rt!Ru2|FRIa=z>QPOOsk|TJ%Y#i>ZYa+KX@%o*>57%JaB8-Tj4LN_cW*&ZiFW^YpR0OV`b5(l$e$%m|X zEU^1RVJ)8o1Fe~fUZyL_RZFBL%6bar-9o?`I6%qDzj3c=mHdgl_c(*|@&>f<4V9Vm zHHU0O@YxC9aQckM=f|~dBd#cNGLDV^3M5o5!N{489kETz{q-0n(kk6A~vZ|80)09lvfC3&+vJvE)sOhfCl>df#7xcbQ}^6ZnSYozurnpe!=13Y!BRV*ZIVM zi$;hzI&TJ~b6yKtK!Kj1oBTXv7^I&i}gSOF6!4G<}M1-Fdi{ZZ8+C*jVm%UZ_7 zR(#+WuLCjrIr|2uH=nE;16*y?!9DDXaU z-6$>38xw?7C&~o_4xiK#3;^Z$l6b8UAT>$Q4??GEIGpd51XWU!7Y*OKl^`^pL?#q@ z*CxJOq-9lpvZI-V_6<-@K<(mOlsO+^`C{CCE{Ax4H~r$)Ks+GQt|y2$S<7GDMTQZh zHT?snD~b6X7J0*@acJ+3#!5EzaL92KuvJkOMJGD)^9DD&U>kk|7LNv|hd4!k#I`pf zqP!?{xoKSF6EdorM9VQm!r;CG?(RN{{D<_=GT;>^L}WU?sYB`#$3+*>lBK@L!TB6u zl}P*?k=!WFJAkU!E;zD+m~J!*N#yf8z|{<$cvBkP0EmLW#PfB0FpZMqPen?lA;&Ysf#bAv z&kO+NQ8KqTwtgA~`(DdoHako@)+G}feo>Z9ZsuJ|)F+S>;?J|k+`M`qiBFsc#@hGXY|%Ek;NqoeVB$1%S* zL_OqtSz&jvG+4}7C0$23WaoI1K@W)kx03(SUVM*eh|tGH6qNr20ZVEnx)k|ezTsMi zHOC&a;Q!I;qSr(!`a2}kC?)%FmFuIGJo8}!wmmi-c05E$|FL8{ZAEUufn|j_#Bh)g z_xnpuOb{s@|3b;F@%Vb2Oki^*kIIpVc2V*eKXYl4$n(4eyIitF0P)}Y2(lhuCD-m~ z8Ou%j$C55hamZ5KX8W{Sena6JlANr7b&(%HxT|=-ri9%qXc1DTHlE&HJD$a-HD!fXOm z9ZWpAoCvEmXh-aDWSNrE|7cmVz`_tM3*x|Y^hQ=q(Nbofmd`)Mq+u=a z1t?0^H)#B0N+_7;=AXcbTO=R8AQ`Av_b##DRSvuc7uYZ{BE{-CWF_HLfwNlHRwW^gBx>GA1qEyI#XY|PhAZM@dg7E8EMjsooK1bqtrm(^PRY`lnA#yKVp-X+2RJ`i%Q%3m z%nBttai`zS#g72B`4T`xBIWMDZJt0B(t+I%A^NEU>lY*YHmr-@B}}Cn7Dt%8h*<4c zWZgBrLox%o)zXoaKE-!~)f&zB#S*SYYk7jaH)FHge!z>Bhn>05{&;Rea(enOR)nT+ z1_75hcE}EIOqB>|$19OK&Bzllx!qMLRMa9xBMEhs!`vGp|AXtP`!ok;Tcfp0DK4?- zu6Bgo1IXRa0v_Br=om!@Sh@|T;`$Nyi}prwkWKeQey)px5|Sn0J)ftBGswIWiO2!) z|y+4E5Z7|3>Nf4m|GbLOXL)t-g^K)g| zlvKHnh--7uE|l!z3XnW}2SDIhY6K{0b%)AD4e$W}-VT#9r6?-kHcP{m;_pbw0HrBE zh-AP+7JmTfSWYG_ZudRmItmqE2X1X3k|wW+Bry3I2UG~z7j8*Cku@uJRx$!>Ix$5_ zWKHBBi6RvuIC#?s^Y|T{M$2PMQkmdqZwW9TxO_YTRK(F74HOrb9_zZue{nJLjbAhCTNtoT_Xh~*|zL{6?3*+XO#P?)%V zFUo~hKOvxa47>(@4nSdI?Mo1zA;&7uMAiVa6@#dHo)^iMi4Y7W%)AWH0VN|)wkx^7 zhCL|b5JWjc$@FjVo&=&RxpXP|;xfk)qa8sr(eUH7NvZpjmphesY*zA94J`vZ0T_WO z&mOe@ZzbO#%fipl<{0Y4;6V|%RJ0uxvM0D?Zg+GMi3RJ-Xr`rP6sbC1bvg?94zo-M z5b3*_v>eOX2>bJO0{^Fvq^zFPA^pL6Z)CUqnERVhB4ZMl z)_HkQF&`YhMq*jI0_N10+gH|-X(4j?fd~d)@cUIQFT-%Jc(!Qd-5`w;FZARgI1rSP zkgOSptb}Hx8LBvvRb^0K#*t%UFKT=v74>{W+~8kdgyrIC^wW2kVW z98Y2C&H+@cn>s|HSX+q$_kW9jXiwPv7iHKA4oQ=W6dc_sfGqD3hDUPXR0$$#G2CfK zRy&S@LpHGDjFt=l%q+D0N=u?798v!zg!tV#w9>NSD#h%X$p1@1tL%NiW#anI8PL`n zB#u}^ZfyG|1J@8hwB|5bF#K#|v46xf3mJ}RjPvOuGGaTWx(}Ep>^}XqP^-a*pm^EZ zEBPcF{sY}ujpv*f1veJr+6ySjuuaQ-<_wq{M-7G;z7jW>{TU^5ZtOZi+=qFDja5?Z zD@t*glI$m(u7m~;BW+^Qk+9ID28O$EsQC_g&)9wFz{`dNmrmluG9uIVy_v9xF$>vu|PD~@?=|#1qILfwONuBXz&BO}1(T{izxrYtM z(f53uh?5IAN@4%ycVOpWKxv?}B{y2K4pYPR-t$m0?lnot0*6GsAq>N`W}Mijo!QR0J2E`0x2UseER2$eL~>7HIrv#tT*rKnJ1x$)#pRrIi5$6z&c!`d;uDPw-}00*9~Dok zS8r=7*|LwqGQhL0GAUIZp7%`G(sMqj*cqikQTOIU%h8!Dpjh`ql9>K|^6+k;Cng#d!>tMjlMMb4PX&W&?2b46f7$ug$u;`Zx`7UE62<1()bl!$Jx^3}v;~i1{iyZiQ}TWhrUfeg zIfBCvBKdeJa`kKUYANX)vD7Y&y@UL9CUQzUZ=A_0W=*k z6(Lxyiv~Ylsw6fa!3Wsih7Af$0p(b4&=$n8p3Hd&MTS&xvp-9x5&0Dpz8_0O+>b+m zJ#p!Lsbr@@em7e(>C8km2S`e;^K@$wxxudls=ol$ zDCYZ#crt1P-%ir<2e)rHg4<8#5EtPrc(AuHRkJ*V@3`tQg(+5qkQ?AV`*y?r_jjYr z`aPTB{aWUta>0o+;3S%ali4r{l6*g$Fv|gqUI0+q5So!d)&ofPR^$OQ3g#SXiO?Y- zC|-_&X#P~vty)ycI%uhkGb;e7eTG-{KnH4V<567+9`!aMNj3QYqCL>i%_3j5rglrm z+WtJ(!S&AY!2=E>Y$~K>CFYfJJptwgZut-1>nNN7?RF84%>n&xoyLdk0cx{Ryyj5# z8WUWu+J1Cg@x{7BMy^afu>mJx5p{H=10%3O0;g?y3xHa2iViqCPbU zuX~Z@R0p$h9zRTTNFEflR(~Q_^y3j?@Bo^Jf%9b_k#OGS;U(NEcoN^hkB=aVMwDFV zQ4z03pn@L#j3-wpjvkeoa!A=;Vv z7l|lZ8@>~G?MqyT31lx_QjROw+fJ;VUa=hm-9jOzZ#RHZG6YBFU;0n27u#y}v z2*Z0|hE1rFCV2}WxWQJ>ecr#ny2Hu1>*D!Nsb z2OW7xLgRiX{W?JS1+2ybJ}Yt(^Vh^yyOI?F9`~z~T&%^59aWN>fOJ7o+-7za!=6x7!7;%o5nELRpKu4aCHU#8GXj$(dbSfPovgHr!X$G~Ny`;~N z$V^;K8U<`0)}Z$&SFKZ>^o=5}To22+W}WtPy*}lopA~UkdTKZ8pZ3Y8=aCQdu+<owtDgXqP%& z(M`E_KC6CJ)b;9oW3|Xt`9fE{z8KqvyMDdktFAzZaJ9PVuT?O|FXsxm?C;ul(O0)k zZhmsfR}FWCT#D8+gWbmuxg6knddbImI2Z@vs(zt?tIp-@`mbR3r9&=fPuEC#$N(A0 zPczqn%Ux7o{%!Ay`^H1xD(+_Cp>G0JP1nP3+Ulr~M1r^L@hx9HC&azTp>Mohx3BoC zBaEr#dVMvOtKwBWR0*3i*L+;_uKMe;C2aoF{Pn7@Ge5aeBUh8FwOrxXJalMDTUOTs z)j-#_Yms_GNjI-IUC-)@zV559m2_Wa)AgeIpOUUI_sY38UH4BLCQ;HyK9zE=5;vlC z)za=Y=1fbyfY=U%yZ4@o_Ev)>l<@ZTq&PYU=X2 z-Ci#!=ax_LZ@pdHZ)aDhT^DY5(ZLm65ARlR^||A#!d&rp+Uv-Q?xkbydb{%8_0zGT zh`pRE=B~ev3*|BuTzl?#xklgha6P}}sph&K+-;-|yNcaws&2dD@3qw5g}OJ1x$o)f zchA$6_r9OX;>!J?hHLnJFK3y`)>TT}tKvF+-`iQ0RxQ`%2i2T?rHeFRRG5l##XM-Q zy1LFkh)@$;IUlxmE@D(2YmR5q<%d^sRXxs;*uoO{+$yf%d(~ZS9{D&=R7qNY<0Eh9 z%a5&hw44B7E%)AG-=)?)sv@zfu6f`2>wZ=33*YBT-(}aISG6xpv+iSWU9-CTK7mhs zT?voZ@~O0Ojrp;na~M4(>B;H3_oJV4GOhCNR_33wgB&40)l(bzw_>Ko z%oxD`QPPc1XBgMOJ?`;OMO8jm#^)8CyKC{p%ys!iJ`(I-t&Mk}%b1!k|=K$A%S03rAbD7?}J(0AuP50AJYP;fpt7#2!<$CR>UnMu=U;8=# zU_1=rD2eNMwvz5#ZlHM9aUFhH(-r(CkMeUhc@ym{QirfJacE&z>YoEuge(4+rmi1< z_I6GB*~i%@MSlb5C|WTeM|b!okDA5k7`4^)=9iw%tMqpN*t_}H?9Qi9+PWzbzXiH7 z{^sv|3#DlyC0Kd7;(m)%*5T@OWR|uLx=z2ZH8`EUOK9-`^2niT{88Gu07}wL16&{e$myE@r;l?B)Zr<{<#eU} zE5LaSYSK-tvA(X6fB8Ev{%1`$)%D>oFXvl&(3nJqNBr%nz3RCIwCwKyXYP8*M^5E> z_II$e5R_2&@TzaK>Zp3CN2Ix=4Mqtx)m+KiBQ|0nT#ut;<_ml>QK+Yu7g!D<%)|buIr8=p4zAdhQ|bKlrH6 z=4DW|w5e~Fw_{+8QlVz)2<16%pYqY0>zl)2DXFH6Qd#w``u0&79H|bO%Sz4G-_|#| z)2V94XQIk(4roQwK7>9CcZ}9ege&gd%<<09< z%EOFErTleBgA}_$&Z8?fFu7aUONCkky-mDR;d;$-r<$ZYrR=R-h2Ht8RiN(Gz`W{` zG|4}WDy-s7^)za*a|PjX&v}=*XhLC5@(*3kEzr8VXq$GJn&Y7_1B!ux@Gdv&~)t94Q=gA-jO*0+P9HqA??g4U*>xIqE~rMZeKM}hc^1x zJ%i_GQog!MP&+ok)oo%~f!ohgapugdG9jpzB;_s^Pc0I$8-Y^h~(W>L{xW=s~< zUiC1CvLeORS(Q%)%f0oHX#RCOc+(`S>Z>MN1NtjtwVInr*^uDA#wIo`3sa>pX@1Yf zLC!Tc88atQE@a0r?mp4p&Zng8-A!zuDs6J*PyvRXtm>_`adXdRxSD=4M7+W*{VQh; z$Y&DxM`sSRWROfrW%380uoY60KMzm=&X_RF%U=FffGVqJgqc^lRSPrn6XmD2n%SSI z;rbxUXJs+KE~kmki7ekIuH&X$%ZbtF54Y!qkP=)AX5thxDx7US|-SCoiR$V^AKD$p|Zqqb37E;~x%dJMM81pi>>Zzt%t@dU| z9*p$>36z^VP0f}(Dzzz{7a)8eVG{DGzUHgEs+zMbx%Mh+=U%2uK2;IpT9!|3K_ub% z)k5cHdN*6WBTV-KsDf>J@^Uh5>bKZh}_6>I-W?TfM!h1?=T41k0!QHMLC2-Ke9lHnmw0SVTpDZe+YJ zoxhoh$j`FS%9?>i0q6G3Y<{{a>5H*&oCz$Zj814~DQ`p5DOh>ybBwaY^xDGlKEZJE zMl*Y>L&a5yc^M2^ziVbWgL1}A=~Em<^lWa=f>P0$nPO#6Gp3|!VCsi}%4M3HG0_YU zERD<-m%wljg{T6$Z*yCDV@jZvl}i9wpPR4}s=MbgwMz>NJgpO^h(ITs>ZNfli(1&s%up7v z%u@ypd)UIhuAAcaA6v?(0?yPesY+RLEMw?tsfw8@iB9 z*00uPeK{4RX4?aclt%=Mt)_I(3nKag(^h0Hp-Fb-iEW6DhZxdGq;tPmh+r%xkfz3=+ z2`4hQwj6eO<6i4{RTb!L+?pzjdzkBfdk@pDnhMgbTHCy2R0HQC27GC+^ST?7owMPHg+ScEM8U!4fjH;=Y=v-}V4R&u@r8d6ymzt_5UN5i~tZLWB)+e7jXs)~W zX)O?OMjM-hNt4R!)opBMGcd%Qt_@H3CXdN(s@1_*?zgc$2V=^bqpYZNwf#7&tf^8L zh_BGr)|6cJfS5gXRZ(Y~ww52WVYZ$M)k~7+1e=ZZP?`&jNJL8afwI(Rvv1qlVz}4< zl_PdaZ4&Ae>pU@s>!Tae&H}}9#@*`{QrdRbHW?dow2}2e(^n0UY<6?FvFdF4HB@<2 z@sFQVo3{-yfvW9nZfD37D5|6m<1-1xLYSK?ZzV7Roog_`E9*&*>L?aacKsAbm< zmXb8K1_tX<9c)R@YGbKZD_FC)HU4O32NTuA;#ey<1|`_kZH<{3mYQ#!wB5(C<@L4> z7Rx%=l$LFjzq(*;+{v74gPPn-p3=H4YVy2;?X=w+TG!W}9Y4y;-#-1P?QlDpOhP*~ zRM+ij;~diTcg?!yV}`U>e$KYk1sAwk=BEABUR7~+gZBBqXob!84jgBUwNjXSU{FT@ zd_hM`?u{*iRR?qpS>>a@>}aC8sE#IoCzx_Gu`&Lb!_S=TWT60S+v0T3qAF+>M`|D7 zJwBRQry?V}`qVUsrDb*3?Scwyw$`7nj+vKT)D(5YS|!X}?21{P`xIIK z+{xDbB#M`5*_BM8lo`_%-o`}QD1wd^wI_vj1E0k(Nc1*(K5ot4C&54;7QXF?Z`ihGCUFURtD)`kzSKWEdN*{h}<0 zV`3jw$Gq){iq}g?8QBX;t0;G<>mKs17n(UN%Hl^iL&L+XHZfy=cWG!*^30~D-8ypf zJyDi8+^a{zpV@uXX#J0S@-Se;r?2X6e(4K?k3^?9Mc;nx`6m=B0dQ~ns-N=Ij?VU` z(J`2-cV{a}ncW-wdL6@3yJ9$25F@Nu^ks|+(FqiT};0bs*(vCN_e-NVGZ2F z%$lL_ZWrygcKi3CIGXESEKXH2Erzl5OA|AU{MF-A>ecp`yu)#MAtqwDs^M$|In*Lo zOw(6d)2L-NYJuOMj35;3Vfv21LPmUQX3v7#L;+sLF%r+bf}x2=h#ZN$cYkVa8BX=8 zuMCs3^d=t2>NQzM5pq3r4{72oE2Sm1i65m}>fBw;!wIarbrc~;uF+hjepjmZ_A&d8 zCSZ@G-7~puK8#i#&an`Cry%x?Ll{#b4opG3AIGugcAamM&K(@DvO2di3TuJGW?Z}q za-ODL!)li`#m1oD_Y+U#j(4C0>OZ=g@G+{DF4fJ%&b8O_w8nayS7TVPZ#Ro)Z^ps1 zWv0nkg3q;3x>}SvCe=7tb)0rjyG@-VwaI=>`}j12OIChn6=4U+^KO=OE0|8>@G|$t zDe9%>!31RFK8BlGZagf^+1jEn0v?H#)D50q$0zTmg_zNe=(5} zbxieG5Xq{wkPxtZTjwsw(I3gF&7JEMi$+W&%D71n*O~%f`b{CIFW4hd0}2xdLh&(W zCc)p39*Io(NTz_{X%r<1>W)+yUyA>D>1kA(kcWB#Muj{~7mv{C~)Q zKz6=$Z^!b%rfL;Tge81T>*;usj3#!vYE9zCcd$du-`3KNdfA&*m_b<8vX^}ftKl0g z)q(adl2pOy)yqD_u9+%dMyoD7grr~?`ZBziC2+Sm=?gNwXX1dzG1`JeD0S3c^M0mk zs-9W<@@(DAnx)!nkKVSq9hyb_QDQcESnl5D!%S7eejMGRtZQIeXGZ zx2*Pb7pB~H4p_SkA}alnczzE1f8ElOE072i-02g8rs5lMOk2>V6i) zv1YKjYe3zTF%~Cc7pQus&H`M};}}zIA(80r1)#i+wbwjN0B`!pZ&3`z6G^#jP1_owXR)+Ft#2QJu+9ts!-s zqmpN~S;@>PruRzK(>Vt+l@V*fw5!mhFHP_&RnK`gdGxwfjJ{^}tpf7z7`0k8BF_q2 zts3Y*2AI!RtNPBgyfRVIELn|Z`g{RAw4fbfa)mkq%z`iAbNCnJ@H5QiFEFZ|UvQ+` z*5}shu_?TUaO8z)w+2x9eW01LMip~{d=hM4t|9Zdz81cDnjhDw0yxZ!YZWyM>zAKt zy%y0GHAB{_8bJ1*wJZ~6_k6H=TA7^d_|?%=UdJ4~$U2ZP)@)iwLNm$SS;s|Z8MR)O zb{h9?eb%#E^Y!fZmFclwl@B}!IeT5qvL8;%dK?@qb==OYi@U^l)*N2XQdiCE^`r)O zOqvaB^T1T(m;Pap$-R*x>+B6k_b=8dYhpJL=3Ur;bo~c^Y^UAG)B+}OqY5om3bOCN zw+jOtYeV+`FWG)--N4M;$O)R71J*K~%(aa~7lYn-#8MO(P zjyJ0|F>9f@xQP^arTLj@YMaTwnO}QM>&?^_PMGPN;q5o(z-Com-7|mCr(X{?MYgEo zN}G0D7@E$^*rI~6XC1627_+-CHJ(9J-xzwE54-!HpT&=Rd?cUqKuV(Y>*IdOo$l?E6Z! zbgqJ2$KEP@2M+&%>9|8Rb-sp7#oId8iyf%KTiR8ub^#NzlXebXASHp{jh`H~Q&pp0 zabTzFt~(AhGruOcYPXAePd~==wa3u*GEa7KwSv4F=bjktdN4Rux)`1p*e{OUGBds= zKlx?2@!qY5IScSEW;JtpHtW(V2OQyNg zWZbJ-J5NLHXfE#sE_d!lzr4-)y{f&l!bmITgk0K0??YrUw42-Q+xrOp4$_Xa+x7M^ zsm6Yc@JAE1pMbp7C~I!UgP@i70j##ZX>x!fejBs-fa*w%nN}Us>>xHWhLM!)4yqbv z>p|E)pEgez4#G%vi1upQ3FgotwJ>ecv+zA;-yyZm`GlUX=I|jD=Fnko!&wijF3#Pf zEqrowy5|u>=j*g&00} zdH4iK^x07rlA;be)Eqp9@0iAb8uox(ClJ<@gn<3&GMw~;V0nJHnabPDy^Tyn~1$S$NVz@RnSQysed5c zRRM0o$df9J&}-Q#Od{JUlFtrfOp||;4}FYQXFE9=&IL^G0Pt%cLwPaW6hXr zAl9psSWm<`vQfU^T3A;bYu_y6Z*Cv3ms<&2( z{_R-z&L;9K=~OPW?JO!?b)1=P+zXXAeb13&%p7Olq)sHXJ&&Sv40m{%x93QbuZ%P5 z7x&@H8@dAY-Erpiy2OibI!|%?=W)rLcy5jOYux?j3ht!&Tq8s`BVd{~?z(y{_Q}pPTq=APJ9aP>c@dK^a1!N7vxB=R}im3RSsy z0af|xI<@{x6V1bEN&Drv!I`S0qzr{ZcD?Kd8alyLzexyC^d>v3vOYJ}`*=oo%sLhw z>ZW;h(+Vplnh$rNy}m_ow*MA98^|Z8=Ojx^*k6FzaEq+3*d((B#ju9u(+wsi>1rxd z=r#iG_APqWY?AxZ*hnJv+ixk%MNP77+%gU~wY75yDWy9%3ZqB62$5~Zw}{s8`8n`{zhqiadz5R>j9 z^MCu#=wLJJp~~kBobvHvNfUyN-y?i}NmKO^PN17fcm(>6G9Mm+O|B{SEg9QZFP~y& zH?nuCVhTJ)p*PbF9$0%a zDf)88!{KfC8hwyzViKNFEF3u1#3Jn!Lwr0P9%jG~sE|qSgY7?1blb)AsYfIO4Sz&Y zZqS`0Ne1hG1fGAL3e*%g>3>4yvP^U1khQR%iT(*=Dl*MBg<5GHKIUawM;;$5;Og=* z=c+i(X3nKo#BEKU!@$PVY$>}bH=kn{&CQGFJZ|qj%~YQW_uU=OUa-HIW5fsi!vv9m4SNkG_yQBY00*4EMC1v8e5XbG&PX(=zG&_ zHDITD#&HNt`fHjA^wK%a!k>|Rlb_*S=FdJ-x~lo}e^D_!i{wk+z4aH+cU;fH8E*e&eEuNYImQV0;%#~9vYz|xih*)2d7(g)?@u`KD|0N9w&s|k ze_~0_nJLb>=ua{N9?$;C_L^m>Q{wfi{zH6H+C=;V%R0@nj#A&Gd568son@&+ z-TCiHZ`Qt}ezIzotu+zvcpO^vJ>uBF^Tj`@cRldZ-i!+}Ti&zSUUTTZT11@j`h%L1 z;;GYhi@+QAvy;{hn)j>rb!MDxJ*R}VQ#|XtU*G8?*=C!|O?6oll3M$j(eD61Z>@vL z3@dBhQYXwd%b#(#ty)K_4JM;Q57)0^!aDOD+qj{G znx9hX05!slaq6}v+NpD@Mb_t``rI6g1+7fe)Hbx`0Y!UZ>WBb%@KB z2}@Np`_t%rx|Yk*!+IvdNuFN8LkH_7E;qVc$E;`$c<4OTKpuK%>j776TD^!eae7aE zT(6pI4rR9Q>T3eh>A}t`b1hwKk{&@kNT;hPWpa7x3C=R}_+qg|?rgl$>uOePm|oA* zyXRTP=H`{Jd1)C(18-fx`3IvX8kIr!F!#K&`x2!dB{i3{>quN^Asi~4l zSA=&q(@>M57RAS0&ZGkuqEx9$Ej1*^bGk8|beWxZ^_0 z(6XDD0G-_gWY<1A^FrHGB$G#FN78`{ZHspge4bqg@>Db?hmLfVkSOazw9fRo6>zu> zH*vkZ0oq^RS@dsm2wJ*4KzG$m7ux~F$Bn#_--m8&(yE*49EpTHx~a4HQtRO(VRj4pi<+BxbXEe=H+i&iwxnxCQdeQ)l@GP( zWlH4JtM%fgmREM4tdVJ(U;9&;iOsK#x^MN5GoKaEdGzC@=J0!BU5?+tgcQUo{gzqc zMS_K~!2<D4~j6)3n8_W%j|`i7GdR@W?wA| z=39n2QtK+JqH?wWZ zxe#60*(brW#lyw)s0_(EFb?7&^RSeTH3v%S0w!lkMlOK(;3F|ctvAI>=}jQO-BS86 z1*m1E^#*7D<$Tq}8Z_IAhYL7^X*gzLbW5nLC+prTY;BILqWkNKD{K+OmxOzD zs_JUa87y(tI(I+wcU9e$_W`1+>H8$+)vN2vddy05uaxd@b%h%1Ud}TsQ;rWc<7?`| z>N~TgrkbM|{=}51qqpln zSADe7Jf?D89pv<0EwbLShsI`CUER@{kMzVBbY|5THvYOT7fK$pu7S?!Jh;a4fw3KQC9|X1tJl|$O=l2&g~s}}3!Iroye>w-sx52XHtD9im&d#U z^!IBm+Zk@sG-b%oiA#sa^0aMJQvl$DyL%~`8`Dg$q-M&mIOA&0;NW$(DJ3s>X&HG? zxfVK)v(~zl_vEWdGgFycEr98;b@q7&w1jD`{yoa1Z-tNj)P%GG@p`XIK5e1ax}Ki2 z&hpQRw}KL6erS!c&RS>7*nJ8&xo;cosh1`nt|yh~OHFmS>Dg9CXz%rw3WpibcDk*O zUjLC(6%Cj6HWk}pGQYOta9h_~s)DFoW_^3jSM@g76Zdr>NN}5F)eRU`;(?%cCr{WE zsRsaWsm;=kaA?YgMEBfL_jGRAVA2o$$P>)GUA{2FBrbq4ktZ?sX?8acl+^CP;TU#(4S7d_9p zYNG{WmhM?y8C&omr+12n4%@9!BaC-fKz{c|J0U?8^O!wdS^2_7D`Y5R>6C{>A*I=9 z2V?Frf!#s#65VuBoo$m9NhA)0Trr*Xou>i(43q-qVK;4b$xT*-mOLcT+~|(Ws&8I* z2Ufn^WHT+k2iA6Ala1`JM)IU3rWZnQ-;=#hZL;r~L~g2|Z?bumMCqy1ZMOBrO?l8q zhw`dGRBz&x?&d>pT;saUZYYQ$8hhVI*K^*bJ>C$m4>67UX>T0H<-U5kv-*}q@&uiB ztEKS6%}ct?#2Aju)1MeUU02*{W0iZWS$#3z?6I78Pb_LvcdN~hDN;S- zJ_eMsI_owYg^~x(8_X_!wpm^-<$TB?&Pm%ovf=Cy*s#+?4AIN=p>6-&jX#5)Q>8Uk zh7skuH?s&P|1j8+*P?FY;oR$CdcR)r+hE)yFN{S$ri>-(sq!CkP93$wvKk&6 zk0Ur7Ny93PJeWkdSA4woGC?cQo9*L(yV*M|Z&1=AchsA9*x{mk;Gyw^&8K(R8F~`M z-$YE%we+1GsE&KVI))lyYV&>q=JI-noo_L?j+r?T1Ahm_#W6Zf)FH-elFsV%*l8hl z?&-R?O`JSQS9E6i4>4?tPHl=#)}^tIsL6VYZjX9UI<{`m$TXh7o=1A50@pnX}6d_1zu)KGUIk`7XN> znnVdQsi&g`>vnxS28@`lo9eB*K3>^P2{P}d<6MrJz!}=*ytT`MLN43Hq@AhD@@8(e znR+%~Y))|ymdTT%GGE!0n58G_R=e%o$bA5Yc$>dw=_qdKQ z<|UKe&#SA=Cl#E%$JS7H-`Dez$>HQ>gG@hzdzoNn8FJB;do4#y!D1mX=7R-XyVn9V zZRdZ;1@z^;_ED1t`kVSov==cO%d|E37BcD2y*5AGLz;aKIHcNV3*JpR_c=1pup;N;&di^0p1kiR;kORzFPK-ha8nJAF&{ zbLK(r?EYtGC&@LU+*t`|XDP~y)%>1_KT|lfg33Y=KF$y zuTyS3?h7_fbHEmCO$9S(n^?qLi zDAzn-7g3XD6m>Q`U_Hl-T1RBGcrAI-r)Jw)V!|N@>`dPp=-NHP%T!s1Z<}j%hM4K= z(D7Af^Ey)9Bj(jQto`Bv6SIN+_!}u@o%dO@xqD5Q=MUcI%6dzGd3)Qk1r`i3dpCgT zjW&QjsZGBPs9pAh)^SUizzuLV-$tVN;s@<&lzaTbjX-uA##k2aruc1w$I%Br-ao_) z*~FJ!qkn3{4(ZF-6^b!a-Z_S+A>}&f-=fn})wh*h(&ycMGxpqJwVd z@sa8ZU*%yoY{6lFVeW0A?seHZe@SabY5nG)?PWiXHYK-F;nOB+8vx~d=;L<0L%p4Q z@|U)=o9q)|h0j$Uy#*dhaRm2(ODM)$hGyiK|2#<|oc2FGrGi5KgO=V{7 zBuFT;6OhSv*tY(pd%OE;=-~fF&SQ$~0)^@xwgL8EQ}USAy9k$~4yWKl(pJ7^(H@kz zz}KY1qfC>pb-Z5m{~NcPaXSrv!ziB6is8-8nmwd3W%polZw{xB#J@JEsC|$8kGuGq zoO`M5g_!WY)Rt-=k=mzG8Anmv+`Y_Ho56hp@U~$4tWOq!FnP!<3n(#9_2? z+p+lvS?1YcE^x!7Kcc%hKRM2ywX}BkH=i8=37VPZM|3S`6l9+7L!N(B=W|Y@S?6Oj zeLb=m>nV)&)j(dVJF3Gt@WG?F>)XdoiPyT22{}d(_UO2E4tFD;IeLuXD)R~J<%`@W zsS+_FtI2sB4i_-t$8|JcjpJ7X^UrY*tL+IB|F=EU$Aq5%_4}Wo{t4yP2?EqrC#chm zX04{yTGdR#2~;!vNxow^5#lWK@Tx9oE}miJ+mjf|^pjj+4n1@K-4o&50P*vG6N{Qv zeKFI!r&#SI-3$KP9d(-e$&d8R`FBrY^X@eJc%0<#!&t|PHj~egv*f4U)oRx=FV28{ z^^DJ1-CMUkX=dNI@57g7&T{AIlQ!$PVRn=A9AWo>lP2O`(wOPza8jeJ$+gVOa~xqY z3-hY=NszVSc_g>TM4rbh9WnRM15p=EzYBVr^Lqx>Gl#zgt!iDdS=tw@#UiXYIvm=TtA70VJo#Cggx0JYCd6RHW*TNy+y~^W-sgP$_ zvKeEZT|iY&1r^{GO1paKRew9Nv@wU56Mym zJ2=bMXa74U@GjZ?2($Gb2_K*R&GEaOWz$&`d!3!#%ecwa?g247O!z$@=At!xxbxjv z_v^3ssW!*mM=b))touZ{h50H|q9ont2r>;H5T}eYM#^+pmU!$F&C0}m_+t9e?10> zYMi%#$ZZ$&1e)&OW2&7Y#@NJ=Czw^A&v_MY3`Dn*l{63==mqEPt1~U9srD2n>;7`{ z9)=~Kz}*w1&!4wd-#vE!Q|#$?W?QmIqIj6n&md>KkYeCUD7;X8;297ae!*g38T0uM z*hl>z7#e-STz+Fyf^^>tA5G888sl#={D^p_T(HzCaaNZfaT-fgu5)I1lIJJ3 z+-55O^#97b68IXAEq?DzzKFaTUIC{h%W@xY32HB3gJI(tUjGbr=zMNG~b~6Pd5Uk2n2| zc|*5D?80ry4#$Wk&oFw>FQTf$Xq4KTw2 zTCgn?d0Pz7df0ix=(F399R|8R$Mq0Ox`RG6;jlgmfQZ$mArUX1*b>93@&L-Q>M78h zrr$-pD7YhBF&HG@6(hBa&oK17XJ>FF&wF5qI$|43Lnz<@RvYg3ad^D5A=NPOh(1i& zQHvOQg#E8Y4IfRrkMViL5q+$;GvaCYec@7{?{~_vontF{DwA+An%#J3A#9-rakyOJj0Okb%X_NemNDv^daQVLKxrH1a% z!4<(0&U_C|#!(IjEtVz85L)mA<6+iO)z$2Pw{vepzG3uH)iwa5#cK|Ruw~y#Z?QyA z)6EJqN)NI2DEB*?p|2TbxY(rUqIk-!(_IMf)0xG|qm)x2{FYaV(5KGgKZ4z{v{lGZ zS}ml9(U&#}nSzI&H-sFh#UA5Qsnh@|O|(ms{-WzK-6sMy*%U_^pnSkFy|#cvQLdBp z(Z)cqlx}J=jb+^En3J?w#m#?_}1dWrirL<&u+Bi*!yKlAK%-4#4S_`Htv#x7W89a*9k0Z!N9$u80# z`#a}dWP8Fre%{9Y{5u_o`XcJeRL$i$zbm8^T)TwT?dG~NOfv&a)j=GO^3p;E6p8XZ6|ZLBXtoL>dH;2AX9_ye7-k6OLNe^RN~OS*{aUum_lr9p{IV~CB1NPrP50d#;Uzl1KACyy74EWUT4+I_ztj6oSZ<1yx~lBy;1L7Pw=R& z3a?mZumg$AYY07pObXh3)XJ&l@_t*B+c*y;pqo&I1ctDRO}~5(7R?C zj^~J#X1M~p#07qGl}4xd#TI2_H-A+01sdWn^TnN0x`r{0WB^$jq1U-nt41z=k`n_)?*Kxm*0 z&?W**QJ{No?Aqm_N|yo}sq_61C?mv5o6dF?>7jj!#B7yV?pESKC7zgFeF?0KE^yf* z-Ea~d`6W3|ik zJQj2+tqzhF3JsDWcmt?+kW7QWz8xgfwb^HEsZkWwM7p^1a9(QYi$atdj1(0N&&HXW zU|Fj5Kg$iT^q8B#jb5ajCUE$>fa7U#a|Ah@*6=7lJHc6NaE`}gJ7&VE7|-T199OWw zx8jhd^OqNV>O$4831@7T^MKa_DXF^D#ilaA*pH0OWDJ%lO8A9l5H1Bv7oBBYGifnS zroGJ&Oy)Us^7BzQ>J%bfw50&M>AVV@7J{mL2Vk@g;`ydionrOE?@z2IynM^+PV^95 z*a<l_?e=9QduaPupL!~ z$_V;A6dHT-?-cC?u-Gaqu?5VTSVNbA#>Obv_>s3O{n!GoxcofrYbIN&XW%YjU|3Co zVKNTm`MNL}Ml-`u2e`o|49#(ZMa@(kCcP+WFII(?mKeeezmuuC^kvvY{aRx52>D$( zYfH4pN~U{1MZ3@yh-otcMo{Z;8DZQ+t-?{b-9X~0bxRCO^TMTB`w?_1CAUJe9}brR z;?D1MJzVw_)xT3hE7@Q3yTG-N^eFnF6^5~x3tW+1w{6DlR625Q~FzygyHm4{V zjY&sRYs8-5i`?hNMN3={#Bs6JVoWbv0W8qLjA#_1^F=C*mgBV{z;PuDGpo)xk#)q= z^foYK7Shr=tvwxY12YLU-u#V5O9#ftII-#?t!*#c(7YH7ujemPMx1O@zI_$m4g@2H z%ox;&wJj<>=nwWBrm>bS!oL^*Hii$tAX5HNni_V-tEm~-;n$}{;|)U;UuLX~cdG$s z{6W29WpA#)4sMcnu6NF%tN4i>A8}B02=kp_RnpP`BK)OY+h$=81VKANATb`(Mt_QfKqhUejTKjm~T_Q zvIC|#U)YE%Ahe@3O5@_7^e>gzQ#?}2+cX@2&|6Te?2Z3YPQXU^c0`P5OKaL=s2$l+ znw+0U8iq}y1v~j`JIZV^{4d(tNe1!>G#5r9s9!vaJ{5e~R6i3NJRiryk>-L;Y49cm`Pm)h^Hf*Sy2+YMYWxd zraegz^0>^_B0ZWa-@+b4WHP#S)60~YEJuiTmvPk#N~m(Zks@8_k7Q}pG9jZfiY5h8 z3Opbm;9y;m9Sqi{0L*fL!D3;J!m#pr>s{*?p#gYt$5*bd2XltbT-6zQZRrdz-F2BA zN10$HEmfNEvfSwebjtKp*;M-lBKf)q)AS=4v}@0RvCpBa)c-F#uB|99KZg#|_P;#c zQY8oN>jB5g!BVr-FbxT%dO}baMAcoOZFarg1+xgxE45Tz?*b#+UeS%L?21`IQdc-y zk1O1KZK@E|ua{SCtKdD_e3_Ghqr|a~*ZU~QGgC45WN!=lj z`^W=CWlbJU2`~;CUZq~$Wk0RWRo1*X4H5fDcjP_bDz#3RjcHRF4ly)LgA3+?14AEk zl%%1L%(<$UAh8F+_UCDE+O^=o;KCd(J>Xp*UDbUX99i0SB*v*kuK^gl({WWD52+)t z0eD^I6-hE3%a^-~7$mHJ(}Hvumhd-Ej~A!Q6bkDpW5p|fvpWrPYG*j3ehm@5u93Bu z>@2=ke>>9JUKm;ZuJfyL5DTZ?y)b7?>J07$r8|;EW=1#6^aPM>n|Gk#xVe z4A)xRWRth{!Dx_}f$mgvlZN$`eoVO0+zd4TXW)o&aJbQT8Hgm`-=xg`Hn!!Na4^?@ zYV5yI-wR*(>_qW`ycwGk8DOm`k>dH0Y?;b1k>t1 z=y11HVxp*ji>~*P9ki%hj`ZGrk>2SRo8M9E3Oq%Z+t(L4KMz{v6ihBzm@1B|kt@rB z=k(4(WSs#pLKgz)Cg$Cu1zGq=$}*K%GrE)or&(hon)E|o{sa=LZh~oOKRD=TphNTm zz0nUnY!B!poqhzGzU_xHow5u05I~E#c8d$_M~(Y~BlUSy`2%qD(!~IV(yHgtF`aJH z=I13&=H2G1Pj+1K5~t|yTIOvY=~YWAq0{|Qqn#o2~I6#`Q z^5CmFmxBeH@yr4=T)cOi4v*GZ{K9vwh{|hbfxJD@(!!v4=@VG-s17&lq$sLD;We^;3(LiJy z4$x*OKri}hAS$yPKwGu|L$o1J(f;%j#6{s9y+}%|3W$36&J%2Y4D{+Vsb=jRD2dSx z9y1u(Ck%#dyKHPg!o;mRv^EcwG;}D&n##dw#l*XGW3U`6`rf5sL*xYQg}dAjRedNX z&!O1sD7j0Ub9AvNG4n1h8Y;VM^TCPRWVq%Or}r>;)-r&$!ZO&PFD51&bNRy15r%h= zYHN`N!%#I_K!+$5c*%(O<6i_LSN->Q_4ckF1{06pB}=w!qx}tTJbuc?;5|DV5!Y~! z!>poDXJbiI{~kTbmV>ll;JtKwVGiWm++*u|XkCEYswd+G>E$*GS>~!$Z2CP)8in!! zMxO(l%}qd?Xcc%x!96ypgEsY<#0|OVK5qb2hL~A{i2#O*b@!+&SLSIS|9_%4g$zes zRUie^E3QBmtJhtPl)NtZngX*i(kNxChht6tlghqjgA7zBSEcR&$DT39BM+9I)>)}% z9!8q~f&+t6zDy9e?{U-j*XrI^gHygtqWF9axBgVkc@>X9hh3bH8AK~Eq_IqDJ>Eep zHY5N*ydEjj-Sm5`@^}~RKKl)htBk<1wiF!Mii0MN#5J;f8TS0AFa)6coPRPM8i@gQ zYYpLnrxcUbviF<&+zK7F5E%CwfjB{($E%O2Ip0pnAj@goxPyu}RHY0gMwH9?+RFva2}qfSMPe zxo;!A3mL~^YlWx%wv}eaL+<84(?#w>sxFXY#Ds@*wvZS7yb0o7h^qe+Ov4ouH7G>2 z-UpqbtExb{dn%f8BAPP%5ntA!vH)%oogT5K{#sAqDw8;3{<{58M?-2bURb#33*SN| z(Mhc}8t9OH+hG<2Qph+CyCrGGm?*pnI>tepG2_-RV)zI+$~jI((TZ_spMO81>S8p- zA>bj5`%u<6)YnDO-E{ev$H^G&AJB0Q+TzfsJ!ZdC`Ff5==7A*`9?Sr3#wakm1c9*C zGvJ2|b^sXV5ci=QCDK`Y4xlY>h{tF>L8m#Gys3CRV!}{>@ea_HJ{^y_MG-&*rBbZ9 zOr?mcGar+sRQA+f1CD@FDx1>MQq;~o(3si3gxDB03H~#90yYiR&7Y&EN-w$Nv4P5F zNvk63Nm#Y{yaiN5!s0BcWPDYmFs;O+U9D?Vk(p(uWsE!xDyj@Tpe&9Xs5Oe1irJIfGz{$x477Nz z3}T|@ix*gZz6^$y(`1Ou#9q_ZiBJJ5fL_=ot;T%X!}6)qG3vd7I}oPJPGWwl5b!I*uE;4}RYn=&%tfTd>S-&=Pz?b_x?YaFBWFNc;A=o|cW%X09SM`A zc)v#FJavYQ7r3DA@B$=(2yskww%fq9vtZj>GvP=_AmqtSW{1MW&Du7D}(xWe@n%;>*ViS20WEAaR#aNv$i_GEDQ(9u^gBGr+!^=)kC zBu&7IQo%8=Vn&lFjqLTaQNG_^#UP;Cw>wRn1>o0LWsKM)$z!%0s~rL(l+Kn}j#j#> zvpty&wuVj=S%$)cus8~z;>1-RL~CBdytyyF*A+uEUX$UD^e=2ejpv{l_dD4t6I1}b zG6#e49}vMY7%s?nb5I6njc(479YvT%k=zKqUx$ChYwRD*so(2x&!qY2L4%OYww!$( zOi*$vkZ9zV(0b0fu)v z>mF9a4cM%g?6@<#SaZ(DiN2kW72w>L;gr{$DY7=~Bc3QmoD^Ju*7jWh9=AHolPo*c zu~jqldn{iF&Hv%#?sZsmZ#l!Bd~Oj+h)D?I$oLQ zMzh0a<2E|H5N%;v3PY?*FpivE48CJ7dUkd=K=jAU086mU98;I8xdZK9f}l6kM);P4 zc&DyjrI0aGNjW0tmvxO8pOcqhtD&MCm3~CA|4TfqOV^g7f`3?wfcM5yIDnTc`{2!` zXmo&hVb7I0`fHhXJb_HB5JA_09>9Dd^!YN(ns>O;^<}cByz6SDn=ith@YaEeep-$` zws1A{dek#w07zag)9J=)_+`&}RJ|N}bAe+pChYTMyeVDeOZ9M{*aThPiz41cji~xs zSdUwyIfcI|!{u%;ArPrdqV)92dfcGCoNasUk;-iATQF|kTc`uppt-woPIk~LGTpdg ze5q^&I8K9CjB(>OsXD1YohPgWuHhv6e>gY~vN zxEd9y8X^f`F9#T=y#Tt{K_gbKk>QF{j`y@RCGzs3O0*g$#%S9ik?oK`_g#yW;X+nY7I>`uW3rKNQp*>RwgcAPcg*AUDlWStwZ=PG0}{5@Q;rn5l*e& zL*(0UqSh7I^(uM?og*IqX-AQmz=;vG;RESfuLqVBlMR=E;_(opV;Z14R=$G?^DPrD zRl~ZdL48N!(04JCG_TKiYXafw#S1w8jubE9_w0z3buRA?wkWJK&t_5eu6(;EEWb6*ORvg4Q@{`w^l; ziZ|W(*`B!)TmBI$b&)r1`AGH`XT0@HIR!gVu9WdH7Ht+h*;o%#{`?p#fZ+{Uvm#=} z%MHo00Wot^LzerOcAz0XoJT<$WNe+@s#&h$0vQ=i*_$vP9NY*8YQGU1+ZqLKfJF;8 zqO%54w*5Dq+z49|eCXx@yNM8V5kv73&?cEFO4Q%hv|%8d{aYLfEIrt#B7(( zQNT8|SY6x;vJE}dtp0X&DK+%R#5>WfvozQamf<#{fQdwLYN3XxvUbQy;BZ@iU6jcEStl?SyHi ze!9n3{s%~xoftLV^wZ5($SUw?UqCR4Ztj%raRx_!67{VgUE7I$q)H^kvwEB}bH_{h zzbV@yUHMAwQK*ZDe!5dZnOVc3Ih{G22JS*1cJ=3O6-b;&*}KsHeEr#z8q?k{5c{|B zw45;((f^52afSoS%3K#ITaD#~O#Y!$t6RQP>ezZY|xwNa49!#$gH zl$haPtE?|UpIA{_h7sDk8{zhY+J-&Z4a2_j=Rm8B_aY!}G-XGN{8nzFyV>@!=c0z7G1SA-b&cAy~&_Zp$#N%kJ#XiT% zD5C=5J?Sf$c17hiRyYUf{aPp=bU03;qk|-38|`a3*Eti3 zWkyG8hV!7Ofh0Qq4IToH06MdVEr|wyi|#T3`(xkY!R~aV;t?ws)%+c%xeICU9-Fba zT&+kQ1X@c`6`1v`{SH0nQ}E*}3e3+mJ@^ir8x;Tt)B*>74_7#h7a7?V7X1J}9&Foh5S7dnWYfqFDwbP$CebP)M{SA&F#6PU2@Fu}<# zUGZ=_-Eakx2jP{s11aJVX7UD$9-tN-!sD!93nxb6kUYGxqeXXirQ2KyZ%nu7QS?xy z^l`PH$I7(m70MugkjRx1s)UD@W8uD!S&2U(rKvU(bd*kaJ&Zyx1)b!eL&O>jo7z^} z1stbhSnk{r1eP=J+h$Reh_#T|Z_#HQNVC%1&r#q%Ec!eNNSs$DMrwW&-9Cv*Ypf4i zNKDn%HFlW5s$KekxzO;R#=89s(VU|gJil(Nci7@zF;-oL5Y{BWpshWQA-g*^jY#xS z2o)WJT@9>y)hIaOXABRi_--x&F$;n=i43c5xt+r*a;oxc@9@;UK7xlRu+V zzKaY0f5tF4)bE4ExM8Hwq-$viLd(vLfgQM=_OIC_^8q*pbJh}P9jfJ7K&o-gPGTvT z&tlrQx(Tg0hjm=UISj!&n^606GEeMPU~3$7U42f5x%RWoiXxlRu=BEoQ)@#9+plQD zPW7v$c!Xm`=dq)^tQk)l7oLZAZyACKvDfd|*8LbD-u!Za#h*wgvAY>f{~bI0-yktb zPyG9L)Xc$VxJFPWinGlq=>jah489APrQ8Hxmd;moK{j=M0y$EN*G`6>Sc3nxCD diff --git a/data/resources/StringResources.es.resources b/data/resources/StringResources.es.resources index f94aa1919130d4ac2579ad8de6ebfc7f623dc05d..d325f9a12a2e4456b05a446936d407143ce01d3b 100644 GIT binary patch delta 42094 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 diff --git a/data/resources/StringResources.nl.resources b/data/resources/StringResources.nl.resources index 9048aaeabd050f6e9afc2281532bbfaa28c455cc..96c40d9af2a858ef1ad373c63e350bfec96b7d21 100644 GIT binary patch delta 41845 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 delta 45921 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
    - - - - - - 0,0,0,0 - - - <DockingManager> - <ResizingPanel Orientation="Horizontal"> - <ResizingPanel ResizeWidth="200" Orientation="Vertical"> - <DockablePane ResizeHeight="441.36166666666668" Anchor="Left"> - <DockableContent Name="content1" AutoHide="false" /> - </DockablePane> - <DockablePane ResizeWidth="200" Anchor="Left"> - <DockableContent Name="content2" AutoHide="false" /> - </DockablePane> - </ResizingPanel> - <ResizingPanel Orientation="Vertical"> - <DocumentPanePlaceHolder /> - <DockablePane ResizeHeight="138" Anchor="Bottom"> - <DockableContent Name="content3" AutoHide="false" /> - </DockablePane> - </ResizingPanel> - <DockablePane ResizeWidth="271" Anchor="Right"> - <DockableContent Name="content4" AutoHide="false" /> - </DockablePane> - </ResizingPanel> - <Hidden /> - <Windows /> -</DockingManager> - - - - - %ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\PresentationFramework.dll - - - - - Maximized - - - - \ No newline at end of file diff --git a/samples/XamlDesigner/Configuration/app.manifest b/samples/XamlDesigner/Configuration/app.manifest deleted file mode 100644 index e82a10f183..0000000000 --- a/samples/XamlDesigner/Configuration/app.manifest +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/samples/XamlDesigner/Converters.cs b/samples/XamlDesigner/Converters.cs deleted file mode 100644 index a9c2ac2bc7..0000000000 --- a/samples/XamlDesigner/Converters.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows.Data; -using System.Globalization; -using System.Windows; -using System.Collections; - -namespace ICSharpCode.XamlDesigner.Converters -{ - public class EnumToIntConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return (int)value; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - return value; - } - } - - public class CollapsedWhenFalse : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return (bool)value ? Visibility.Visible : Visibility.Collapsed; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } - - public class FalseWhenZero : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value == null || (int)value == 0) { - return false; - } - return true; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } - - public class LevelConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return new Thickness(5 + 19 * (int)value, 0, 5, 0); - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/samples/XamlDesigner/Document.cs b/samples/XamlDesigner/Document.cs deleted file mode 100644 index 1899c1a151..0000000000 --- a/samples/XamlDesigner/Document.cs +++ /dev/null @@ -1,243 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.ComponentModel; -using System.IO; -using ICSharpCode.WpfDesign.Designer; -using ICSharpCode.WpfDesign.Designer.XamlBackend; -using ICSharpCode.WpfDesign.Designer.OutlineView; -using System.Xml; -using ICSharpCode.WpfDesign; -using ICSharpCode.WpfDesign.Designer.Services; -using System.Diagnostics; - -namespace ICSharpCode.XamlDesigner -{ - public class Document : INotifyPropertyChanged - { - public Document(string tempName, string text) - : this() - { - this.tempName = tempName; - Text = text; - Context.Parse(Text); - IsDirty = false; - } - - public Document(string filePath) - : this() - { - this.filePath = filePath; - ReloadFile(); - } - - Document() - { - var doc = Shell.Instance.Project.CreateDocument(); - context = new XamlDesignContext(doc); - context.UndoService.UndoStackChanged += new EventHandler(UndoService_UndoStackChanged); - } - - string tempName; - XamlDesignContext context; - - string text; - - public string Text - { - get - { - return text; - } - set - { - if (text != value) { - text = value; - IsDirty = true; - RaisePropertyChanged("Text"); - } - } - } - - DocumentMode mode; - - public DocumentMode Mode - { - get - { - return mode; - } - set - { - mode = value; - //if (InDesignMode) { - // UpdateDesign(); - //} - //else { - // UpdateXaml(); - //} - RaisePropertyChanged("Mode"); - RaisePropertyChanged("InXamlMode"); - RaisePropertyChanged("InDesignMode"); - } - } - - public bool InXamlMode - { - get { return Mode == DocumentMode.Xaml; } - } - - public bool InDesignMode - { - get { return Mode == DocumentMode.Design; } - } - - string filePath; - - public string FilePath - { - get - { - return filePath; - } - private set - { - filePath = value; - RaisePropertyChanged("FilePath"); - RaisePropertyChanged("FileName"); - RaisePropertyChanged("Title"); - RaisePropertyChanged("Name"); - } - } - - bool isDirty; - - public bool IsDirty - { - get - { - return isDirty; - } - private set - { - isDirty = value; - RaisePropertyChanged("IsDirty"); - RaisePropertyChanged("Name"); - RaisePropertyChanged("Title"); - } - } - - public string FileName - { - get - { - if (FilePath == null) return null; - return Path.GetFileName(FilePath); - } - } - - public string Name - { - get - { - return FileName ?? tempName; - } - } - - public string Title - { - get - { - return IsDirty ? Name + "*" : Name; - } - } - - public DesignContext Context - { - get { return context; } - } - - //TODO - //public XamlErrorService XamlErrorService { - // get { - // if (DesignContext != null) { - // return DesignContext.GetService(); - // } - // return null; - // } - //} - - void ReloadFile() - { - Text = File.ReadAllText(FilePath); - //UpdateDesign(); - Context.Parse(Text); - IsDirty = false; - } - - public void Save() - { - //if (InDesignMode) { - // UpdateXaml(); - //} - File.WriteAllText(FilePath, Text); - IsDirty = false; - } - - public void SaveAs(string filePath) - { - FilePath = filePath; - Save(); - } - - public void Refresh() - { - //UpdateXaml(); - //UpdateDesign(); - } - - //void UpdateXaml() - //{ - // if (Context.CanSave) { - // Text = Context.Save(); - // } - //} - - //void UpdateDesign() - //{ - // Context.Parse(Text); - //} - - void UndoService_UndoStackChanged(object sender, EventArgs e) - { - IsDirty = Context.UndoService.CanUndo; - if (Context.ParseSuggested) { - Context.Parse(Text); - } - //if (Context.Is - //IsDirty = true; - //if (InXamlMode) { - // UpdateXaml(); - //} - } - - #region INotifyPropertyChanged Members - - public event PropertyChangedEventHandler PropertyChanged; - - void RaisePropertyChanged(string name) - { - if (PropertyChanged != null) { - PropertyChanged(this, new PropertyChangedEventArgs(name)); - } - } - - #endregion - } - - public enum DocumentMode - { - Xaml, Design - } -} diff --git a/samples/XamlDesigner/DocumentView.xaml b/samples/XamlDesigner/DocumentView.xaml deleted file mode 100644 index 9e1632feab..0000000000 --- a/samples/XamlDesigner/DocumentView.xaml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/samples/XamlDesigner/DocumentView.xaml.cs b/samples/XamlDesigner/DocumentView.xaml.cs deleted file mode 100644 index a61ce04bd9..0000000000 --- a/samples/XamlDesigner/DocumentView.xaml.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; -using ICSharpCode.WpfDesign.Designer.Services; -using System.Windows.Threading; -using ICSharpCode.Xaml; -using ICSharpCode.WpfDesign.Designer; -using ICSharpCode.TextEditor; -using System.Windows.Forms; -using ICSharpCode.TextEditor.Document; -using ICSharpCode.WpfDesign; -using ICSharpCode.TextEditor.Undo; - -namespace ICSharpCode.XamlDesigner -{ - public partial class DocumentView - { - public DocumentView(Document doc) - { - InitializeComponent(); - - ShellDocument = doc; - Shell.Instance.Views[doc] = this; - - uxTextEditor.SetHighlighting("XML"); - uxTextEditor.DataBindings.Add("Text", doc, "Text", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged); - ShellDocument.Context.AddService(typeof(ITextContainer), uxTextEditor); - - uxTextEditor.Document.UndoStack.OperationPushed += UndoStack_OperationPushed; - uxTextEditor.Document.DocumentChanged += Document_DocumentChanged; - uxTextEditor.Document.DocumentAboutToBeChanged += Document_DocumentAboutToBeChanged; - } - - public Document ShellDocument { get; private set; } - - IUndoableOperation lastOperation; - bool textValid; - - void Document_DocumentAboutToBeChanged(object sender, DocumentEventArgs e) - { - textValid = false; - } - - void Document_DocumentChanged(object sender, DocumentEventArgs e) - { - textValid = true; - TryUpdateDesignUndoStack(); - } - - void UndoStack_OperationPushed(object sender, OperationEventArgs e) - { - lastOperation = e.Operation; - TryUpdateDesignUndoStack(); - } - - void TryUpdateDesignUndoStack() - { - if (textValid && lastOperation != null) { - ShellDocument.Context.UndoService.Done(new TextAction(lastOperation)); - lastOperation = null; - } - } - - public DesignSurface DesignSurface - { - get - { - return uxDesignSurface; - } - } - - public void JumpToError(XamlDocumentError error) - { - ShellDocument.Mode = DocumentMode.Xaml; - Dispatcher.BeginInvoke(new Action(delegate { - uxTextEditor.ActiveTextAreaControl.JumpTo(error.LineNumber - 1, error.LinePosition - 1); - }), DispatcherPriority.Background); - } - } - - class TextEditorWithoutUndo : TextEditorControl, ITextContainer - { - public TextEditorWithoutUndo() - { - editactions.Remove(Keys.Control | Keys.Z); - editactions.Remove(Keys.Control | Keys.Y); - } - - public override void EndUpdate() - { - base.EndUpdate(); - } - } - - class TextAction : ITextAction - { - public TextAction(IUndoableOperation op) - { - this.op = op; - } - - IUndoableOperation op; - - public IEnumerable AffectedItems - { - get { yield break; } - } - - public string Title - { - get { return "Text Editing"; } - } - - public void Do() - { - op.Redo(); - } - - public void Undo() - { - op.Undo(); - } - } -} diff --git a/samples/XamlDesigner/EnumBar.xaml b/samples/XamlDesigner/EnumBar.xaml deleted file mode 100644 index b47b79b00f..0000000000 --- a/samples/XamlDesigner/EnumBar.xaml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/samples/XamlDesigner/EnumBar.xaml.cs b/samples/XamlDesigner/EnumBar.xaml.cs deleted file mode 100644 index 9d7e3c4ea5..0000000000 --- a/samples/XamlDesigner/EnumBar.xaml.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; -using System.Windows.Controls.Primitives; - -namespace ICSharpCode.XamlDesigner -{ - public partial class EnumBar - { - public EnumBar() - { - InitializeComponent(); - } - - Type currentEnumType; - - public static readonly DependencyProperty ValueProperty = - DependencyProperty.Register("Value", typeof(object), typeof(EnumBar), - new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); - - public object Value { - get { return (object)GetValue(ValueProperty); } - set { SetValue(ValueProperty, value); } - } - - protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) - { - base.OnPropertyChanged(e); - - if (e.Property == ValueProperty) { - var type = e.NewValue.GetType(); - - if (currentEnumType != type) { - currentEnumType = type; - uxPanel.Children.Clear(); - foreach (var v in Enum.GetValues(type)) { - var b = new EnumButton(); - b.Value = v; - b.Content = Enum.GetName(type, v); - b.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(button_PreviewMouseLeftButtonDown); - uxPanel.Children.Add(b); - } - } - - foreach (EnumButton c in uxPanel.Children) { - if (c.Value.Equals(Value)) { - c.IsChecked = true; - } - else { - c.IsChecked = false; - } - } - } - } - - void button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) - { - Value = (sender as EnumButton).Value; - e.Handled = true; - } - } -} diff --git a/samples/XamlDesigner/EnumButton.cs b/samples/XamlDesigner/EnumButton.cs deleted file mode 100644 index a8a86d7d4a..0000000000 --- a/samples/XamlDesigner/EnumButton.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows.Controls.Primitives; -using System.Windows; - -namespace ICSharpCode.XamlDesigner -{ - public class EnumButton : ToggleButton - { - static EnumButton() - { - DefaultStyleKeyProperty.OverrideMetadata(typeof(EnumButton), - new FrameworkPropertyMetadata(typeof(EnumButton))); - } - - public static readonly DependencyProperty ValueProperty = - DependencyProperty.Register("Value", typeof(object), typeof(EnumButton)); - - public object Value { - get { return (object)GetValue(ValueProperty); } - set { SetValue(ValueProperty, value); } - } - } -} diff --git a/samples/XamlDesigner/ErrorListView.xaml b/samples/XamlDesigner/ErrorListView.xaml deleted file mode 100644 index b5bc2625ec..0000000000 --- a/samples/XamlDesigner/ErrorListView.xaml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - diff --git a/samples/XamlDesigner/ErrorListView.xaml.cs b/samples/XamlDesigner/ErrorListView.xaml.cs deleted file mode 100644 index 4faf31f33f..0000000000 --- a/samples/XamlDesigner/ErrorListView.xaml.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; -using ICSharpCode.WpfDesign.Designer.Services; -using ICSharpCode.Xaml; - -namespace ICSharpCode.XamlDesigner -{ - public partial class ErrorListView - { - public ErrorListView() - { - InitializeComponent(); - } - - protected override void OnMouseDoubleClick(MouseButtonEventArgs e) - { - var error = e.GetDataContext() as XamlDocumentError; - if (error != null) { - Shell.Instance.JumpToError(error); - } - } - } -} diff --git a/samples/XamlDesigner/ExtensionMethods.cs b/samples/XamlDesigner/ExtensionMethods.cs deleted file mode 100644 index ff09256e1d..0000000000 --- a/samples/XamlDesigner/ExtensionMethods.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows; -using System.Windows.Documents; -using System.Windows.Media; -using System.IO; -using System.Collections.ObjectModel; -using System.Collections.Specialized; -using System.Collections; - -namespace ICSharpCode.XamlDesigner -{ - static class ExtensionMethods - { - public static IEnumerable Paths(this IDataObject data) - { - string[] paths = (string[])data.GetData(DataFormats.FileDrop); - if (paths != null) { - foreach (var path in paths) { - yield return path; - } - } - } - - public static T GetObject(this IDataObject data) - { - return (T)data.GetData(typeof(T).FullName); - } - - public static Stream ToStream(this string s) - { - return new MemoryStream(Encoding.UTF8.GetBytes(s)); - } - - public static void AddRange(this ObservableCollection col, IEnumerable items) - { - foreach (var item in items) { - col.Add(item); - } - } - - public static void KeepSyncronizedWith(this IList target, ObservableCollection source, Func convert) - { - target.Clear(); - foreach (var item in source) { - target.Add(convert(item)); - } - - source.CollectionChanged += delegate(object sender, NotifyCollectionChangedEventArgs e) { - switch (e.Action) { - case NotifyCollectionChangedAction.Add: - target.Add(convert((S)e.NewItems[0])); - break; - - case NotifyCollectionChangedAction.Remove: - target.RemoveAt(e.OldStartingIndex); - break; - - case NotifyCollectionChangedAction.Move: - target.RemoveAt(e.OldStartingIndex); - target.Insert(e.NewStartingIndex, e.NewItems[0]); - break; - - case NotifyCollectionChangedAction.Replace: - target[e.NewStartingIndex] = convert((S)e.NewItems[0]); - break; - - case NotifyCollectionChangedAction.Reset: - target.Clear(); - break; - } - }; - } - - public static object GetDataContext(this RoutedEventArgs e) - { - var f = e.OriginalSource as FrameworkElement; - if (f != null) return f.DataContext; - return null; - } - } -} diff --git a/samples/XamlDesigner/Images/Control.png b/samples/XamlDesigner/Images/Control.png deleted file mode 100644 index 386cb302f16b36e4ae67dc9f0aea1b4a051c22c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 470 zcmV;{0V)28P)``2`~zsHhc-<7$F60BN8G$;h9Qc)$m zPjaF(rLGTDO~!4K5|M!ls#FRA{~+9_mh$B%Z0UrmNw|v!8R{*)VvIsyE!@@WjQ0Lu zG45gF&|%`^8m{Z2fQS@JKovnbzF5W>!$F>t_qCIs%wUXRcKm?<7uRk6jy>0U{$XW$ zkEc3qYB0utYFr3Nl5}@-_vnko8F3szAXJEHK*aJ;t?e|ae*4Gt7rT9)_)n@C%m4rY M07*qoM6N<$f~O_aVE_OC diff --git a/samples/XamlDesigner/Images/Error.png b/samples/XamlDesigner/Images/Error.png deleted file mode 100644 index c37bd062e60c3b38fc82e4d1f236a8ac2fae9d8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 701 zcmV;u0z&N#0$9Ug7g~-`rQ^qx~m@y2OU8A z#zh~=7n#Z$Z*fx-GOtDf07cgx0suCz_W(2~Y(0tf@FX@P6EPuM_dgn$vj9LucO)%W zw%HgMW>=#oL>nZ>M&NEf08>)#)k<{$fCT_r>rPi=BV=hFh6WS^qqze>C6Ek}o{M5% za|@JGowu0t{&hgNzySHZxy@LTNh);YzZ2zSp_ zl$^T&Dnc|NLb&RD_!4>pt@VHdP)ZGER%5ZmWEe$lryR&y;2u^3cOkO4#6c%-(EY6a{600000NkvXXu0mjfxS2AI diff --git a/samples/XamlDesigner/Images/Folder.png b/samples/XamlDesigner/Images/Folder.png deleted file mode 100644 index 784e8fa48234f4f64b6922a6758f254ee0ca08ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537 zcmV+!0_OdRP)x(K@^6+>g^d@v4;gkbWsEoXE%32*i1tcpTNXd5CcIl)ECgqz|2rE6EW}s7R?kl za1q`0GCkMruC6-2LANtwVlsgzsp4?{@7$`KBv!G66>Vie3h?3OmEEkjwdLG0PgLVi z`!N((f$A@n17Ldj#`};0I3@iHJ5M{#IZz|UIYRm4(!uV7eYIYIwQf&}_2J~}>pQ^n z6o8--^T(=hkBNQ_k{-_GWE;FMW7!p}f{NG3nHZ{D5<3d8&tLh%a4AqqnjMkr3m&fkMdECD3N5}Unig5wy40;>lo4j~k+e}v)` zR6)J8Mk*u=SpB`p6o)7j?S0T@9?bz#m@l>gc*zk__|*!FMcHwP!gwLJvS~9c0px8E zWPdx7Gpo85HS{lQpSrqx*2ez1K(ux8 z!fi8`?Ow9s=-QoUHtjyUdEfcH$F3edbMw^2yO(c1zW3bpHv#SClhqJ&VvY3HE zs1Sr1Ki{e90}4u%xJHx&=ckpFCl;kL1SDqWmFW4ohA5O7>lqt3w77#xn+#7E#}JL+ zx&6n58WaSa54MSj9&OtD_rLi%jp_oMS<(02s7N!(PrSe2%v6y%s)j#$9^KhqI`h~< zew!0~UnWhud5uA6Z|MQ4+$kTvZxfzk62-LSMKt?79<$J2?*wHST@oGS6W_l6FCVRU X-e)bP0l+XkKV4j%y diff --git a/samples/XamlDesigner/Images/Tag.png b/samples/XamlDesigner/Images/Tag.png deleted file mode 100644 index b7686f106b0931ea8140d4fbf72eb7413053f7d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 389 zcmV;00eb$4P) z7zJ2Ez_8~bKiNTJ(D{JhbKcWq5v!hmfEg0E`Sl0y#m|p{BaHYsTodXqMkH2FaCfdig(a=HrhF zNmtlV)TkHVj0m0o^n2E-7ymu_9^8|Uy99RuP)^!=>Z5xgxuBVkz60e@T>vvlG3APo zZNr^osf(ZfcWt=~4+F1BkM3oxc>W(GCl`GYdl - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples/XamlDesigner/MainWindow.xaml.cs b/samples/XamlDesigner/MainWindow.xaml.cs deleted file mode 100644 index 7c88be3fd9..0000000000 --- a/samples/XamlDesigner/MainWindow.xaml.cs +++ /dev/null @@ -1,191 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Shapes; -using ICSharpCode.XamlDesigner.Properties; -using System.ComponentModel; -using Microsoft.Win32; -using AvalonDock; -using System.IO; -using System.Collections.Specialized; -using ICSharpCode.WpfDesign.Designer; -using ICSharpCode.Xaml; - -namespace ICSharpCode.XamlDesigner -{ - public partial class MainWindow - { - public MainWindow() - { - Instance = this; - DataContext = Shell.Instance; - RenameCommands(); - - InitializeComponent(); - - Shell.Instance.PropertyGrid = uxPropertyGridView.PropertyGrid; - AvalonDockWorkaround(); - RegisterCommandHandlers(); - - LoadSettings(); - ProcessPaths(App.Args); - } - - public static MainWindow Instance; - - OpenFileDialog openFileDialog; - SaveFileDialog saveFileDialog; - - protected override void OnDragEnter(DragEventArgs e) - { - ProcessDrag(e); - } - - protected override void OnDragOver(DragEventArgs e) - { - ProcessDrag(e); - } - - protected override void OnDrop(DragEventArgs e) - { - ProcessPaths(e.Data.Paths()); - } - - protected override void OnClosing(CancelEventArgs e) - { - if (Shell.Instance.PrepareExit()) { - SaveSettings(); - } - else { - e.Cancel = true; - } - base.OnClosing(e); - } - - void RecentFiles_Click(object sender, RoutedEventArgs e) - { - var path = (string)(e.OriginalSource as MenuItem).Header; - Shell.Instance.Open(path); - } - - void ProcessDrag(DragEventArgs e) - { - e.Effects = DragDropEffects.None; - e.Handled = true; - - foreach (var path in e.Data.Paths()) { - if (path.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) || - path.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase)) { - e.Effects = DragDropEffects.Copy; - break; - } - else if (XamlConstants.HasXamlExtension(path)) { - e.Effects = DragDropEffects.Copy; - break; - } - } - } - - void ProcessPaths(IEnumerable paths) - { - foreach (var path in paths) { - //if (path.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) || - // path.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase)) { - // Toolbox.Instance.AddAssembly(path); - //} - //else - if (XamlConstants.HasXamlExtension(path)) { - Shell.Instance.Open(path); - } - } - } - - public string AskOpenFileName() - { - if (openFileDialog == null) { - openFileDialog = new OpenFileDialog(); - openFileDialog.Filter = "Xaml Documents (*.xaml)|*.xaml"; - } - if ((bool)openFileDialog.ShowDialog()) { - return openFileDialog.FileName; - } - return null; - } - - public string AskSaveFileName(string initName) - { - if (saveFileDialog == null) { - saveFileDialog = new SaveFileDialog(); - saveFileDialog.Filter = "Xaml Documents (*.xaml)|*.xaml"; - } - saveFileDialog.FileName = initName; - if ((bool)saveFileDialog.ShowDialog()) { - return saveFileDialog.FileName; - } - return null; - } - - void LoadSettings() - { - WindowState = Settings.Default.MainWindowState; - - Rect r = Settings.Default.MainWindowRect; - if (r != new Rect()) { - Left = r.Left; - Top = r.Top; - Width = r.Width; - Height = r.Height; - } - - if (Settings.Default.AvalonDockLayout != null) { - uxDockingManager.RestoreLayout(Settings.Default.AvalonDockLayout.ToStream()); - } - - var toolboxContentPath = "WpfToolbox.xaml"; - if (File.Exists(toolboxContentPath)) { - uxToolbox.Load(File.ReadAllText(toolboxContentPath)); - } - } - - void SaveSettings() - { - Settings.Default.MainWindowState = WindowState; - if (WindowState == WindowState.Normal) { - Settings.Default.MainWindowRect = new Rect(Left, Top, Width, Height); - } - - var writer = new StringWriter(); - uxDockingManager.SaveLayout(writer); - Settings.Default.AvalonDockLayout = writer.ToString(); - - Shell.Instance.SaveSettings(); - } - - #region AvalonDockWorkaround - - void AvalonDockWorkaround() - { - uxDocumentPane.Items.KeepSyncronizedWith(Shell.Instance.Documents, d => CreateContentFor(d)); - } - - DocumentContent CreateContentFor(Document doc) - { - var content = new DocumentContent() { - DataContext = doc, - Content = new DocumentView(doc) - }; - content.SetBinding(DocumentContent.TitleProperty, "Title"); - return content; - } - - #endregion - } -} diff --git a/samples/XamlDesigner/MainWindow_Commands.cs b/samples/XamlDesigner/MainWindow_Commands.cs deleted file mode 100644 index a1eaf2ece3..0000000000 --- a/samples/XamlDesigner/MainWindow_Commands.cs +++ /dev/null @@ -1,143 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows.Input; -using System.Windows; -using ICSharpCode.WpfDesign.Designer; -using ICSharpCode.WpfDesign; - -namespace ICSharpCode.XamlDesigner -{ - public partial class MainWindow - { - public static SimpleCommand CloseAllCommand = new SimpleCommand("Close All"); - public static SimpleCommand SaveAllCommand = new SimpleCommand("Save All", ModifierKeys.Control | ModifierKeys.Shift, Key.S); - public static SimpleCommand ExitCommand = new SimpleCommand("Exit"); - public static SimpleCommand RefreshCommand = new SimpleCommand("Refresh", Key.F5); - - static void RenameCommands() - { - ApplicationCommands.Open.Text = "Open..."; - ApplicationCommands.SaveAs.Text = "Save As..."; - } - - void RegisterCommandHandlers() - { - this.AddCommandHandler(ApplicationCommands.New, Shell.Instance.New); - this.AddCommandHandler(ApplicationCommands.Open, Shell.Instance.Open); - this.AddCommandHandler(ApplicationCommands.Close, Shell.Instance.CloseCurrentDocument, HasCurrentDocument); - this.AddCommandHandler(ApplicationCommands.Save, Shell.Instance.SaveCurrentDocument, HasCurrentDocument); - this.AddCommandHandler(ApplicationCommands.SaveAs, Shell.Instance.SaveCurrentDocumentAs, HasCurrentDocument); - - this.AddCommandHandler(SaveAllCommand, SaveAll, HasCurrentDocument); - this.AddCommandHandler(CloseAllCommand, CloseAll, HasCurrentDocument); - this.AddCommandHandler(ExitCommand, Shell.Instance.Exit, HasCurrentDocument); - this.AddCommandHandler(RefreshCommand, Shell.Instance.Refresh, Shell.Instance.CanRefresh); - - this.AddCommandHandler(ApplicationCommands.Undo, Undo, CanUndo); - this.AddCommandHandler(ApplicationCommands.Redo, Redo, CanRedo); - this.AddCommandHandler(ApplicationCommands.Copy, Copy, CanCopy); - this.AddCommandHandler(ApplicationCommands.Cut, Cut, CanCut); - this.AddCommandHandler(ApplicationCommands.Delete, Delete, CanDelete); - this.AddCommandHandler(ApplicationCommands.Paste, Paste, CanPaste); - this.AddCommandHandler(ApplicationCommands.SelectAll, SelectAll, CanSelectAll); - } - - bool HasCurrentDocument() - { - return Shell.Instance.CurrentDocument != null; - } - - void SaveAll() - { - Shell.Instance.SaveAll(); - } - - void CloseAll() - { - Shell.Instance.CloseAll(); - } - - ICommandService CurrentCommandService - { - get - { - if (Shell.Instance.CurrentDocument != null) { - return Shell.Instance.CurrentDocument.Context.CommandService; - } - return null; - } - } - - void Undo() - { - CurrentCommandService.Undo(); - } - - void Redo() - { - CurrentCommandService.Redo(); - } - - void Copy() - { - CurrentCommandService.Copy(); - } - - void Paste() - { - CurrentCommandService.Paste(); - } - - void Cut() - { - CurrentCommandService.Cut(); - } - - void SelectAll() - { - CurrentCommandService.SelectAll(); - } - - void Delete() - { - CurrentCommandService.Delete(); - } - - bool CanUndo() - { - return CurrentCommandService != null && CurrentCommandService.CanUndo(); - } - - bool CanRedo() - { - return CurrentCommandService != null && CurrentCommandService.CanRedo(); - } - - bool CanCopy() - { - return CurrentCommandService != null && CurrentCommandService.CanCopy(); - } - - bool CanPaste() - { - return CurrentCommandService != null && CurrentCommandService.CanPaste(); - } - - bool CanCut() - { - return CurrentCommandService != null && CurrentCommandService.CanCut(); - } - - bool CanSelectAll() - { - return CurrentCommandService != null && CurrentCommandService.CanSelectAll(); - } - - bool CanDelete() - { - return CurrentCommandService != null && CurrentCommandService.CanDelete(); - } - } -} diff --git a/samples/XamlDesigner/NewFileTemplate.xaml b/samples/XamlDesigner/NewFileTemplate.xaml deleted file mode 100644 index a2b830f012..0000000000 --- a/samples/XamlDesigner/NewFileTemplate.xaml +++ /dev/null @@ -1,4 +0,0 @@ - - - \ No newline at end of file diff --git a/samples/XamlDesigner/Properties/AssemblyInfo.cs b/samples/XamlDesigner/Properties/AssemblyInfo.cs deleted file mode 100644 index c0ea722fa8..0000000000 --- a/samples/XamlDesigner/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Windows; - -[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)] \ No newline at end of file diff --git a/samples/XamlDesigner/Properties/Settings.Designer.cs b/samples/XamlDesigner/Properties/Settings.Designer.cs deleted file mode 100644 index 213b5bbc32..0000000000 --- a/samples/XamlDesigner/Properties/Settings.Designer.cs +++ /dev/null @@ -1,110 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.3053 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ICSharpCode.XamlDesigner.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("0,0,0,0")] - public global::System.Windows.Rect MainWindowRect { - get { - return ((global::System.Windows.Rect)(this["MainWindowRect"])); - } - set { - this["MainWindowRect"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute(@" - - - - - - - - - - - - - - - - - - - - - -")] - public string AvalonDockLayout { - get { - return ((string)(this["AvalonDockLayout"])); - } - set { - this["AvalonDockLayout"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - public global::System.Collections.Specialized.StringCollection RecentFiles { - get { - return ((global::System.Collections.Specialized.StringCollection)(this["RecentFiles"])); - } - set { - this["RecentFiles"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute(@" - - %ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\PresentationFramework.dll -")] - public global::System.Collections.Specialized.StringCollection AssemblyList { - get { - return ((global::System.Collections.Specialized.StringCollection)(this["AssemblyList"])); - } - set { - this["AssemblyList"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("Maximized")] - public global::System.Windows.WindowState MainWindowState { - get { - return ((global::System.Windows.WindowState)(this["MainWindowState"])); - } - set { - this["MainWindowState"] = value; - } - } - } -} diff --git a/samples/XamlDesigner/Properties/Settings.settings b/samples/XamlDesigner/Properties/Settings.settings deleted file mode 100644 index 06bf0de18a..0000000000 --- a/samples/XamlDesigner/Properties/Settings.settings +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - 0,0,0,0 - - - <DockingManager> - <ResizingPanel Orientation="Horizontal"> - <ResizingPanel ResizeWidth="200" Orientation="Vertical"> - <DockablePane ResizeHeight="441.36166666666668" Anchor="Left"> - <DockableContent Name="content1" AutoHide="false" /> - </DockablePane> - <DockablePane ResizeWidth="200" Anchor="Left"> - <DockableContent Name="content2" AutoHide="false" /> - </DockablePane> - </ResizingPanel> - <ResizingPanel Orientation="Vertical"> - <DocumentPanePlaceHolder /> - <DockablePane ResizeHeight="138" Anchor="Bottom"> - <DockableContent Name="content3" AutoHide="false" /> - </DockablePane> - </ResizingPanel> - <DockablePane ResizeWidth="271" Anchor="Right"> - <DockableContent Name="content4" AutoHide="false" /> - </DockablePane> - </ResizingPanel> - <Hidden /> - <Windows /> -</DockingManager> - - - - - - <?xml version="1.0" encoding="utf-16"?> -<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <string>%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\PresentationFramework.dll</string> -</ArrayOfString> - - - Maximized - - - \ No newline at end of file diff --git a/samples/XamlDesigner/Properties/app.manifest b/samples/XamlDesigner/Properties/app.manifest deleted file mode 100644 index e82a10f183..0000000000 --- a/samples/XamlDesigner/Properties/app.manifest +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/samples/XamlDesigner/Shell.cs b/samples/XamlDesigner/Shell.cs deleted file mode 100644 index 222ba76781..0000000000 --- a/samples/XamlDesigner/Shell.cs +++ /dev/null @@ -1,287 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.ComponentModel; -using System.Collections.ObjectModel; -using ICSharpCode.WpfDesign.Designer.PropertyGrid; -using ICSharpCode.XamlDesigner.Properties; -using System.Collections.Specialized; -using System.IO; -using System.Windows; -using System.Diagnostics; -using ICSharpCode.WpfDesign.Designer.Services; -using ICSharpCode.Xaml; -using ICSharpCode.WpfDesign.Designer.XamlBackend; - -namespace ICSharpCode.XamlDesigner -{ - public class Shell : INotifyPropertyChanged - { - public Shell() - { - Documents = new ObservableCollection(); - RecentFiles = new ObservableCollection(); - Views = new Dictionary(); - - LoadSettings(); - } - - public static Shell Instance = new Shell(); - public const string ApplicationTitle = "Xaml Designer"; - - //public Toolbox Toolbox { get; set; } - //public SceneTree SceneTree { get; set; } - public PropertyGrid PropertyGrid { get; internal set; } - //public ErrorList ErrorList { get; set; } - - public ObservableCollection Documents { get; private set; } - public ObservableCollection RecentFiles { get; private set; } - public Dictionary Views { get; private set; } - - XamlProject project = new DefaultWpfProject(); - - public XamlProject Project - { - get { return project; } - } - - Document currentDocument; - - public Document CurrentDocument - { - get - { - return currentDocument; - } - set - { - currentDocument = value; - RaisePropertyChanged("CurrentDocument"); - RaisePropertyChanged("Title"); - } - } - - public DocumentView CurrentDocumentView - { - get - { - if (CurrentDocument != null) { - return Views[CurrentDocument] as DocumentView; - } - return null; - } - } - - public string Title - { - get - { - if (CurrentDocument != null) { - return CurrentDocument.Title + " - " + ApplicationTitle; - } - return ApplicationTitle; - } - } - - void LoadSettings() - { - if (Settings.Default.RecentFiles != null) { - RecentFiles.AddRange(Settings.Default.RecentFiles.Cast()); - } - } - - public void SaveSettings() - { - if (Settings.Default.RecentFiles == null) { - Settings.Default.RecentFiles = new StringCollection(); - } - else { - Settings.Default.RecentFiles.Clear(); - } - foreach (var f in RecentFiles) { - Settings.Default.RecentFiles.Add(f); - } - } - - public static void ReportException(Exception x) - { - MessageBox.Show(x.ToString()); - } - - public void JumpToError(XamlDocumentError error) - { - if (CurrentDocument != null) { - (Views[CurrentDocument] as DocumentView).JumpToError(error); - } - } - - public bool CanRefresh() - { - return CurrentDocument != null; - } - - public void Refresh() - { - CurrentDocument.Refresh(); - } - - #region Files - - bool IsSomethingDirty - { - get - { - foreach (var doc in Shell.Instance.Documents) { - if (doc.IsDirty) return true; - } - return false; - } - } - - static int nonameIndex = 1; - - public void New() - { - Document doc = new Document("New" + nonameIndex++, File.ReadAllText("NewFileTemplate.xaml")); - Documents.Add(doc); - CurrentDocument = doc; - } - - public void Open() - { - var path = MainWindow.Instance.AskOpenFileName(); - if (path != null) { - Open(path); - } - } - - public void Open(string path) - { - path = Path.GetFullPath(path); - - if (RecentFiles.Contains(path)) { - RecentFiles.Remove(path); - } - RecentFiles.Insert(0, path); - - foreach (var doc in Documents) { - if (doc.FilePath == path) { - CurrentDocument = doc; - return; - } - } - - var newDoc = new Document(path); - Documents.Add(newDoc); - CurrentDocument = newDoc; - } - - public bool Save(Document doc) - { - if (doc.IsDirty) { - if (doc.FilePath == null) { - return SaveAs(doc); - } - doc.Save(); - } - return true; - } - - public bool SaveAs(Document doc) - { - var initName = doc.FileName ?? doc.Name + ".xaml"; - var path = MainWindow.Instance.AskSaveFileName(initName); - if (path != null) { - doc.SaveAs(path); - return true; - } - return false; - } - - public bool SaveAll() - { - foreach (var doc in Documents) { - if (!Save(doc)) return false; - } - return true; - } - - public bool Close(Document doc) - { - if (doc.IsDirty) { - var result = MessageBox.Show("Save \"" + doc.Name + "\" ?", Shell.ApplicationTitle, - MessageBoxButton.YesNoCancel, MessageBoxImage.Question); - - if (result == MessageBoxResult.Yes) { - if (!Save(doc)) return false; - } - else if (result == MessageBoxResult.Cancel) { - return false; - } - } - Documents.Remove(doc); - Views.Remove(doc); - return true; - } - - public bool CloseAll() - { - foreach (var doc in Documents.ToArray()) { - if (!Close(doc)) return false; - } - return true; - } - - public bool PrepareExit() - { - if (IsSomethingDirty) { - var result = MessageBox.Show("Save All?", Shell.ApplicationTitle, - MessageBoxButton.YesNoCancel, MessageBoxImage.Question); - - if (result == MessageBoxResult.Yes) { - if (!SaveAll()) return false; - } - else if (result == MessageBoxResult.Cancel) { - return false; - } - } - return true; - } - - public void Exit() - { - MainWindow.Instance.Close(); - } - - public void SaveCurrentDocument() - { - Save(CurrentDocument); - } - - public void SaveCurrentDocumentAs() - { - SaveAs(CurrentDocument); - } - - public void CloseCurrentDocument() - { - Close(CurrentDocument); - } - - #endregion - - #region INotifyPropertyChanged Members - - public event PropertyChangedEventHandler PropertyChanged; - - void RaisePropertyChanged(string name) - { - if (PropertyChanged != null) { - PropertyChanged(this, new PropertyChangedEventArgs(name)); - } - } - - #endregion - } -} diff --git a/samples/XamlDesigner/SimpleCommand.cs b/samples/XamlDesigner/SimpleCommand.cs deleted file mode 100644 index eadd7217e6..0000000000 --- a/samples/XamlDesigner/SimpleCommand.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows.Input; - -namespace ICSharpCode.XamlDesigner -{ - public class SimpleCommand : RoutedUICommand - { - public SimpleCommand(string text) - { - Text = text; - } - - public SimpleCommand(string text, ModifierKeys modifiers, Key key) - { - InputGestures.Add(new KeyGesture(key, modifiers)); - Text = text; - } - - public SimpleCommand(string text, Key key) - : this(text, ModifierKeys.None, key) - { - } - } -} diff --git a/samples/XamlDesigner/TestFiles/1.xaml b/samples/XamlDesigner/TestFiles/1.xaml deleted file mode 100644 index cca7754177..0000000000 --- a/samples/XamlDesigner/TestFiles/1.xaml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/samples/XamlDesigner/TestFiles/2.xaml b/samples/XamlDesigner/TestFiles/2.xaml deleted file mode 100644 index 1ecefb8e64..0000000000 --- a/samples/XamlDesigner/TestFiles/2.xaml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - -

    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 delta 43895 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 Cg*|}) diff --git a/data/resources/StringResources.se.resources b/data/resources/StringResources.se.resources index 5c545c6def5565f643efb9b14e2c86391fb8f914..b40577a0b4a6e50b5eda19712ee5e9d3d083bd7f 100644 GIT binary patch delta 45075 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�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 T1l1x(+f-%kZtmB)%^UPTZGTX` delta 32112 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⋙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 A)&Kwi diff --git a/src/AddIns/Misc/ResourceToolkit/Project/Src/Gui/UnusedResourceKeysViewContent.cs b/src/AddIns/Misc/ResourceToolkit/Project/Src/Gui/UnusedResourceKeysViewContent.cs index 0205473941..63e8bfbb00 100644 --- a/src/AddIns/Misc/ResourceToolkit/Project/Src/Gui/UnusedResourceKeysViewContent.cs +++ b/src/AddIns/Misc/ResourceToolkit/Project/Src/Gui/UnusedResourceKeysViewContent.cs @@ -389,23 +389,32 @@ namespace Hornung.ResourceToolkit.Gui /// The key to be deleted. protected static void DeleteResourceKey(string fileName, string key) { - IResourceFileContent content = ResourceFileContentRegistry.GetResourceFileContent(fileName); - if (content != null) { - if (content.ContainsKey(key)) { - LoggingService.Debug("ResourceToolkit: Remove key '"+key+"' from resource file '"+fileName+"'"); - content.RemoveKey(key); + try { + IResourceFileContent content = ResourceFileContentRegistry.GetResourceFileContent(fileName); + if (content != null) { + if (content.ContainsKey(key)) { + LoggingService.Debug("ResourceToolkit: Remove key '"+key+"' from resource file '"+fileName+"'"); + content.RemoveKey(key); + } else { + MessageService.ShowWarningFormatted("${res:Hornung.ResourceToolkit.KeyNotFoundWarning}", key, fileName); + } } else { - MessageService.ShowWarningFormatted("${res:Hornung.ResourceToolkit.KeyNotFoundWarning}", key, fileName); + MessageService.ShowWarning("ResoureToolkit: Could not get ResourceFileContent for '"+fileName+"' key +'"+key+"'."); } - } else { - MessageService.ShowWarning("ResoureToolkit: Could not get ResourceFileContent for '"+fileName+"' key +'"+key+"'."); + } catch (Exception ex) { + MessageService.ShowWarningFormatted("${res:Hornung.ResourceToolkit.ErrorProcessingResourceFile}" + Environment.NewLine + ex.Message, fileName); + return; } foreach (KeyValuePair entry in ResourceFileContentRegistry.GetLocalizedContents(fileName)) { LoggingService.Debug("ResourceToolkit: Looking in localized resource file: '"+entry.Value.FileName+"'"); - if (entry.Value.ContainsKey(key)) { - LoggingService.Debug("ResourceToolkit: -> Key found, removing."); - entry.Value.RemoveKey(key); + try { + if (entry.Value.ContainsKey(key)) { + LoggingService.Debug("ResourceToolkit: -> Key found, removing."); + entry.Value.RemoveKey(key); + } + } catch (Exception ex) { + MessageService.ShowWarningFormatted("${res:Hornung.ResourceToolkit.ErrorProcessingResourceFile}" + Environment.NewLine + ex.Message, entry.Value.FileName); } } } diff --git a/src/AddIns/Misc/ResourceToolkit/Project/Src/Refactoring/ResourceRefactoringService.cs b/src/AddIns/Misc/ResourceToolkit/Project/Src/Refactoring/ResourceRefactoringService.cs index 477823ce28..03f67198f1 100644 --- a/src/AddIns/Misc/ResourceToolkit/Project/Src/Refactoring/ResourceRefactoringService.cs +++ b/src/AddIns/Misc/ResourceToolkit/Project/Src/Refactoring/ResourceRefactoringService.cs @@ -308,23 +308,38 @@ namespace Hornung.ResourceToolkit.Refactoring monitor.BeginTask(null, 0, false); } - // rename references - // FIXME: RenameReferences does not enforce escaping rules. May be a problem if someone uses double-quotes in the new resource key name. - FindReferencesAndRenameHelper.RenameReferences(references, newKey); - - // rename definition (if present) - if (rrr.ResourceFileContent.ContainsKey(rrr.Key)) { - rrr.ResourceFileContent.RenameKey(rrr.Key, newKey); - } else { + try { + // rename definition (if present) + if (rrr.ResourceFileContent.ContainsKey(rrr.Key)) { + rrr.ResourceFileContent.RenameKey(rrr.Key, newKey); + } else { + if (monitor != null) monitor.ShowingDialog = true; + MessageService.ShowWarning("${res:Hornung.ResourceToolkit.RenameKeyDefinitionNotFoundWarning}"); + if (monitor != null) monitor.ShowingDialog = false; + } + } catch (Exception ex) { if (monitor != null) monitor.ShowingDialog = true; - MessageService.ShowWarning("${res:Hornung.ResourceToolkit.RenameKeyDefinitionNotFoundWarning}"); + MessageService.ShowWarningFormatted("${res:Hornung.ResourceToolkit.ErrorProcessingResourceFile}" + Environment.NewLine + ex.Message, rrr.ResourceFileContent.FileName); if (monitor != null) monitor.ShowingDialog = false; + if (monitor != null) monitor.Done(); + // Do not rename the references when renaming the definition failed. + return; } + // rename references + // FIXME: RenameReferences does not enforce escaping rules. May be a problem if someone uses double-quotes in the new resource key name. + FindReferencesAndRenameHelper.RenameReferences(references, newKey); + // rename definitions in localized resource files foreach (KeyValuePair entry in ResourceFileContentRegistry.GetLocalizedContents(rrr.FileName)) { - if (entry.Value.ContainsKey(rrr.Key)) { - entry.Value.RenameKey(rrr.Key, newKey); + try { + if (entry.Value.ContainsKey(rrr.Key)) { + entry.Value.RenameKey(rrr.Key, newKey); + } + } catch (Exception ex) { + if (monitor != null) monitor.ShowingDialog = true; + MessageService.ShowWarningFormatted("${res:Hornung.ResourceToolkit.ErrorProcessingResourceFile}" + Environment.NewLine + ex.Message, entry.Value.FileName); + if (monitor != null) monitor.ShowingDialog = false; } } diff --git a/src/Main/StartUp/Project/Resources/StringResources.resources b/src/Main/StartUp/Project/Resources/StringResources.resources index 63d5f37ac701824f56b36bde85b380bef4f2a340..c563d65d53155ec34b2f958246436b72651ae873 100644 GIT binary patch delta 31343 zcmaI82Y6N0^8Y<+Z4O`zAwUQ{1OyBaL+Cw(BE5tv(t9tVcS4n30}Q=)q=|~sQR%&k zBF&0|0`>;HpM7=`;{E@g_ueO-vu4d|Q@%5^_CEZ(CCl5}vdmp$%IseIb3P|W)n$7U z^FOf(rN&tq5H2E%tt|Y`NTGME6wV?tzplu_e~i>vW8~3fBULwBc{$EXt~QQb_{vDS zbVfeR=}7mdR^GTHviviVH3f~_TV~|xK#?q=R$5ngq;QZU#X=n!kzeGOAdw?cMi%Wh z(l^kNWz$T8M4h&hHoYUQCsi`i2;Bc3JtTrIlX~8hLY=h_h8B_Y6la_ZRCd)R?J8vA7yu>!!0YJagNm8Es~K*Mh`IZ5>mR< z4F2vSUmp`Wwoc^B5Rnz?NZvL^TGw@Cm0G#P_eG7YjL9T2B~j$BQH~7H=t$MAR{B2{ z>D|zgGi+Yk_O!BMj*+x)u;Ty`o7YOEjUs!HLf5{IREsy#sH?~qUs$PIUnFY|BSn7~ ziGRtFfQ(3~yCcXAk= zzUoNAi7!R|>F>xt=>O&hk%DJM#u||cmyG1)uSiCAKGVvh@-$P<}^h-7~Tg8?#j$Ikv&btbax3mUpD( zTuG37109+99C0J&J+&NZzX#F98M(5-N)0tqF{>l}iW~WKG8;W+rPX9B^ZA^6QzZK) zEAM`2WpN)zvfQ-tQ+F$!uNxVIBW+?VZDAzj zp_SjhMM|GqX&fWce!Z2RDl!B$zKsX$+-szBDQw=5LW4kBq#Xa8IPq z%T_MTwGwa8yJO{*cQB?MR{rXZ*lV-X6-It})5`dn*h(3ZvgsVzf=8SVz=}`dvTqof zS_S(^bmX_DBJbdi_j@=}xwDnBhI(xU^Ly9(bVM^4of`8Yf3ixQbuT%_FrD}#Q=|8uu=FvUpEFc*YGenUMk=W(P`J|mmIvQj%7@aQFSp1*I5BO3}klJONp-4`G_ zYDJe}A9bxvnlCa28~M7Ok!*`ZKD=&aSSBlb=Zf?UG?Hc~`ftb1HiB@4C!+7pj$Fl8 zf3Ga^YIY;PzKX?nGUEH#%HJ6{6)5(~FBqQBO2sfEJIfk5uw0}=8j+BpR@!64UFKt; zO+*HR3$wBKQeBM1Pcm|=w@8Lhu_Zo-t`Pb0A-I#k4!`-;$X*a@X@rs2*!8L|j$|F+ z$dQU7y9;3twM63nu#)Df$adiL=xdHlohp(ymysslA&ovFx8g;LRkyNann)A}c$CkP zf|;#EWOn2Rc9XjhYJ%^$4;Ws99o@piJ`yQ>EyT*StVRZnccjyHk&06s>5V}pRt5P= ziHtmC6j(RPW zNbs|jt5Y5M{WmN3FQ& zIV$2e6O1$u1uZJRYUC{@tPpPG=h?eMH40J6_ z_z|c|>&UNQ;?XaRG{pQaqxcaiB-5jqLl@$_M=k*7#SSxsDueF7jppE9(I9S{ID7MPT{MQ}HhbmCyMvs@Rc&=UM?Z=~CBV&ety4;PF^EQ=F)X(m=t-;ouZ?kiko7k{Dr&FpSuG83I5 za{P@UJzH+&lRRXE?*dVZ4B@*xB&WnW9hFgGSTNq{cc8Tk)Grt zLR1>;$X?=KASx>l01dliF*0u>mW*gml5HF#5HA}g za=nWqyUSXce3%pBRdc>4Ubb>%{u_>b&=z%#CYRns?mUQie1%vXhyG7jbz~`7!aCfk z*#t+1j1XyrA(q9$dyzd(inCIx5VQ}Btgc|CC5Dv^-|j%7ox2!O|2>gY*uaL@0V}-d zhdU$yW33!+yzRF}rT_@PV~8VnTbYCY z=2tROy(XxJwGVrhiej#n5?J?8kS&T6&nVh-6ZXqBwtXKZ$gD$H-hn+!(AL<|BW? zt+u10-|>KeS)3#cq^m)WJOGcu1FmzriJwr+^|Dg)iIrany>B!lT6S9Fu)7-$5M ztZZe{T5{ak7exjf0}DPO7|mc}0HrQq@?Ck-&_g1-9$R^UO8XQc5BtYTwG2q;AcpuW zh2L$FE2wz`F#Y+DHm77ehfcBLH*=E{6(jiEvJykyJ2$a%sl0iv;o%>pH!^dxk)!P$ zdC=BKHDcF(vV(z%BTD5>Sg;tJpGaz&Rph<=M%wkoZBHB7LLL=P*q)IQZz4SJx;15a7BgQ49HFB+#BR`D<OF~ z>#*pa^er(Gz@#^85iDZi?@sYF*^%;w>@x#M#^3c$Mt*C>93WmS^RxutGt{#(yO@!F zM5^oSt=s`d3vVD^&-obNLln0bQOPmk0`R%%95U6e#O#~|cEJ7pT}JjdB@f#va-lJ% z{woOv;k_m~S4AxHIrb0*T-NJMUiT#dp#dqD1_~PB78ry|m$kO?2a#|dF}qxT zN3I<+iCM~JN|3rFDP%s6$z(!+v;>Y4#BIi017pjp7 zp_$1;kut8dx&Sv4BS_C99qCM<`mQ;V@ikP>+zB-?B@*GMbMT}iWKC417G$kH%u0(2 z*x>WEKq&UIeW8&zX5liFv+s--DFHI(4;Kmbad9)8`kMftqk--G7fIuq;zr$QW)oa9w0T};E?D|_YJiatB=mGJA2s09;`U?hE(%bladBak%;i3S7zZ6A<}EWsApNZ=ij0|~X!CFxVIySQh1M1%O2 zmSHe}@k#{7PvY_v*scCAc|k|up(=rioFHwil>?P9{sCND)y37P;S>j~!~*%Ve&fDy z4xdOe2M4PMn0A@e7Y@<9%fZhvqs@ivi=7}4fqJceB0@OxIu zU=P2KcH|{&A&vkut|T5yJRs^yj)&+JBntqZHyZBB0?D`tdU?@%n|$OQB*S6jxX>fa z7b}9DvWXwhk*;l|guZQMCg}KMC31%0!;B0ZLcqyFZul0-$4Mja=Eaa_qMu=o)W9x! zGzG`2QyY?Kthi3mTFa5H-AHf?k>-DGrRriXZAe`60er`+al81Mk*L;WW2FdQ7e&$` zmDx|Jpwd(1e$Qng!EE+jLB)w-71Or;^BH)GIn}L&u#m$%Du9yY$c^i8?||luw4g9! z$|d+%L;Pp%bR#8ScccSm^h+Lc=>AmYe}c={_{9>`TP1;0KJNjKdlSc3%#tvT4OFRu zCxzj8dB{8Qs&0H9ss;c*1O2a%xiQ1kdIZp!Tp0Ey#*l&C?8Ai+e=Uj3gI*PRtBy#o zW<=eIc=Q&oW!?sEFqgr_i9e-`Tm==z?zfU1E&crlSc-N1@fuS8>2K;v(mBvW9&9C% zd71pP4fc@9$nt1PIv^-5b;OsO2sICJ25jna4=W$PMY_mwE+fsaGE&J;CV^Uth7wcN=-1sPG$$4@oa_bsl$q4wsOZ6R@w9tQJ$jT(O zuUpCRxs~SMG00HkROTlw=GfiuLBHT(_6ZP!*s zVXke30|onW+2NE9bHJl3lyxLTLy^MMydXCxjrf==SPc5u>!@T98J`d7>@f0PbpmjE z?smd47B=(a-?%@je9FNRO2=~v)E?wUOfx82g6>=Sg44}f&Yc?*wQNSs+Ly_>g-T%PynK?#Hlp=l_?Ie-6VaVhW?P!Pw!IzH|6#Tshl5A9$VSS zFhFweE8ve(pGI?KR-TllAE%EYOb`=y|3F$2$&J`Gs{KYhkRWtLqV6r}jNIwz$hPxL z5Rr)#t0}vz#FaV5ahRaFpb8hr{Czsa$OmgEbhEL@9&|X4^sOWYmlyYEvPop#aR6C% zV%a!i%Yu1ES}h=nTmb&$Ce9V5TpVqsz%*sXd&irjfrnb(020)=c1% z4cpjVi+W@T#ZWUYC7Ylgz;Mb<=4^+X|1EN|q9dRCm}4g>TL@k5rY0%LjytawIkTMd zzpW$VClNnD;5kI!FKcjVf|YMgEveYgIkv&mx6aBSwc|^{T|Lgd;)dsQf_7*Q3Q=@Ao6oxk=NfP!+uV+g~%g5 zq0H`$NCwpm08AccAhV-_Kd=aQ%|Ok9pYKkCp$;_?NR+K~noR>z z5p3?aIG&h2CUm@pdJ^`qd$7OWSt{<{{AIV&?>(xsnN(!GjhrtgvUQu0;K|(BJpd(f z&!&sX6@sWg=&Lu0c5!PSmnZL2?U6bR0J;xi`L!{~r!n~d zfsXk3IIJ6E```!}5MsHpi`ui7m6L4h$B~Yt%Sl+vY~*wsE6;wQFNjFX2@kKe5{|9x z0Z{%yUAMF0qE)$bXe<&QMeTM1eE5hvd<^eXME@=j-H9=E+Omn}z#Z@p!RyzQ6!vNQ3=aVuo-~*9-g!9(- zjeL%AW`Am>RsnL3vW~Q>!L80gBi}Xzcq(%>P@Bgvv$<|i)RchHJtw!ET+m8i45vf^ zfCd#rtfPd>Yb5kjk(v9@6M8RLiPNnG<8jp=h;oNWRF5tsyC)*9A{l6lp~@SM)WJ@g zRG@~O%(I(rJc=ba?Tw*g2TLx2BN+g@`xx`35zM>1EEtcWRhSA0&F7*M9haYCBtQP% zE`r3Q}ABi+1C>3Z1e1nQhw^G~W##?@3gBhG8MWBRSIv!_ z8cu3Ry9<;oD(eQh=M5T~vcNhDndAPsZmN_TGcE^&c^^aka}j%E=D zqCv^Dl(w@OpYSTDL{CLYQa573J655uLL?!$*#|7}%QRe#39IZPP;H|~#;xA*An^#m+4y;OC&?hM;*e3`}N>noA7(>6$&Oc^36yJcLyZBAc@ak_azK2 zPY?u4W)p!QU|$zlFFjr|XBoT*=+Sg5^p!OKv_C(jqrMczbEs}?b{J1fK zSZpM+C-%7$czDxD8|b43v$ru+2bsB;8%gq11V_WU;rXK;mNkc~%l;q#V%k=0AWRsbY@3yd04L`2BmAdIS@Aw=QWtd&p1^&wEV%L2wKH z9*C&MZ9y?d4o))i#Zc@D@wO;TjtZ==CGwsjCOskCe=~>s^+W>PM8XcCDz@i>F!VaFMU*myJ6(e`^i|qKF((4e<+W^*z;LqAHXw~u7ZWKts$DJxX zRYLc_fnC3Hz)r6bgSJ<29iEk-gN}I61uC-wE2*w(QSI-e$o|YNhN#fF z0muq8qyzYBV;k)$jI!Tjldpq8;YbpZZ>mUW`IV5s|Mq934ra{JQ>e8l;Ua*Pa2wK@ z!<-3Rx`cukf4o5;MD$)t(u3nW%zW`<1GEv66pf$N> zl`na1hjjnp4KV2sPPT^X4FGIf4auIOP0X5rSNM8U!?fgO7^M2>dxGV8?#Z)b{Uwh9 zZp5D>Btl=4){VVKSx6di3G9er6B8=&=1U%)b+x4az{eMW53ipyQWwy>+>S!JK8e$4 z3Y|1W);OyBKZ(fWsP1v&JDjLMV&nR`CyuDQcSK#2xxeYAnLacnG7Xf0(x1OL|7U0E zs)74VE`7Valiv4PCy`ja^r0!GM?N%xHng*z|Il=_`8sRyeWtystn>Dn3ci+|T{dQm zUbNo?o3@&1ziH{~1GSxA+HY#>`}<9(*{J9Cn>M~PkO#ZuQrhW&iS^ko__Ei&dBBAG zYSHfCwQKJ)L0avg2{T=_<3Tgjx0SxZn(449p+SdCHFHoKA2MysS>18Sv@^HdR!wbs z*o68X!P&y)tfspTn-E_ba_EUu=J6xlCP^CJYqKcYSGnA zj~+2C^vF?;b6hVSHC=oL`QCw{n#Yj$xCzv0$4p>i zhau^;{%I3nZfM72rkQ=cyBCG5!V`eaRV_sHW2YJna+ zZc5n$-8F8%&9&&X$*B=1Om2Gy!Yz~APZ)i|G(?80PMU_A*-%wJDf3bW~J^vV|v(qJ$0V?Cn~4? z&YE!htfxLnn?z`J4pV8@$O+JY&YA!l(@V`S{>_zBx^mmsd+FmXNhjZa&ZIYQXw?g* zfVbI)E=Sv5i@r)aPL=Z}%=Yi)$#~ZVgthUC$?WSYU1YpFtc>0}Z*rSC`s_TiUE`9P z__p+N?cv@9EbQV16KMA7tqZ1xJ?<^6?ldpeN89}{wTs&EqG@8U_wtKIFJ3e)Z2#VR zXQ$2WXVfECSakR$6JwY3_MapbIjEpXuNg0+pk2Ma@%}BkLlO(G3)ZQZO=i2FE@YEx z*n`WakUjhVkUL$0eCL1GZfSq+t-II$XME4ACd8)iqeuV5%=|09f6YYb7gtSw8~Q)w zGTQqZ+^_XkAe`%52v{spwhpP5iS z_!&YQ%r~D<#no^fEVpj^%tY8ceRU_6;j$I5W%?!?YZ@(l6PW4#IfhoHum99|NfPz* z&rOuA-&Y@h?6(*{wWY5$Gf&bd4^0kTb<^~*z5D8#L}sQ@NE?1(%Gs$*?`p+QIrW7p zWftqRFEH_~+US;ZBxeF)}yygywANW=;Gmof40GQ5Sg!^ z-@i2eD-)t;@0eCLOF!+Hi4~J6WpvhE{dHb_Z>bn9^fe}3m2MEh zT|7n)e~lrx?5{`nBvVR!gXwhYpR&OiUHgrRw7povm8O4G;crpP*wmxef6J&@tOZ2) zc@q0=NUz1l+w_6;{jky%U|E=Y<*DD9>^Se5@62$!t-l`!-GRCFv+ppN)9IZc9d_SD zn2&Y!eKXpA(O(Ck?o=$n0Zw`y^gTB8`-?v0{=I2vGse3TDW>&)z)}jt>wsL|wnB94 z4c{&**_}8SOtlRr3)BXp65{I@Ug(KX%^ z&c#Qji8g+S00+c-YW7oZJj5}EDlf^+uyfKvr+@3{XXlP`+*aK=v=`4bU$O?;Ai zduzZWlhbZt`gm_l3tj9|-hDC4V0)0GHAASIlq*1z#8K z_y_SR_%|Za4mf()(i;0aN`n$^_G|IqOgH=8Ko>KUI)3=gg!%qu=v%yVYs=~dm%GF7 z1fPO~{1Hrp|1i~j4F@Gn-s;^F1JShi4)Bnlxl~| z{xk(x|Hz+aoVn%>i?_cejX3f*SxLy>s43mxR3j4pM)|J{cA=%Qx(&_w5235vU~gBe z|6x~ekg6vg`T9Q`x&2_*l9EnV}x_UlPlO8Ov;&28rE zc%N;hoqRUT>~_BoH`n#CJ5Q6ekbZaP9Bb1Lb0t2+zBbI$9^)(M!F0BOtuoBD#o8L@ zvq4%uy^XSshWP>A-C6}bl-}kyALzaGb`B^v;3d1vW*x3U0rnF+Znz%F>K!n%=6=}@ z^}S6|^OiQwVC(4Jmu-ysRPzSf$-ciJuXV|tH86vXwb@5#!whzT?J&Z1Fu#N{>rbvj z)D5zQ%v2o^WM`Od`ZUNMvwKH)o_jZ=9c&*k!o_PEt@LcL4L1L1hfKDeR?Ngvd?Q_@ zjJJhHx}KRdZ)9fM#>S6y^QiI~oyCUhSD9^QyUWj8OJlOw3iiNA57V%VNS6|bQs>VOct(@x;AW-D~?015r^76z9sOiP2q{v zt=V|NaK|WpGJ>5kDps3hw>9nlQCcO5GSXff<$6JB9iM~wejeq|30+6asqwjOPR*Uu z2HPs5y%_O=JSL|Nvvo#$zV2synA3)vUK*dvc5sTz823vjTV#xzYxo^EX}(u-+fZ{t z*W|WwI-Tz}W5WNkJaNe-61=P;Wy!!7>H5e7Z_7tsVS{_}aK>c`p56N?i#L+HR}Hh( z>>mkQ{0)x&f_yK`*0-g{c`}aAZ%gUeyf(rN*2dv>iN=Pb-C6GUEmp_r>Qc7lqHv_f z`vIBlnj}Jg+r;Z9I(a)6vWJo!|vSv`|UoirWaS6m5gdAYE0;zUdLpM%yC3 z(Gy$;Kl+*-lktTK%!YVG@0GLz^iT;~NW)6NxeDUl6k@#Dsl`g#?dAu)Rni_czqk`` z^QD={+XybxJU1sUV(c(O&Dd@nYP z7@-{IsenZ;C_>F0Fb9oy=T1odp&0Z0g?o`2s+w~I{MWC7v)%yuH|_^I#@ag|TGgudl07j=Z<|EwS;oOdV|IttlQb z`#l#*e%%5H`YKO#BjJFywxX`6hriaUhi}DA^=8}krcLjXoB7^=ZL!N%Pw&*XQQE&g zkkwY_*0)P+=c(Sz(QRxAw>MJ5i`u}%LpuTt^-?1{O3OAxKnVnjrgo&>YKS4sc88AA z@r}@!x=b7FvZ<~_$|#Fw*GG*AW*6ezC^60N=YFbxa-1tSCC+|E^|xl3PXy1O3Yx_LYxaM+G{YM#xJ0Ah0QXj>+G^pJwzmCXnj5T>jszt_zi(-S?2&1n zdi}fbll#4C1MI06o9ku1aL>?4d$qE0w%~Nvd>d*&Yum~WnVur13htSMv_fm#<=571 zZs&B@O3+fGZf#?;+XqPl540s?@VjK>3>+$HLr{B=;%)C>2Z3y9b!9swG-yUr$ZltQ z`6kV9{d9K+9OF=XTaDy}s%e|q<&IflPtEXRq5l|h9c%%O?}YMy=!oloHp6qW|MbP0 zZ*+GjJJ0;=evHv0ok6_xGd&b_ITv+id|Vg2I`hmVv#h5_y4ae&hP2=E+n>vmwK=zb zedI-j)GCGDKSfYC0KdabuRy^p^XtBDEY)|Wn^u%|EiAoDiLygydij~3C%gy9Uc9@F zv^!_InMo2O?e@ ztP(xfO*P8sf5_3kDsxlhaAp{CXrpn%>>As3?*FdVcQ^pFUSmd(1N#?q30iOjs@&^R zcbn7tc!WJ@Bj%;(rmhwnWlPwm^V~hQ(Tj^Ixf4dC*55|4^-=R&nDg(bkMFa2t^=Wu z*R}0va^TiuY-SUoM-s?F{ps2IF~Du*`QF)n9%I{pT8+lq$@atf-knIFv9^iUfZv?b zjtRCMz`*GG<~z+W&i1gs&-ZHdF$sWXhVktEpsOb??f`jSv1@mle<%F zs1}<rJ?^SvxrDCTiK+jLLT)-~yZdh2XzBZeN8d~arX?B9`nYyFxbXZ3$ z@Xok>I%k}=z>`eO3}ADgj-P?%8tB~_6gMpvdKH2Hu>EJ+O1Aw%@3J(R5}|2lVHRB% zrmT%XX4xjT&%%_W`zaCnbQa-fl!ni?iN0wIU5w<=jrFBDwhT}aJIBtm(-wKQ;Gdmo z@~67Je@~0gwNvazi@bs=nI%a7nrmb1)kU7o_{qKI*;3|9m%p^$o{x6#&O>ug7P-LS zS4OCQF&|TbTuLiWBFv@HRC=bbrp>CU_7A0$PD|vVMIk5J5!{-1#_V6O!2*htnyClu zT0oiA+|OHFGcHGYB^P3M0~zJsaIIcKvDj)Zcj*Tf+HydgC%qTs$B}F)b`b^Se)UY% z-}k{HlydLIv=Q20NpAY-T&08^wb+f-{@G*n?qbf}dodwn0F>_#d~*DRUS&lsw8 zR@gvLglSso?IjF4w%8MhpQY(iz~VfW5EuU5ptDPn#b;z$NvDa?%FBqzcbV9=ZcZGb z2bPfp|GC(WJ>2OnCt)kUoSA(~JT*Y+W-{u%b+(*lT!F+3Eb(?lM}0lCf*@FOiFb_| zw~E2VR?H3Zl7OWfxlt^jju;#&OkUEQ^odhGBL?@^4uqro~`%AQ9QJhbsx_pRgR;#*fx zJosO#9oO5=Hq`&wK(lNBz#eSC96N2`TA|ER&no>hot}z`U)X@VcUYQgx&j+v9Jn;q zk`p(wmi&~VvO@2cQGATfv$kM7 zcA5L&po-15%zd;}nWq{3x6#*bt1aV;;B)@=a1H5 z+ii$%J_~av{I;!~>aJqh3$_ZW?({Y<^K6~@y4hV!o+RN=UA>Fy>Xn@~zumjcA30$0 zsELi%r`K&eDW{L-FCNM!W~h{{;|vpwJF?MVmJFvv)sFT^OJ-3aK4?p$qhr6 zrz{_;$>f}x^DQJ3eAT44`Ie{JlAmGwJ3v{9<(_pUPglWKTJ9yE$&?7)u*c>kBR{f- z8;nNFJwHwE4c02}VS5Sha=aPKQ?%^gLsDP+2oqrU|6k*x%}I@a&knVBQulKDG&=Wv zGKbRd12lgw_i(_!Vsc+K8?fU4Am`VjdoiXwD?E_>&yf7OVK0IzxgwPulBdh8%l2W^ zg+8!FOl@uafgNYt{r~ZO2;UHG{GlC3$q0Kh-L#Ktr_4S)aPx{(n)uHG73`7!YtxxE zY(KYxpJ}80Ttq!skz{jGdUZc#X8H)&opZ?M^xdHym(mW<$A?HlpX&2Nwu8;E zN;@954Q$I*Y7S9$KRAp_bXuhYu6PsY*O(*ZBz;$y;??((5J^CQ5afv)+;*6_84%)0=P7kz9C_@>dU znbOQq8@P8L*SMg+ho}Fxq4`7)e@qbhe6<#TYzu4jCnRO}R=fM~Hwx&-pO9>&Tf+~e zG~WsClHka$VaG7{>}xdc7~+fcf7a1|j{#$`YjoV--q>Jmbetg2at(Pflt;%&UDqF{ z^6SiOP2AaHb@g%VGs6iRuHL(9U)2kz;r!WBb?)Yjxfo?>ss6=o!wOb*(2nPMA}}&Tvn;?k8WnNG6hFovYT;%4>(2wbCUh zudUN3)+y`_-EfHlAZDGrO+TfYt-a1YSJHrImuya=b4Rj8irpTc*3*@w}OE?}{DiTeOasRo%0d)795(4YO8nUFEUF9>}v@ z-Hg}!*U;jpw0Rtq#8yPxUgzE+?Rp(>-45|(S?^}_Fn895pK`gAhxP=oedANCtT=7I z33S#DH;8;SXs`GBX@_grXXvzvR{hM*^L3*y^+M%8XQ9z7bj5ZhTn*&dyniH9*6ZQ> z2qgN3O&c)CpQ&_}+3Q_L1fdfk1S z1b+P&Ho|7w@V`9ax3~f*th;Vg6!JY(kKJM~%{RD*F6~X@C&%6fZ`x|3+dQor;fc9%*1JpYewrz-cvDvJ-C}4Hop%qQ`yexvUjo-HtOxGl+QGZXwR=P#^1k!Z5V9BJ$p~?$!!xiYW#W6xC2uS`0Hyx zX(I#rr3?ty9^c@!A3}`xh|%BTUwxOFAm3$(ese3K5bN4+*|2+b{~lw%Bj(=v7IQP3 zQtu#4>4~tJH+fFr=RNoxo>gR%r;B7tdM$Mya!hK*bx?5YL-&ExUYlG2me!@;<0*B% zhjrv8z4XMRMA(U&Qk*c*{@VXm&Z>oW#j*cF-X6^KoYY9vTGQA#(+lzgZrr|ZK3!cZ+0!O@lTfb z;h4|-sYf4?8`&+c*!$YxEv`9r^@VM5Z99cc+dM&G?r$Sf5rd<65urbB*w+tJ#kROo zZfnbKac#AVsj2ZlQ(-sQ;;AF}SI*=6g*(-j{%QP3>nC>m1vnW7vA$8!i|07W z5C0*CXu|KnMW5en0IvjO{DX26LJ?mK??t~D8lnyUNah;oa`o^nfWaSG3u*4ZC`dB= zX+zRhml|?%s~5DAsbTi)R#!TOU-0SJKT*(?tzPU;X5>NnpEiA_p?+xdUV*#$pG6|= zcicz+oIKMMmi7G(N1S&=|2&`nh50($yv)E)DfTyai-|GKjZ9713dL8FF}1xhG5=DB{acY2tDgTuJzQa%w?W7ew#GK? zc#ho$Kjk+2y?@DL;j$+q{tOj>}dP7T+HX_rYRM+aI-sX*G-EEx+U1^;lQ$x2~r@b=iPp|(oKW8s2J+&E&#CK<3Dm1;oG{<={}6L(Yo8PB z+XZoS3TFv>>TOTe{@E+0b%O0Z|9Uy}Tv{iVTZE2DvhO0_z3qz6-_g+i^P*8rho^G_ zeL1$f$?uv6JW1N04&fEwu9wm|1AIN9*Z1fn(mOfLDBh)T%IVqkPKep#ey?vXYSc?k z4c{F&J9(Tx-RE+0=Sxlz-wzOLctqZ_%Iy1%_E@idHdW8> z0ZzCrwZq*75B^?u@@szv_^QJ;JcX^MuM6!GiB*^9)^>qTK!#e_ST#=FnapC2#ss3B z#X3IFDaX5ce3W>(DYn){jx(wWZ*e$H%w4UU!Rh6@4<$~6f}A+&l7Jwmr7sP?y{PT- zl+tBENF>uv-5uog_Z5QPN{eT4D(Ku`C*0K4aT%Q+rk(rIA%pjBXm9BPSDzHF5@~zU zo?uc4`StBgPNB3vLY@6TR35|b(z}_QdbX+mv%1D-cGBC9yL4x$Q(0Hf#a$0(b~2l8 zdNH%phJ5C=EKY4+JK-bdxcu*b-QEqLI@W1QV6nNyvvRD{*6Nn(S9LLe%^JO z7vhZb{X$1KsQqBKUdqgFcV%=(S)laWTo99YE9u+P`{98Py#mmLqx@s3`~ z?kqLEwNDOb1+PrZ%gs!+b7EhgYulVoH+%mbZ+P!qPHqj$h2QomM0AIJtds z5Ucr#85(if*A>BbgVe+0JDtagvVD^#FB|3r`Nq@P!QYt}I50>DW+eBT0j;Jt;QKIq zZ7uDjg-hjiLVVj&#%NS4wmd5@X7!=&$m`Tddzro+ehbO3Im4ZqzS|J|ht99(!ku!y zobS3Gwlbd+rV;s^Lbmj~8kf(hW7EE;%knw(e7W9B>W|jwSDf@2+@L>LnsSoC=pi~k z27g$`=XVDC?!wv4n<@J%Sk%AT@fG}_FF%Z_r1M?{^mqd#DDlpaw7yBu%B9ePdAFN? zN;6Ws6u`_jr|>8Cc`v;_n_|;)!`_is!r!H*hBxZ#0#0t;`!@xhQs%rjxKlv}--M;6 z$FioN6NYylDG0VaNtx4q@EWL<3-PmtzaZB3c>Tn&g^*?1z2JdIb&l&>CF-0M84b|ISrQ<5X$Jh z2&as%7hkLSzv{RMCy;kcE=D*}x<3MYo#=kA=2KXb1XiUmTiW=dJ&rc837h*oJwVSC z#yAfrZO(nbp1ueS$2Ct8rvh?WQ^YBv6N(^*tM2#O=8-!zyT%uBGHdJ+%E+*ygtg2c zxQEH+l7qE*Q6ft55ByeJ6rC)0+b#anPOlFb<{JVrN{dH2QQRfH7RlijLaC(1ixR44 zMmpJjD{0rzs;{B?OOYt-sQwh`G&GmB@@p8zcl6eFd!zOAYXmk-79nTlH64evJc{wT z_>ELUZ+x>Tr;x7*?MhyIQxuYkrCrTy-;cs~8_*`$6vLJa79%EfrcLxH=9JOd#qj%~ zx}q4?umf_O$Cf7ADd9UzyN?bifgWx~JB4&kw39vURfzLV3bl)Aud&5}tM~S~4hnOe z2c@sgBUL>F(LY0+#+Bfp=d^DL*CQae@pxUwHNU!3RMLc!?DZ*q_1(U5dc7oP$++J| z1^*`UlyWNAtowC!Ij5xZk8lLrhWjSc_-4!`~?O`O+mO^adrP0k8+GYH0s^b3q zf5r=jjWF0n-b`7m^W&a49wKcb<|u3{f6N#o2{ag+eRJqgxjN{6P&g-orG2s#v_8&6`c;IshUd8 zKwoF*9W+y8?u52h!kYTiuAu{dH97T& z|9Mu~DS)+)i$Te)W1Ipu#~~dbseyLwOCcG|CYv7 zb$ZyxhxBNJbJFWKRh@8Oy2DB9lu$oWtD*1g5Zie3Bop)d3PWs`Ldaw_`}u>eoPG6Lmlh zrx%GAAFZ^^>-2wcSXY%v-t?H)G5Z@#+{ByMZR_3FF|XhwZYJzMcfOiHX%*T@t1qod zCNcR)s%ak8WGkDFcw4zxi{v1-7SMk1h^wR0I<7XU<(yhhe&1DQ;YIa2PK@t&|Ag*W zEnAy-^NeJtsS_ z>*cG5?S2orf}fnZCBeGBG~@prr90Py`99L(^_^ns)F*q2@HbkU>N=}F8*2NJn;p-q z?^M$w4V*IkV60;UryY@mk2Yz_Nr{g&yrEOwF7tm@)YT1%qmMpze`Lp?NNv=RWHGi8 z`>OVd3upf!MgtE68aXZOq+{L={%qt#`nDW%ce=X?Dy$NRi+pxW+c$M`xQ#%a9*3qg z9OoZnO5q696LC&voAVn1?`Fk&zAQtdl zq8*cpsX!C*;-7fyjVREz367NEgh;f@kY86eAyno&p*xy5Rcx6P`lyLh-dF!cf1{@O zSW9i!)T!j_2)UX!>}XTg?N8gkPJT__jI40_i(%uMVJ3~5VZ4hVMtOrE2AWkmtC>^E zZt^cxQ13UxICmvAUTKcG?9+SAse!7%tnHe!^N(~ub5i6}Ocd*#>YwHq%5k`O&jsdk z_M!g(IW+GZbkt~pcz=Vtp~np|LRYkKg2~->v_Ml?PP$UA8j$>xlY;(s9beg#Zs_(a z%|GVW8|=Rh#3Gun1HhN2B`RujlGoClT-vXtlbyQ4&7%gw!d<+}0yWZ(IjNU=c`P|K zqzeIKG90lU$Fr7Bgl_@u3MnJ9>&o|7X(L2#ERv?lu92TQ>0j9o#m=hX3qoaWzZ zO2rw{9*7Tvm~>Qkc$TJQ5Chq+`_q^1QiR?lbD2%S$nW8HQ z`m81yeM#DOI zI|$a5U8t^KIpf-T(JXPS?fq!TRd-=#NHSjkx0+d|pNrVXQ39b$Aft&S#gG;^C#1QkoyMtd!e6?c z*D5^$x0}g3ETkQJ0bb9UmEZ6%Sr=Zoh9yd$^#Uu4o=w?#kjt4_clP2=rqWs0Ltgha zJnQBb9HWq~?ahC>_hw(cAaco^M66(@>8;+>E$g*VA1a!?ysYWe^*x8FzM8&Hef!cm zeb&e6Z9?^SKVq`~vLZu21UulI`;#e`N3--pXbH6A+;#;$O#e$Y{6@kxp^opzB?zxE z^h5X;;quR%#MPX0-+n=JllXLAE&9+~(4}PYD9P6Xf5Bf(%>b@4>c$hp)17w>Ik}yk z0^0leURLNeU3#=G8$c!!c3z*wI~9G!pciuKq1tQ!BB?;Twl{vv0Nko3?FuRFFcM~O zzNY$Q04Yxgx|5dAIEX!T7zlL5{||AKOB@L?+M5W@P<=emp)!YL=xz8SRZrZ9zQ z{2)Ae3B*b%!~lJ75D|YfL{MNbxo+@a!q>Z+XRy=I_aS6ZV6am_7Ys%mhiH>kj{?l1 zhhr0Mh7iJ57vZh(UZe4j`{y-bqLVMBFTX8xLB|boI@;0~boWxK)Yu{5Oz2Q7shPj0 zq@EuNrgxo&3_GRffgDcB_h=|yKIwv+vnH<^rp1N<15rbr^gP7bIm~HiPhQYVv%Phr z>>sJ8NgU2n_M+}gNZ!_c_HCV}s1~kCw2LVrwE^0A%7Kq`dxh9NY<~A4I z{pVXW(up+#wdzQxnQzra{t0w*jxjWhkNr~VyFM0CqGlrWJ-h>(v4rFkNfXj|G2yo^V}4yemJ6a^F6pjeoRLOu?X(Z!q`9nzM?qF&%BGs~kM7p=HMs0rf2Q%IwK>L-v-H-eaZYXDAjoAr^0ILpa?53Xl*kmt#i?Yi>s!P!4|pZ%6I$}Co-jf$Te?J-l=G7%r#GPG;-^tspO)w8Nq8R zt^=N!N*vs*kEc47csHf$bRtaiX@L0!otyMMSYu}q-o8zm@(#Vef0&?*9-Rixk4|)B z-*wj%^J$}L+&%W3?%p9@ca5@&X``2>J5788uDeOZy;-QX?hLB1*+~Q9W;5XK3_{4l z8BTt?>AGt<`81gvYWMvQW1tqDNh#0t)Wt zd6aN*HYf8hbbJ=2)$}pgSN2a`SA8{w9Lg_L;p5G{*_7VdX2Vj#&r%gf9x$6KsI}W4 zXWr6$b7(EladT+BtC!|D&FslfJ)PX0%ls|oGT7eG@pE|HBW^B-{KPOKoK22pQ_ULna0d_suTKt zN+hZsm=EL>^1f$F#4D?P=81$6*>zwdX;8b*+?ZH(zEegICnCEZE_W+4Q-555d`>R_ zTV^c4YF}T-zG>#?#)YnyzMBlJsZSOVVS`st@#XuRf78fq7t;L;$u^@u*GCHhqb{H8 zukB5D=G{x!$jl`i)0LsGKg60T#BjUyrYq`f zI&K*px8SuO-gKq>f)cF%F2#`V-*l1MPma*XOUcH6Tmm}(p}Ur%ff8S&^p?`WHTW5J z%`e=YR?*GNsLVe4B4w4#8nYZRK3#@FuYQrTl%E`Cqi<=u+85U4b!0u0*;crn9qe_1OwAHtTH{j8I1bJ--qs z^9#KQ#D*!vBEAN+`6Yf5Q-H2sg$ucyw%u({Ypj%6FQOo~uas{o19-tDX+T;%yqcc) z)yU94>iyeE=S>=wCWRp!iOpN>w6TGA-19WBW$(DImQ9J_ z9nZL<#Se40(|;}LN+te73D9^gsmyA4c_uO@b%67A zms~>m9+25BVcZv|+#;qwWz4U4bk64F1-{tDF`lhM+`hXSy(gL6em!+!fxB+{$AXpg zzZv)NyBsb29G6^sI zo%8kCNRjx?T|IgznX+x86JSr?)y6whQ}mY`WUUvOCB~g4O2=(txgYOp$8An=w-I4^ z$^ON>H#fPDsqUqk<;Z3XxX@-49C=S;Ham@Y#5a4h)5G`CJ=a{Aw1Sr20`89ZQXgMS zUfVxv(H1279`7|fE$xqAdP}+;T(kse+*TrI_*d?f#r4~*;CZvJT>1JNWeD(jw)vl$ zcG$*)zja@^nPR?ePMP$L{2JNumG0UCZ-?!`{`t2t=W_pF7uOyXWfjHQ@ACsiF~UM3 zAFHF`C@SJ(ln}{5m>QhHM@5K<;HD_;;;NbXBFl+v9JFRQHR+@^MpMMY2W-m2#TTF; zl=zJI@>pf1HoMaL5Q5j_9BbePmary88do4m$)q%bOIGg?8 zoJ{phsx5#kBnv(v^U`k_N;whKb%zlJPwItJ`*a1r*lqQkMb!Nh&~ zun3A<1t2n;dGIksMObHxn=DYVxhX=65s^G_BYy^wDW07y%8e$Zvi#A+Er|)+`<4mP z9BRVSMt2H@t@{IzXcHXzoKCTP6>=Cj%2E(U(mj(rcZl36Ax0-X;{y9ovadL>1-*y z@(DiTe-#W}_q`_Yh~No>DX;_vlyL@UO?fAqmCDG^1=iwc2S?Aqd$fQA7e@|~5b2+R z&$k^+B%dxaA9K<(gwB@0JHAXI|bP=3=p6E`I`KyjQx1^%=r3G`j+pZFg*&iWqqg zEBlw{(n~|Th21&_<|u*PuC@AJfGP%|kB_qOLeLLJ%{0s*yqn_A%lnY>T75y@f)Z`) z?K|Aw>$w{Edo(VBNJ_j2drKq3McfQ-!yqp4m|4Ijh$*w1J36<~ zvr_40`Ew1b_^!x$D!77;c$?e1G)WX$BWK`XFxMdH{Fv-DxZd1t6`u4!EuLjXEw*5v z8!`!Rruur!!=qj?xV4P+$RT?zUQ-Ha>Qy;PDzOSTbl@u92kLkz1m)OJCW}>Qs>(N@ z4r!?SR^iOA*5O6nS=;l_@iYvi9i!n>Bc4dZ70(_vRRjQmgpmn~7X1*>kEw?%4n;rG z)qhP2?_pmtTUi1)iYl0{%(FoVx5Ug~&mbfKiRiRX6Wd(&^P$i6;Y zrpPJSnKnLWz&;e09~_W!Uj0oB> ziAg34#aqyXWZ^ON9SV#-qMsbNj$8m8TB`y_HbO;CK7;uZz269Nn{C3RfhHhS*a$tT zvNj&X7K~)%nuM zJ}PLImubdQeG9VG(^_yo&g-MOEwWC7?~Ve76tpOX&*E;VCYxro%9HVNpTpb;mZtX8 zs#bZ5CXK#oMb7cReh$jATA{@SD-mbJ1$D4@3NHJ(@ z!$wT8)6+J-=d)8}JF;03w5uJD8V$7N0_{n=Ji&7r`U_Xlxb@Nq3bVkw>55Y=a$|D% z>u>0_I-}8G)EZJ!wiu1NHQKG~Qqy$WbfY0fw`o(Veyw)%I-S<2+ho{cOwnmS;K88n PAv=Sn6)%bzRJ{LxY1((Q delta 31720 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 RvhIFyeRbKb`6EjA{|8We!z2Iz From 0a31a6ee30d13dd1cae48f2b2ef39c7e1e289a83 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 24 Jan 2009 12:44:25 +0000 Subject: [PATCH 44/68] Snippet Compiler sample now compiles. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3778 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../SharpSnippetCompiler.Core/MainViewContent.cs | 5 +++++ .../SharpSnippetCompiler.Core/Workbench.cs | 9 +++++++++ .../SharpSnippetCompiler/WorkbenchLayout.cs | 5 +++++ .../SharpSnippetCompiler/WorkbenchWindow.cs | 8 ++------ 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/samples/SharpSnippetCompiler/SharpSnippetCompiler.Core/MainViewContent.cs b/samples/SharpSnippetCompiler/SharpSnippetCompiler.Core/MainViewContent.cs index 322a53952a..c180a0c301 100644 --- a/samples/SharpSnippetCompiler/SharpSnippetCompiler.Core/MainViewContent.cs +++ b/samples/SharpSnippetCompiler/SharpSnippetCompiler.Core/MainViewContent.cs @@ -215,6 +215,11 @@ namespace ICSharpCode.SharpSnippetCompiler.Core { } + public IDocument GetDocumentForFile(OpenedFile file) + { + return null; + } + public void JumpTo(int line, int column) { textEditor.ActiveTextAreaControl.JumpTo(line, column); diff --git a/samples/SharpSnippetCompiler/SharpSnippetCompiler.Core/Workbench.cs b/samples/SharpSnippetCompiler/SharpSnippetCompiler.Core/Workbench.cs index 49014ecbbc..21133f5290 100644 --- a/samples/SharpSnippetCompiler/SharpSnippetCompiler.Core/Workbench.cs +++ b/samples/SharpSnippetCompiler/SharpSnippetCompiler.Core/Workbench.cs @@ -48,6 +48,10 @@ namespace ICSharpCode.SharpSnippetCompiler.Core get { return views; } } + public ICollection PrimaryViewContents { + get { return views.AsReadOnly(); } + } + public IList WorkbenchWindowCollection { get { throw new NotImplementedException(); @@ -95,6 +99,11 @@ namespace ICSharpCode.SharpSnippetCompiler.Core throw new NotImplementedException(); } + public void ShowView(IViewContent content, bool switchToOpenedView) + { + throw new NotImplementedException(); + } + public void UnloadPad(PadDescriptor content) { throw new NotImplementedException(); diff --git a/samples/SharpSnippetCompiler/SharpSnippetCompiler/WorkbenchLayout.cs b/samples/SharpSnippetCompiler/SharpSnippetCompiler/WorkbenchLayout.cs index 14840f9b10..cc343a6aa3 100644 --- a/samples/SharpSnippetCompiler/SharpSnippetCompiler/WorkbenchLayout.cs +++ b/samples/SharpSnippetCompiler/SharpSnippetCompiler/WorkbenchLayout.cs @@ -108,6 +108,11 @@ namespace ICSharpCode.SharpSnippetCompiler throw new NotImplementedException(); } + public IWorkbenchWindow ShowView(IViewContent content, bool switchToOpenedView) + { + throw new NotImplementedException(); + } + public void LoadConfiguration() { Console.WriteLine("WorkbenchLayout.LoadConfiguration not implemented"); diff --git a/samples/SharpSnippetCompiler/SharpSnippetCompiler/WorkbenchWindow.cs b/samples/SharpSnippetCompiler/SharpSnippetCompiler/WorkbenchWindow.cs index 5242154421..62e220b0ef 100644 --- a/samples/SharpSnippetCompiler/SharpSnippetCompiler/WorkbenchWindow.cs +++ b/samples/SharpSnippetCompiler/SharpSnippetCompiler/WorkbenchWindow.cs @@ -64,12 +64,8 @@ namespace ICSharpCode.SharpSnippetCompiler } public IViewContent ActiveViewContent { - get { - throw new NotImplementedException(); - } - set { - throw new NotImplementedException(); - } + get { return null; } + set { } } public Icon Icon { From 1f4a614b4cd7a84023e490f076ea41e59398795f Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 25 Jan 2009 09:13:22 +0000 Subject: [PATCH 45/68] Removed XamlDesigner sample. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3779 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- samples/XamlDesigner/App.xaml | 13 - samples/XamlDesigner/App.xaml.cs | 37 --- samples/XamlDesigner/BitmapButton.xaml | 32 -- samples/XamlDesigner/BitmapButton.xaml.cs | 45 --- .../Configuration/AssemblyInfo.cs | 33 -- .../Configuration/Settings.Designer.cs | 110 ------- .../Configuration/Settings.settings | 46 --- samples/XamlDesigner/Configuration/app.config | 51 ---- .../XamlDesigner/Configuration/app.manifest | 29 -- samples/XamlDesigner/Converters.cs | 66 ---- samples/XamlDesigner/Document.cs | 243 --------------- samples/XamlDesigner/DocumentView.xaml | 23 -- samples/XamlDesigner/DocumentView.xaml.cs | 134 -------- samples/XamlDesigner/EnumBar.xaml | 7 - samples/XamlDesigner/EnumBar.xaml.cs | 72 ----- samples/XamlDesigner/EnumButton.cs | 26 -- samples/XamlDesigner/ErrorListView.xaml | 16 - samples/XamlDesigner/ErrorListView.xaml.cs | 34 --- samples/XamlDesigner/ExtensionMethods.cs | 84 ----- samples/XamlDesigner/Images/Control.png | Bin 470 -> 0 bytes samples/XamlDesigner/Images/Error.png | Bin 701 -> 0 bytes samples/XamlDesigner/Images/Folder.png | Bin 537 -> 0 bytes samples/XamlDesigner/Images/Reference.png | Bin 1282 -> 0 bytes samples/XamlDesigner/Images/Tag.png | Bin 389 -> 0 bytes samples/XamlDesigner/MainWindow.xaml | 90 ------ samples/XamlDesigner/MainWindow.xaml.cs | 191 ------------ samples/XamlDesigner/MainWindow_Commands.cs | 143 --------- samples/XamlDesigner/NewFileTemplate.xaml | 4 - .../XamlDesigner/Properties/AssemblyInfo.cs | 3 - .../Properties/Settings.Designer.cs | 110 ------- .../XamlDesigner/Properties/Settings.settings | 46 --- samples/XamlDesigner/Properties/app.manifest | 29 -- samples/XamlDesigner/Shell.cs | 287 ------------------ samples/XamlDesigner/SimpleCommand.cs | 27 -- samples/XamlDesigner/TestFiles/1.xaml | 31 -- samples/XamlDesigner/TestFiles/2.xaml | 53 ---- samples/XamlDesigner/TestFiles/3.xaml | 16 - samples/XamlDesigner/TestFiles/4.xaml | 16 - samples/XamlDesigner/TestFiles/grid.xaml | 10 - samples/XamlDesigner/Themes/Generic.xaml | 6 - samples/XamlDesigner/Toolbox.cs | 105 ------- samples/XamlDesigner/ToolboxTreeView.cs | 26 -- samples/XamlDesigner/ToolboxView.xaml | 26 -- samples/XamlDesigner/ToolboxView.xaml.cs | 77 ----- samples/XamlDesigner/XamlDesigner.csproj | 193 ------------ samples/XamlDesigner/XamlDesigner.sln | 20 -- samples/XamlDesigner/XamlFormatter.cs | 203 ------------- samples/XamlDesigner/app.config | 51 ---- 48 files changed, 2864 deletions(-) delete mode 100644 samples/XamlDesigner/App.xaml delete mode 100644 samples/XamlDesigner/App.xaml.cs delete mode 100644 samples/XamlDesigner/BitmapButton.xaml delete mode 100644 samples/XamlDesigner/BitmapButton.xaml.cs delete mode 100644 samples/XamlDesigner/Configuration/AssemblyInfo.cs delete mode 100644 samples/XamlDesigner/Configuration/Settings.Designer.cs delete mode 100644 samples/XamlDesigner/Configuration/Settings.settings delete mode 100644 samples/XamlDesigner/Configuration/app.config delete mode 100644 samples/XamlDesigner/Configuration/app.manifest delete mode 100644 samples/XamlDesigner/Converters.cs delete mode 100644 samples/XamlDesigner/Document.cs delete mode 100644 samples/XamlDesigner/DocumentView.xaml delete mode 100644 samples/XamlDesigner/DocumentView.xaml.cs delete mode 100644 samples/XamlDesigner/EnumBar.xaml delete mode 100644 samples/XamlDesigner/EnumBar.xaml.cs delete mode 100644 samples/XamlDesigner/EnumButton.cs delete mode 100644 samples/XamlDesigner/ErrorListView.xaml delete mode 100644 samples/XamlDesigner/ErrorListView.xaml.cs delete mode 100644 samples/XamlDesigner/ExtensionMethods.cs delete mode 100644 samples/XamlDesigner/Images/Control.png delete mode 100644 samples/XamlDesigner/Images/Error.png delete mode 100644 samples/XamlDesigner/Images/Folder.png delete mode 100644 samples/XamlDesigner/Images/Reference.png delete mode 100644 samples/XamlDesigner/Images/Tag.png delete mode 100644 samples/XamlDesigner/MainWindow.xaml delete mode 100644 samples/XamlDesigner/MainWindow.xaml.cs delete mode 100644 samples/XamlDesigner/MainWindow_Commands.cs delete mode 100644 samples/XamlDesigner/NewFileTemplate.xaml delete mode 100644 samples/XamlDesigner/Properties/AssemblyInfo.cs delete mode 100644 samples/XamlDesigner/Properties/Settings.Designer.cs delete mode 100644 samples/XamlDesigner/Properties/Settings.settings delete mode 100644 samples/XamlDesigner/Properties/app.manifest delete mode 100644 samples/XamlDesigner/Shell.cs delete mode 100644 samples/XamlDesigner/SimpleCommand.cs delete mode 100644 samples/XamlDesigner/TestFiles/1.xaml delete mode 100644 samples/XamlDesigner/TestFiles/2.xaml delete mode 100644 samples/XamlDesigner/TestFiles/3.xaml delete mode 100644 samples/XamlDesigner/TestFiles/4.xaml delete mode 100644 samples/XamlDesigner/TestFiles/grid.xaml delete mode 100644 samples/XamlDesigner/Themes/Generic.xaml delete mode 100644 samples/XamlDesigner/Toolbox.cs delete mode 100644 samples/XamlDesigner/ToolboxTreeView.cs delete mode 100644 samples/XamlDesigner/ToolboxView.xaml delete mode 100644 samples/XamlDesigner/ToolboxView.xaml.cs delete mode 100644 samples/XamlDesigner/XamlDesigner.csproj delete mode 100644 samples/XamlDesigner/XamlDesigner.sln delete mode 100644 samples/XamlDesigner/XamlFormatter.cs delete mode 100644 samples/XamlDesigner/app.config diff --git a/samples/XamlDesigner/App.xaml b/samples/XamlDesigner/App.xaml deleted file mode 100644 index c5322e635e..0000000000 --- a/samples/XamlDesigner/App.xaml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - diff --git a/samples/XamlDesigner/App.xaml.cs b/samples/XamlDesigner/App.xaml.cs deleted file mode 100644 index 1b86d3654f..0000000000 --- a/samples/XamlDesigner/App.xaml.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Data; -using System.Linq; -using System.Windows; -using ICSharpCode.XamlDesigner.Properties; -using System.Windows.Threading; -using System.Diagnostics; - -namespace ICSharpCode.XamlDesigner -{ - public partial class App - { - public static string[] Args; - - protected override void OnStartup(StartupEventArgs e) - { - DispatcherUnhandledException += App_DispatcherUnhandledException; - Args = e.Args; - System.Windows.Forms.Application.EnableVisualStyles(); - base.OnStartup(e); - } - - void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) - { - Shell.ReportException(e.Exception); - e.Handled = true; - } - - protected override void OnExit(ExitEventArgs e) - { - Settings.Default.Save(); - base.OnExit(e); - } - } -} diff --git a/samples/XamlDesigner/BitmapButton.xaml b/samples/XamlDesigner/BitmapButton.xaml deleted file mode 100644 index 7c1a28bd96..0000000000 --- a/samples/XamlDesigner/BitmapButton.xaml +++ /dev/null @@ -1,32 +0,0 @@ - diff --git a/samples/XamlDesigner/BitmapButton.xaml.cs b/samples/XamlDesigner/BitmapButton.xaml.cs deleted file mode 100644 index 4200c1bc9d..0000000000 --- a/samples/XamlDesigner/BitmapButton.xaml.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace ICSharpCode.XamlDesigner -{ - public partial class BitmapButton - { - public BitmapButton() - { - InitializeComponent(); - DataContext = this; - } - - public string ImageHover { - get { return "Images/" + GetType().Name + ".Hover.png"; } - } - - public string ImageNormal { - get { return "Images/" + GetType().Name + ".Normal.png"; } - } - - public string ImagePressed { - get { return "Images/" + GetType().Name + ".Pressed.png"; } - } - - public string ImageDisabled { - get { return "Images/" + GetType().Name + ".Disabled.png"; } - } - } - - class CloseButton : BitmapButton - { - } -} diff --git a/samples/XamlDesigner/Configuration/AssemblyInfo.cs b/samples/XamlDesigner/Configuration/AssemblyInfo.cs deleted file mode 100644 index 651ee86e68..0000000000 --- a/samples/XamlDesigner/Configuration/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Windows; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("XamlDesigner")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -//In order to begin building localizable applications, set -//CultureYouAreCodingWith in your .csproj file -//inside a . For example, if you are using US english -//in your source files, set the to en-US. Then uncomment -//the NeutralResourceLanguage attribute below. Update the "en-US" in -//the line below to match the UICulture setting in the project file. - -//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] - - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located - //(used if a resource is not found in the page, - // app, or any theme specific resource dictionaries) -)] diff --git a/samples/XamlDesigner/Configuration/Settings.Designer.cs b/samples/XamlDesigner/Configuration/Settings.Designer.cs deleted file mode 100644 index 9a835b8cf5..0000000000 --- a/samples/XamlDesigner/Configuration/Settings.Designer.cs +++ /dev/null @@ -1,110 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.3031 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ICSharpCode.XamlDesigner.Configuration { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("0,0,0,0")] - public global::System.Windows.Rect MainWindowRect { - get { - return ((global::System.Windows.Rect)(this["MainWindowRect"])); - } - set { - this["MainWindowRect"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute(@" - - - - - - - - - - - - - - - - - - - - - -")] - public string AvalonDockLayout { - get { - return ((string)(this["AvalonDockLayout"])); - } - set { - this["AvalonDockLayout"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - public global::System.Collections.Specialized.StringCollection RecentFiles { - get { - return ((global::System.Collections.Specialized.StringCollection)(this["RecentFiles"])); - } - set { - this["RecentFiles"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute(@" - - %ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\PresentationFramework.dll -")] - public global::System.Collections.Specialized.StringCollection AssemblyList { - get { - return ((global::System.Collections.Specialized.StringCollection)(this["AssemblyList"])); - } - set { - this["AssemblyList"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("Maximized")] - public global::System.Windows.WindowState MainWindowState { - get { - return ((global::System.Windows.WindowState)(this["MainWindowState"])); - } - set { - this["MainWindowState"] = value; - } - } - } -} diff --git a/samples/XamlDesigner/Configuration/Settings.settings b/samples/XamlDesigner/Configuration/Settings.settings deleted file mode 100644 index 65e359e302..0000000000 --- a/samples/XamlDesigner/Configuration/Settings.settings +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - 0,0,0,0 - - - <DockingManager> - <ResizingPanel Orientation="Horizontal"> - <ResizingPanel ResizeWidth="200" Orientation="Vertical"> - <DockablePane ResizeHeight="441.36166666666668" Anchor="Left"> - <DockableContent Name="content1" AutoHide="false" /> - </DockablePane> - <DockablePane ResizeWidth="200" Anchor="Left"> - <DockableContent Name="content2" AutoHide="false" /> - </DockablePane> - </ResizingPanel> - <ResizingPanel Orientation="Vertical"> - <DocumentPanePlaceHolder /> - <DockablePane ResizeHeight="138" Anchor="Bottom"> - <DockableContent Name="content3" AutoHide="false" /> - </DockablePane> - </ResizingPanel> - <DockablePane ResizeWidth="271" Anchor="Right"> - <DockableContent Name="content4" AutoHide="false" /> - </DockablePane> - </ResizingPanel> - <Hidden /> - <Windows /> -</DockingManager> - - - - - - <?xml version="1.0" encoding="utf-16"?> -<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <string>%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\PresentationFramework.dll</string> -</ArrayOfString> - - - Maximized - - - \ No newline at end of file diff --git a/samples/XamlDesigner/Configuration/app.config b/samples/XamlDesigner/Configuration/app.config deleted file mode 100644 index c49779f8d1..0000000000 --- a/samples/XamlDesigner/Configuration/app.config +++ /dev/null @@ -1,51 +0,0 @@ - - - - -