diff options
author | Lluis Sanchez <lluis@xamarin.com> | 2014-10-15 18:13:17 +0400 |
---|---|---|
committer | Lluis Sanchez <lluis@xamarin.com> | 2014-10-15 18:13:17 +0400 |
commit | ed1b716b650dbe5f574d691e3f576a33224e0a8e (patch) | |
tree | c1a76252267d2de008f4db32c154949b53702aa9 | |
parent | d1d783ed3138fd9d1f83fbb64ce2a4c4865e4079 (diff) | |
parent | 2b5f31505fa2d3a6dfd2ce958abd1d31705c4c3d (diff) |
Merge remote-tracking branch 'mono/master' into xs6
Conflicts:
configure
main/build/MacOSX/monostub.m
main/src/addins/MacPlatform/MacPlatform.cs
version-checks
55 files changed, 727 insertions, 140 deletions
@@ -3,6 +3,8 @@ using Gtk#. See http://www.monodevelop.com for more info. +[![Build Status](http://jenkins.mono-project.com/job/test-monodevelop-mainline/badge/icon)](http://jenkins.mono-project.com/job/test-monodevelop-mainline/) + Directory organization ---------------------- @@ -39,6 +41,7 @@ There are two variables you can set when running `configure`: * `stable`: builds the MonoDevelop core and some stable extra add-ins. * `core`: builds the MonoDevelop core only. * `all`: builds everything + * `mac`: builds for Mac OS X * You can also create your own profile by adding a file to the profiles directory containing a list of the directories to build. @@ -66,8 +69,8 @@ Packaging for OS X To package MonoDevelop for OS X in a convenient MonoDevelop.app file, just do this after MonoDevelop has finished building (with -`make`): -`cd main/build/MacOSX ; make MonoDevelop.app` +`make`): `cd main/build/MacOSX ; make`. +You can run MonoDevelop: `open MonoDevelop.app` or build dmg package: `./make-dmg-bundle.sh` Dependencies ------------ @@ -278,7 +278,7 @@ if test `uname` = "Darwin"; then export ACLOCAL_FLAGS="-I /Library/Frameworks/Mono.framework/Versions/Current/share/aclocal" fi # add in libsvn's directory as a fallback path. user-set paths will override it - export DYLD_FALLBACK_LIBRARY_PATH="$DYLD_FALLBACK_LIBRARY_PATH:/Library/Developer/CommandLineTools/usr/lib:`pwd`/main/build/bin" + export DYLD_FALLBACK_LIBRARY_PATH="$DYLD_FALLBACK_LIBRARY_PATH:/Library/Developer/CommandLineTools/usr/lib:/usr/local/lib:`pwd`/main/build/bin" fi configure_packages diff --git a/main/build/MacOSX/monostub.m b/main/build/MacOSX/monostub.m index e4ac9256a1..a1910113ee 100644 --- a/main/build/MacOSX/monostub.m +++ b/main/build/MacOSX/monostub.m @@ -270,7 +270,7 @@ update_environment (const char* macosDir, const char *resourcesDir, const char * char buf[32]; /* CommandLineTools are needed for OSX 10.9+ */ - v1 = "/Library/Frameworks/Mono.framework/Versions/Current/lib:/lib:/usr/lib:/Library/Developer/CommandLineTools/usr/lib:"; + v1 = "/Library/Frameworks/Mono.framework/Versions/Current/lib:/lib:/usr/lib:/Library/Developer/CommandLineTools/usr/lib:/usr/local/lib:"; v1 = str_append (v1, macosDir); v1 = str_append (v1, "/lib/monodevelop/bin/"); push_env ("DYLD_FALLBACK_LIBRARY_PATH", v1); @@ -363,7 +363,7 @@ int main (int argc, char **argv) NSString *binDir = [[NSString alloc] initWithUTF8String: "Contents/Resources/lib/monodevelop/bin"]; NSString *appDir = [[NSBundle mainBundle] bundlePath]; // can be overridden with plist string MonoMinVersion - NSString *req_mono_version = @"3.0.7"; + NSString *req_mono_version = @"3.8"; // can be overridden with either plist bool MonoUseSGen or MONODEVELOP_USE_SGEN env bool use_sgen = YES; diff --git a/main/src/addins/AspNet/MonoDevelop.AspNet.csproj b/main/src/addins/AspNet/MonoDevelop.AspNet.csproj index efe89650c8..621d9d1716 100644 --- a/main/src/addins/AspNet/MonoDevelop.AspNet.csproj +++ b/main/src/addins/AspNet/MonoDevelop.AspNet.csproj @@ -447,6 +447,30 @@ <None Include="Templates\Projects\WebApplication.xpt.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> + <None Include="..\..\..\packages\Microsoft.AspNet.Mvc.4.0.30506.0\lib\net40\System.Web.Mvc.dll"> + <Link>System.Web.Mvc.dll</Link> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="..\..\..\packages\Microsoft.AspNet.Razor.2.0.30506.0\lib\net40\System.Web.Razor.dll"> + <Link>System.Web.Razor.dll</Link> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="..\..\..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.Helpers.dll"> + <Link>System.Web.Helpers.dll</Link> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="..\..\..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Deployment.dll"> + <Link>System.Web.WebPages.Deployment.dll</Link> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="..\..\..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.dll"> + <Link>System.Web.WebPages.dll</Link> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="..\..\..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll"> + <Link>System.Web.WebPages.Razor.dll</Link> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> </ItemGroup> <ItemGroup> <Content Include="Html\Schemas\readme.txt"> diff --git a/main/src/addins/AspNet/Properties/MonoDevelop.AspNet.addin.xml b/main/src/addins/AspNet/Properties/MonoDevelop.AspNet.addin.xml index 17406e444f..6dfbed0e80 100644 --- a/main/src/addins/AspNet/Properties/MonoDevelop.AspNet.addin.xml +++ b/main/src/addins/AspNet/Properties/MonoDevelop.AspNet.addin.xml @@ -1,6 +1,13 @@ <ExtensionModel>
<Runtime>
+ <Import assembly = "System.Web.Helpers.dll" /> + <Import assembly = "System.Web.Mvc.dll" /> + <Import assembly = "System.Web.Razor.dll" /> + <Import assembly = "System.Web.WebPages.Deployment.dll" /> + <Import assembly = "System.Web.WebPages.dll" /> + <Import assembly = "System.Web.WebPages.Razor.dll" /> + <Import file = "Html/Schemas/xhtml1-strict.xsd" />
<Import file = "Html/Schemas/xhtml1-transitional.xsd" />
<Import file = "Html/Schemas/xhtml1-frameset.xsd" />
diff --git a/main/src/addins/MacPlatform/MacPlatform.cs b/main/src/addins/MacPlatform/MacPlatform.cs index 25cbcd3c52..9d54831387 100644 --- a/main/src/addins/MacPlatform/MacPlatform.cs +++ b/main/src/addins/MacPlatform/MacPlatform.cs @@ -733,8 +733,12 @@ namespace MonoDevelop.MacIntegration { var toplevels = GtkQuartz.GetToplevels (); - return toplevels.Any (t => t.Key.IsVisible && (t.Value == null || t.Value.Modal) - && !t.Key.DebugDescription.StartsWith ("<NSStatusBarWindow", StringComparison.Ordinal)); + // When we're looking for modal windows that don't belong to GTK, exclude + // NSStatusBarWindow (which is visible on Mavericks when we're in fullscreen) and + // NSToolbarFullscreenWindow (which is visible on Yosemite in fullscreen). + return toplevels.Any (t => t.Key.IsVisible && (t.Value == null || t.Value.Modal) && + !(t.Key.DebugDescription.StartsWith("<NSStatusBarWindow", StringComparison.Ordinal) || + t.Key.DebugDescription.StartsWith ("<NSToolbarFullScreenWindow", StringComparison.Ordinal))); } public override void AddChildWindow (Gtk.Window parent, Gtk.Window child) diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/ValueVisualizerDialog.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/ValueVisualizerDialog.cs index 283b212534..c4b708a94b 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/ValueVisualizerDialog.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/ValueVisualizerDialog.cs @@ -41,6 +41,7 @@ namespace MonoDevelop.Debugger.Viewers public ValueVisualizerDialog () { this.Build (); + this.Modal = true; } public void Show (ObjectValue val) diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/BreakpointPropertiesDialog.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/BreakpointPropertiesDialog.cs index 0dea8f754c..85eb0d32da 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/BreakpointPropertiesDialog.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/BreakpointPropertiesDialog.cs @@ -77,7 +77,7 @@ namespace MonoDevelop.Debugger // Text entries
readonly TextEntry entryFunctionName = new TextEntry (){ PlaceholderText = GettextCatalog.GetString ("e.g. System.Object.ToString") };
- readonly TextEntry entryLocationFile = new TextEntry (){ PlaceholderText = GettextCatalog.GetString ("e.g. ./monodevelop/main/src/addins/YCombinator.cs:515:16") };
+ readonly TextEntry entryLocationFile = new TextEntry (){ PlaceholderText = GettextCatalog.GetString ("e.g. Program.cs:15:5") };
readonly TextEntryWithCodeCompletion entryExceptionType = new TextEntryWithCodeCompletion (){ PlaceholderText = GettextCatalog.GetString ("e.g. System.InvalidOperationException") };
readonly TextEntry entryConditionalExpression = new TextEntry (){ PlaceholderText = GettextCatalog.GetString ("e.g. colorName == \"Red\"") };
readonly TextEntry entryPrintExpression = new TextEntry () { PlaceholderText = GettextCatalog.GetString ("e.g. Value of 'name' is {name}") };
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebugCommands.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebugCommands.cs index 3426ed37e6..f814565f0c 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebugCommands.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebugCommands.cs @@ -749,8 +749,12 @@ namespace MonoDevelop.Debugger try { DebuggingService.SetNextStatement (doc.FileName, doc.Editor.Caret.Line, doc.Editor.Caret.Column); - } catch (NotSupportedException) { - MessageService.ShowError ("Unable to set the next statement to this location."); + } catch (Exception e) { + if (e is NotSupportedException || e.InnerException is NotSupportedException) { + MessageService.ShowError ("Unable to set the next statement to this location."); + } else { + throw; + } } } } diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs index dab33bbb60..82d66b48fe 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs @@ -26,7 +26,6 @@ // using System; -using System.Linq; using Mono.Debugging.Client; using System.Collections.Generic; @@ -116,9 +115,9 @@ namespace MonoDevelop.Debugger return false; return true; - } else { - return a.SourceLocation.MethodName.Equals (z.SourceLocation.MethodName, StringComparison.Ordinal); } + + return a.SourceLocation.MethodName.Equals (z.SourceLocation.MethodName, StringComparison.Ordinal); } } } diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValueTreeView.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValueTreeView.cs index 892f150861..9d3791efec 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValueTreeView.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValueTreeView.cs @@ -503,8 +503,9 @@ namespace MonoDevelop.Debugger void Refresh (bool resetScrollPosition) { - foreach (ObjectValue val in new List<ObjectValue> (nodes.Keys)) + foreach (var val in new List<ObjectValue> (nodes.Keys)) UnregisterValue (val); + nodes.Clear (); // Note: this is a hack that ideally we could get rid of... @@ -518,7 +519,7 @@ namespace MonoDevelop.Debugger bool showExpanders = AllowAdding; - foreach (ObjectValue val in values) { + foreach (var val in values) { AppendValue (TreeIter.Zero, null, val); if (val.HasChildren) showExpanders = true; diff --git a/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GuiBuilderService.cs b/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GuiBuilderService.cs index 28dac4d37e..40b3c74d59 100644 --- a/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GuiBuilderService.cs +++ b/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.GuiBuilder/GuiBuilderService.cs @@ -579,7 +579,7 @@ namespace MonoDevelop.GtkCore.GuiBuilder string mt = DesktopService.GetMimeTypeForUri (file); var formatter = MonoDevelop.Ide.CodeFormatting.CodeFormatterService.GetFormatter (mt); if (formatter != null) - content = formatter.FormatText (PolicyService.InvariantPolicies, content); + content = formatter.FormatText (PolicyService.InvariantPolicies, content) ?? content; // The project policies should be taken for generated files (windows git eol problem) var pol = project.Policies.Get<TextStylePolicy> (DesktopService.GetMimeTypeForUri (file)); diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeDotNetProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeDotNetProject.cs index cb2285740b..010cc795b5 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeDotNetProject.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeDotNetProject.cs @@ -137,6 +137,10 @@ namespace MonoDevelop.PackageManagement.Tests.Helpers {
return EqualsAction (project);
}
+
+ public void RefreshProjectBuilder ()
+ {
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageManagementEventsMonitor.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageManagementEventsMonitor.cs index 451310dd19..0c114f4535 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageManagementEventsMonitor.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestablePackageManagementEventsMonitor.cs @@ -63,6 +63,15 @@ namespace MonoDevelop.PackageManagement.Tests.Helpers public bool IsPackageConsoleShown;
public IProgressMonitor ProgressMonitorPassedToShowPackageConsole;
+
+ protected override void ReconnectAssemblyReferences (IPackageManagementProject project)
+ {
+ ProjectsPassedToReconnectAssemblyReferences.Add (project);
+ IsTypeSystemRefreshed = true;
+ }
+
+ public List<IPackageManagementProject> ProjectsPassedToReconnectAssemblyReferences = new List<IPackageManagementProject> ();
+ public bool IsTypeSystemRefreshed;
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj index f7d81fb679..eff06ad1e8 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.csproj @@ -199,6 +199,7 @@ <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\TestableSolutionPackageRepository.cs" /> <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakeFileRemover.cs" /> <Compile Include="MonoDevelop.PackageManagement.Tests.Helpers\FakePackageRepositoryWithConstraintProvider.cs" /> + <Compile Include="MonoDevelop.PackageManagement.Tests\MSBuildTargetsRestoredMonitorTests.cs" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\..\..\core\MonoDevelop.Core\MonoDevelop.Core.csproj"> diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs index b4e42e263d..4f37481c12 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/BackgroundPackageActionRunnerTests.cs @@ -85,7 +85,7 @@ namespace MonoDevelop.PackageManagement.Tests return action;
}
- void AddInstallActionWithPowerShellScript (string packageId = "Test")
+ FakeInstallPackageAction AddInstallActionWithPowerShellScript (string packageId = "Test")
{
FakeInstallPackageAction action = AddInstallAction ();
var package = new FakePackage (packageId);
@@ -94,6 +94,7 @@ namespace MonoDevelop.PackageManagement.Tests operations.Add (new PackageOperation (package, PackageAction.Install));
action.Operations = operations;
action.Package = package;
+ return action;
}
void AddInstallActionWithLicenseToAccept (string packageId = "Test")
@@ -130,6 +131,20 @@ namespace MonoDevelop.PackageManagement.Tests return action;
}
+ FakeInstallPackageAction AddInstallActionWithMSBuildTargetsFile (
+ string packageId = "Test",
+ PackageAction packageAction = PackageAction.Install)
+ {
+ FakeInstallPackageAction action = AddInstallAction ();
+ var package = new FakePackage (packageId);
+ package.AddFile (@"build\net40\" + packageId + ".targets");
+ var operations = new List<PackageOperation> ();
+ operations.Add (new PackageOperation (package, packageAction));
+ action.Operations = operations;
+ action.Package = package;
+ return action;
+ }
+
[Test]
public void Run_OneInstallActionAndOneUninstallActionAndRunNotCompleted_InstallActionMarkedAsPending ()
{
@@ -433,6 +448,50 @@ namespace MonoDevelop.PackageManagement.Tests progressMonitor.AssertMessageIsLogged ("Download2");
progressMonitor.AssertMessageIsNotLogged ("Download2" + Environment.NewLine + "Download2");
}
+
+ [Test]
+ public void Run_OneInstallActionWithPackageOperationWithCustomMSBuildTask_TypeSystemIsRefreshed ()
+ {
+ CreateRunner ();
+ FakeInstallPackageAction action = AddInstallActionWithMSBuildTargetsFile ();
+ action.ExecuteAction = () => {
+ packageManagementEvents.OnParentPackageInstalled (action.Package, action.Project, action.Operations);
+ };
+
+ Run ();
+
+ Assert.IsTrue (runner.EventsMonitor.IsTypeSystemRefreshed);
+ Assert.AreEqual (action.Project, runner.EventsMonitor.ProjectsPassedToReconnectAssemblyReferences [0]);
+ Assert.IsNotNull (action.Project);
+ }
+
+ [Test]
+ public void Run_OneUninstallActionWithPackageOperationWithCustomMSBuildTask_TypeSystemIsNotRefreshed ()
+ {
+ CreateRunner ();
+ FakeInstallPackageAction action = AddInstallActionWithMSBuildTargetsFile ("Test", PackageAction.Uninstall);
+ action.ExecuteAction = () => {
+ packageManagementEvents.OnParentPackageInstalled (action.Package, action.Project, action.Operations);
+ };
+
+ Run ();
+
+ Assert.IsFalse (runner.EventsMonitor.IsTypeSystemRefreshed);
+ }
+
+ [Test]
+ public void Run_OneInstallActionNoCustomMSBuildTask_TypeSystemIsNotRefreshed ()
+ {
+ CreateRunner ();
+ FakeInstallPackageAction action = AddInstallActionWithPowerShellScript ();
+ action.ExecuteAction = () => {
+ packageManagementEvents.OnParentPackageInstalled (action.Package, action.Project, action.Operations);
+ };
+
+ Run ();
+
+ Assert.IsFalse (runner.EventsMonitor.IsTypeSystemRefreshed);
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/InstallPackageActionTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/InstallPackageActionTests.cs index 758341f3a6..5273282109 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/InstallPackageActionTests.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/InstallPackageActionTests.cs @@ -493,5 +493,30 @@ namespace MonoDevelop.PackageManagement.Tests Assert.AreEqual ("Test Package contains PowerShell scripts which will not be run.", messageLogged);
}
+
+ [Test]
+ public void Execute_PackageAndPackageRepositoryPassed_PackageInstallNotificationRaisedWithProject ()
+ {
+ CreateAction ();
+ IPackageManagementProject project = null;
+ packageManagementEvents.ParentPackageInstalled += (sender, e) => project = e.Project;
+
+ installPackageHelper.InstallTestPackage ();
+
+ Assert.AreEqual (fakeProject, project);
+ }
+
+ [Test]
+ public void Execute_InstallHasPackageOperations_PackageInstallNotificationRaisedWithPackageOperations ()
+ {
+ CreateAction ();
+ installPackageHelper.AddPackageInstallOperation ();
+ IEnumerable<PackageOperation> actualOperations = null;
+ packageManagementEvents.ParentPackageInstalled += (sender, e) => actualOperations = e.Operations;
+
+ installPackageHelper.InstallTestPackage ();
+
+ CollectionAssert.AreEqual (action.Operations, actualOperations);
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MSBuildTargetsRestoredMonitorTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MSBuildTargetsRestoredMonitorTests.cs new file mode 100644 index 0000000000..93ae95c5b1 --- /dev/null +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MSBuildTargetsRestoredMonitorTests.cs @@ -0,0 +1,87 @@ +//
+// MSBuildTargetsRestoredMonitorTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using ICSharpCode.PackageManagement;
+using NUnit.Framework;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+
+namespace MonoDevelop.PackageManagement.Tests
+{
+ [TestFixture]
+ public class MSBuildTargetsRestoredMonitorTests
+ {
+ MSBuildTargetsRestoredMonitor monitor;
+ PackageManagementEvents packageEvents;
+
+ void CreateMonitor ()
+ {
+ packageEvents = new PackageManagementEvents ();
+ monitor = new MSBuildTargetsRestoredMonitor (packageEvents);
+ }
+
+ void PackageWithMSBuildTargetsIsRestored ()
+ {
+ var package = new FakePackage ("MyPackage");
+ package.AddFile (@"build\MyPackage.targets");
+
+ packageEvents.OnPackageRestored (package);
+ }
+
+ [Test]
+ public void AnyMSBuildTargetsRestored_NoPackagesRestored_ReturnsFalse ()
+ {
+ CreateMonitor ();
+
+ bool result = monitor.AnyMSBuildTargetsRestored;
+
+ Assert.IsFalse (result);
+ }
+
+ [Test]
+ public void AnyMSBuildTargetsRestored_OnePackageWithMSBuildTargetsFileIsRestored_ReturnsTrue ()
+ {
+ CreateMonitor ();
+ PackageWithMSBuildTargetsIsRestored ();
+
+ bool result = monitor.AnyMSBuildTargetsRestored;
+
+ Assert.IsTrue (result);
+ }
+
+ [Test]
+ public void AnyMSBuildTargetsRestored_PackageRestoredWithMSBuildTargetsFileAfterMonitorIsDisposed_ReturnsFalse ()
+ {
+ CreateMonitor ();
+ monitor.Dispose ();
+ PackageWithMSBuildTargetsIsRestored ();
+
+ bool result = monitor.AnyMSBuildTargetsRestored;
+
+ Assert.IsFalse (result);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RestorePackagesActionTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RestorePackagesActionTests.cs index f247203e80..fb19a62571 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RestorePackagesActionTests.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RestorePackagesActionTests.cs @@ -43,6 +43,7 @@ namespace MonoDevelop.PackageManagement.Tests FakePackageRepositoryFactory packageRepositoryCache;
PackageManagementEvents packageEvents;
List<PackageOperationMessage> messagesLogged;
+ List<PackageRestoredEventArgs> packageRestoredEvents;
void CreateSolution ()
{
@@ -112,6 +113,14 @@ namespace MonoDevelop.PackageManagement.Tests Assert.That (allMessages, Has.No.ContainsSubstring (expectedMessage));
}
+ void CapturePackageRestoredEvents ()
+ {
+ packageRestoredEvents = new List<PackageRestoredEventArgs> ();
+ packageEvents.PackageRestored += (sender, e) => {
+ packageRestoredEvents.Add (e);
+ };
+ }
+
[Test]
public void Execute_ProjectHasOneUnrestoredPackage_PackageFromPriorityRepositoryIsInstalled ()
{
@@ -317,6 +326,40 @@ namespace MonoDevelop.PackageManagement.Tests Assert.AreEqual (1, packageManagerFactory.FakePackageManager.PackagesInstalled.Count);
Assert.AreEqual ("MyPackage1", packageManagerFactory.FakePackageManager.PackagePassedToInstallPackage.Id);
}
+
+ [Test]
+ public void Execute_ProjectHasOneUnrestoredPackage_PackageRestoredEventFiredForPackage ()
+ {
+ FakePackageManagementProject project = CreateSolutionWithOneProject ();
+ project.AddPackageReference ("MyPackage", "1.0");
+ FakePackage package = AddPackageToPriorityRepository ("MyPackage", "1.0");
+ CreateAction ();
+ CapturePackageRestoredEvents ();
+ var dotNetProject = new FakeDotNetProject ();
+ dotNetProject.Name = "MyProject";
+ solution.FakeProjectsToReturnFromGetProject.Add ("MyProject", project);
+ action.Project = dotNetProject;
+
+ action.Execute ();
+
+ PackageRestoredEventArgs eventArgs = packageRestoredEvents [0];
+ Assert.AreEqual (package, eventArgs.Package);
+ }
+
+ [Test]
+ public void Execute_SolutionHasOneProjectWithOneUnrestoredPackage_PackageRestoredEventFiredForPackage ()
+ {
+ FakePackageManagementProject project = CreateSolutionWithOneProject ();
+ project.AddPackageReference ("MyPackage", "1.0");
+ FakePackage package = AddPackageToPriorityRepository ("MyPackage", "1.0");
+ CreateAction ();
+ CapturePackageRestoredEvents ();
+
+ action.Execute ();
+
+ PackageRestoredEventArgs eventArgs = packageRestoredEvents [0];
+ Assert.AreEqual (package, eventArgs.Package);
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj index 55e16bc4de..b26d6fa8a4 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj @@ -359,6 +359,8 @@ <Compile Include="MonoDevelop.PackageManagement\PackageManagementPackageReference.cs" /> <Compile Include="MonoDevelop.PackageManagement\PackageManagementProjectOperations.cs" /> <Compile Include="MonoDevelop.PackageManagement\PackageManagementPackageReferenceEventArgs.cs" /> + <Compile Include="MonoDevelop.PackageManagement\PackageRestoredEventArgs.cs" /> + <Compile Include="MonoDevelop.PackageManagement\MSBuildTargetsRestoredMonitor.cs" /> </ItemGroup> <ItemGroup> <EmbeddedResource Include="MonoDevelop.PackageManagement.addin.xml" /> diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs index 6c719fc6de..c6de7677f5 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs @@ -112,6 +112,11 @@ namespace MonoDevelop.PackageManagement {
return DotNetProject == project.DotNetProject;
}
+
+ public void RefreshProjectBuilder ()
+ {
+ DotNetProject.RefreshProjectBuilder ();
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IDotNetProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IDotNetProject.cs index bee62295d5..9c7dfabff9 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IDotNetProject.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IDotNetProject.cs @@ -46,6 +46,7 @@ namespace MonoDevelop.PackageManagement void AddImportIfMissing (string name, string condition);
void RemoveImport (string name);
bool Equals (IDotNetProject project);
+ void RefreshProjectBuilder ();
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementEvents.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementEvents.cs index 0e476e576f..06e1edced4 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementEvents.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementEvents.cs @@ -50,12 +50,13 @@ namespace ICSharpCode.PackageManagement event EventHandler<FileEventArgs> FileChanged;
event EventHandler<FileRemovingEventArgs> FileRemoving;
event EventHandler UpdatedPackagesAvailable;
+ event EventHandler<PackageRestoredEventArgs> PackageRestored;
void OnPackageOperationsStarting();
void OnPackageOperationsFinished();
void OnPackageOperationError(Exception ex);
bool OnAcceptLicenses(IEnumerable<IPackage> packages);
- void OnParentPackageInstalled(IPackage package, IPackageManagementProject project);
+ void OnParentPackageInstalled (IPackage package, IPackageManagementProject project, IEnumerable<PackageOperation> operations);
void OnParentPackageUninstalled(IPackage package, IPackageManagementProject project);
void OnParentPackagesUpdated(IEnumerable<IPackage> packages);
void OnPackageOperationMessageLogged(MessageLevel level, string message, params object[] args);
@@ -65,5 +66,9 @@ namespace ICSharpCode.PackageManagement void OnFileChanged(string path);
void OnUpdatedPackagesAvailable ();
bool OnFileRemoving (string path);
+ void OnPackageRestored (IPackage package);
+
+ [Obsolete]
+ void OnParentPackageInstalled (IPackage package, IPackageManagementProject project);
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/InstallPackageAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/InstallPackageAction.cs index a5726d465c..778140286e 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/InstallPackageAction.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/InstallPackageAction.cs @@ -52,7 +52,7 @@ namespace ICSharpCode.PackageManagement protected override void ExecuteCore()
{
Project.InstallPackage(Package, this);
- OnParentPackageInstalled();
+ OnParentPackageInstalled ();
}
protected override string StartingMessageFormat {
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MSBuildTargetsRestoredMonitor.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MSBuildTargetsRestoredMonitor.cs new file mode 100644 index 0000000000..1f8f80f58c --- /dev/null +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MSBuildTargetsRestoredMonitor.cs @@ -0,0 +1,64 @@ +//
+// MSBuildTargetsRestoredMonitor.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Linq;
+using ICSharpCode.PackageManagement;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement
+{
+ public class MSBuildTargetsRestoredMonitor : IDisposable
+ {
+ IPackageManagementEvents packageManagementEvents;
+
+ public MSBuildTargetsRestoredMonitor (IPackageManagementEvents packageManagementEvents)
+ {
+ this.packageManagementEvents = packageManagementEvents;
+ this.packageManagementEvents.PackageRestored += PackageRestored;
+ }
+
+ void PackageRestored (object sender, PackageRestoredEventArgs e)
+ {
+ if (PackageHasMSBuildTargetsFile (e.Package)) {
+ AnyMSBuildTargetsRestored = true;
+ }
+ }
+
+ bool PackageHasMSBuildTargetsFile (IPackage package)
+ {
+ return package.GetBuildFiles ().Any ();
+ }
+
+ public void Dispose ()
+ {
+ this.packageManagementEvents.PackageRestored -= PackageRestored;
+ }
+
+ public bool AnyMSBuildTargetsRestored { get; private set; }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementEvents.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementEvents.cs index 4500ce5cd2..6ed96e3ca7 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementEvents.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementEvents.cs @@ -83,7 +83,14 @@ namespace ICSharpCode.PackageManagement ParentPackageInstalled(this, new ParentPackageOperationEventArgs(package, project));
}
}
-
+
+ public void OnParentPackageInstalled (IPackage package, IPackageManagementProject project, IEnumerable<PackageOperation> operations)
+ {
+ if (ParentPackageInstalled != null) {
+ ParentPackageInstalled (this, new ParentPackageOperationEventArgs(package, project, operations));
+ }
+ }
+
public event EventHandler<ParentPackageOperationEventArgs> ParentPackageUninstalled;
public void OnParentPackageUninstalled(IPackage package, IPackageManagementProject project)
@@ -174,5 +181,14 @@ namespace ICSharpCode.PackageManagement }
return true;
}
+
+ public event EventHandler<PackageRestoredEventArgs> PackageRestored;
+
+ public void OnPackageRestored (IPackage package)
+ {
+ if (PackageRestored != null) {
+ PackageRestored (this, new PackageRestoredEventArgs (package));
+ }
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementEventsMonitor.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementEventsMonitor.cs index 7594cb305e..39df61d6e9 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementEventsMonitor.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementEventsMonitor.cs @@ -31,6 +31,7 @@ using ICSharpCode.PackageManagement; using MonoDevelop.Core;
using MonoDevelop.Ide;
using NuGet;
+using MonoDevelop.Ide.TypeSystem;
namespace MonoDevelop.PackageManagement
{
@@ -43,6 +44,7 @@ namespace MonoDevelop.PackageManagement IFileConflictResolver fileConflictResolver = new FileConflictResolver ();
string currentProgressOperation;
List<FileEventArgs> fileChangedEvents = new List<FileEventArgs> ();
+ List<IPackageManagementProject> projectsRequiringTypeSystemRefresh = new List<IPackageManagementProject> ();
public PackageManagementEventsMonitor (
IProgressMonitor progressMonitor,
@@ -57,18 +59,21 @@ namespace MonoDevelop.PackageManagement packageManagementEvents.ResolveFileConflict += ResolveFileConflict;
packageManagementEvents.AcceptLicenses += AcceptLicenses;
packageManagementEvents.FileChanged += FileChanged;
+ packageManagementEvents.ParentPackageInstalled += PackageInstalled;
progressProvider.ProgressAvailable += ProgressAvailable;
}
-
+
public void Dispose ()
{
progressProvider.ProgressAvailable -= ProgressAvailable;
+ packageManagementEvents.ParentPackageInstalled -= PackageInstalled;
packageManagementEvents.FileChanged -= FileChanged;
packageManagementEvents.AcceptLicenses -= AcceptLicenses;
packageManagementEvents.ResolveFileConflict -= ResolveFileConflict;
packageManagementEvents.PackageOperationMessageLogged -= PackageOperationMessageLogged;
NotifyFilesChanged ();
+ RefreshTypeSystem ();
}
void ResolveFileConflict(object sender, ResolveFileConflictEventArgs e)
@@ -194,6 +199,39 @@ namespace MonoDevelop.PackageManagement {
progressMonitor.ShowPackageConsole ();
}
+
+ void RefreshTypeSystem ()
+ {
+ foreach (IPackageManagementProject project in projectsRequiringTypeSystemRefresh) {
+ ReconnectAssemblyReferences (project);
+ }
+ }
+
+ protected virtual void ReconnectAssemblyReferences (IPackageManagementProject project)
+ {
+ var projectWrapper = TypeSystemService.GetProjectContentWrapper (project.DotNetProject);
+ if (projectWrapper != null) {
+ projectWrapper.ReconnectAssemblyReferences ();
+ }
+ }
+
+ void PackageInstalled (object sender, ParentPackageOperationEventArgs e)
+ {
+ if (ShouldRefreshTypeSystemForProject (e)) {
+ projectsRequiringTypeSystemRefresh.Add (e.Project);
+ }
+ }
+
+ bool ShouldRefreshTypeSystemForProject (ParentPackageOperationEventArgs e)
+ {
+ return e.Operations.Any (operation => IsInstallingMSBuildFiles (operation));
+ }
+
+ bool IsInstallingMSBuildFiles (PackageOperation operation)
+ {
+ return (operation.Action == PackageAction.Install) &&
+ operation.Package.GetBuildFiles ().Any ();
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageRestoreRunner.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageRestoreRunner.cs index 1c1b915142..2dd4d79a71 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageRestoreRunner.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageRestoreRunner.cs @@ -28,10 +28,8 @@ using System; using System.Linq;
using ICSharpCode.PackageManagement;
using MonoDevelop.Core;
-using MonoDevelop.Core.Execution;
using MonoDevelop.Ide;
-using MonoDevelop.Ide.Gui;
-using MonoDevelop.Core.ProgressMonitoring;
+using MonoDevelop.Ide.TypeSystem;
using MonoDevelop.Projects;
using NuGet;
@@ -109,13 +107,16 @@ namespace MonoDevelop.PackageManagement void RestorePackages (IProgressMonitor progressMonitor, ProgressMonitorStatusMessage progressMessage)
{
- var action = new RestorePackagesAction (solution, packageManagementEvents);
- if (project != null) {
- action.Project = project;
+ var msbuildTargetsMonitor = new MSBuildTargetsRestoredMonitor (packageManagementEvents);
+ using (msbuildTargetsMonitor) {
+ var action = new RestorePackagesAction (solution, packageManagementEvents);
+ if (project != null) {
+ action.Project = project;
+ }
+ action.Execute ();
}
- action.Execute ();
- RefreshProjectReferences ();
+ RefreshProjectReferences (msbuildTargetsMonitor.AnyMSBuildTargetsRestored);
ForceCreationOfSharedRepositoriesConfigFile ();
progressMonitor.ReportSuccess (progressMessage.Success);
@@ -136,14 +137,30 @@ namespace MonoDevelop.PackageManagement /// Refresh all projects even though we may have only restored packages for one project since
/// the packages may be used in other projects.
/// </summary>
- void RefreshProjectReferences ()
+ void RefreshProjectReferences (bool refreshMSBuildTargets)
{
DispatchService.GuiDispatch (() => {
foreach (IDotNetProject projectInSolution in solution.GetDotNetProjects ()) {
+ if (refreshMSBuildTargets) {
+ projectInSolution.RefreshProjectBuilder ();
+ }
+
projectInSolution.DotNetProject.RefreshReferenceStatus ();
+
+ if (refreshMSBuildTargets) {
+ ReconnectAssemblyReferences (projectInSolution.DotNetProject);
+ }
}
});
}
+
+ void ReconnectAssemblyReferences (DotNetProject dotNetProject)
+ {
+ var projectWrapper = TypeSystemService.GetProjectContentWrapper (dotNetProject);
+ if (projectWrapper != null) {
+ projectWrapper.ReconnectAssemblyReferences ();
+ }
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageRestoredEventArgs.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageRestoredEventArgs.cs new file mode 100644 index 0000000000..cf9b9dc141 --- /dev/null +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageRestoredEventArgs.cs @@ -0,0 +1,42 @@ +//
+// PackageRestoredEventArgs.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using NuGet;
+
+namespace MonoDevelop.PackageManagement
+{
+ public class PackageRestoredEventArgs : EventArgs
+ {
+ public PackageRestoredEventArgs (IPackage package)
+ {
+ Package = package;
+ }
+
+ public IPackage Package { get; set; }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ParentPackageOperationEventArgs.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ParentPackageOperationEventArgs.cs index 6ffeaf4138..2fdc32c4fc 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ParentPackageOperationEventArgs.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ParentPackageOperationEventArgs.cs @@ -27,6 +27,7 @@ //
using System;
+using System.Collections.Generic;
using NuGet;
namespace ICSharpCode.PackageManagement
@@ -34,12 +35,22 @@ namespace ICSharpCode.PackageManagement public class ParentPackageOperationEventArgs : EventArgs
{
public ParentPackageOperationEventArgs(IPackage package, IPackageManagementProject project)
+ : this (package, project, new PackageOperation [0])
{
- this.Package = package;
- this.Project = project;
}
-
+
+ public ParentPackageOperationEventArgs (
+ IPackage package,
+ IPackageManagementProject project,
+ IEnumerable<PackageOperation> operations)
+ {
+ Package = package;
+ Project = project;
+ Operations = operations;
+ }
+
public IPackage Package { get; private set; }
public IPackageManagementProject Project { get; private set; }
+ public IEnumerable<PackageOperation> Operations { get; private set; }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProcessPackageAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProcessPackageAction.cs index a17603c744..c957f7c8e5 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProcessPackageAction.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProcessPackageAction.cs @@ -65,12 +65,7 @@ namespace ICSharpCode.PackageManagement {
return false;
}
-
- protected void OnParentPackageInstalled()
- {
- packageManagementEvents.OnParentPackageInstalled(Package, Project);
- }
-
+
protected void OnParentPackageUninstalled()
{
packageManagementEvents.OnParentPackageUninstalled(Package, Project);
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProcessPackageOperationsAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProcessPackageOperationsAction.cs index 5c2a87e349..bd4d6da486 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProcessPackageOperationsAction.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProcessPackageOperationsAction.cs @@ -35,11 +35,14 @@ namespace ICSharpCode.PackageManagement {
public abstract class ProcessPackageOperationsAction : ProcessPackageAction
{
+ IPackageManagementEvents packageManagementEvents;
+
public ProcessPackageOperationsAction(
IPackageManagementProject project,
IPackageManagementEvents packageManagementEvents)
: base(project, packageManagementEvents)
{
+ this.packageManagementEvents = packageManagementEvents;
}
public IEnumerable<PackageOperation> Operations { get; set; }
@@ -74,5 +77,10 @@ namespace ICSharpCode.PackageManagement BeforeExecute ();
return Operations.Where (operation => operation.Action == PackageAction.Install);
}
+
+ protected void OnParentPackageInstalled ()
+ {
+ packageManagementEvents.OnParentPackageInstalled (Package, Project, Operations);
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestorePackagesAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestorePackagesAction.cs index 17e844d4da..8f67b0fd6e 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestorePackagesAction.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestorePackagesAction.cs @@ -36,6 +36,7 @@ namespace MonoDevelop.PackageManagement public class RestorePackagesAction : IPackageAction
{
IPackageManagementSolution solution;
+ IPackageManagementEvents packageManagementEvents;
ISolutionPackageRepository solutionPackageRepository;
IPackageRepositoryCache repositoryCache;
IPackageManagerFactory packageManagerFactory;
@@ -66,6 +67,7 @@ namespace MonoDevelop.PackageManagement IPackageManagerFactory packageManagerFactory)
{
this.solution = solution;
+ this.packageManagementEvents = packageManagementEvents;
this.repositoryCache = repositoryCache;
this.packageManagerFactory = packageManagerFactory;
@@ -168,6 +170,8 @@ namespace MonoDevelop.PackageManagement ignoreDependencies: true,
allowPrereleaseVersions: true,
ignoreWalkInfo: true);
+
+ packageManagementEvents.OnPackageRestored (package);
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ThreadSafePackageManagementEvents.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ThreadSafePackageManagementEvents.cs index f4a3eaf390..3f19a691e2 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ThreadSafePackageManagementEvents.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ThreadSafePackageManagementEvents.cs @@ -195,7 +195,12 @@ namespace ICSharpCode.PackageManagement {
unsafeEvents.OnParentPackageInstalled(package, project);
}
-
+
+ public void OnParentPackageInstalled (IPackage package, IPackageManagementProject project, IEnumerable<PackageOperation> operations)
+ {
+ unsafeEvents.OnParentPackageInstalled (package, project, operations);
+ }
+
public void OnParentPackageUninstalled(IPackage package, IPackageManagementProject project)
{
unsafeEvents.OnParentPackageUninstalled(package, project);
@@ -283,5 +288,15 @@ namespace ICSharpCode.PackageManagement {
return unsafeEvents.OnFileRemoving (path);
}
+
+ public event EventHandler<PackageRestoredEventArgs> PackageRestored {
+ add { unsafeEvents.PackageRestored += value; }
+ remove { unsafeEvents.PackageRestored -= value; }
+ }
+
+ public void OnPackageRestored (IPackage package)
+ {
+ unsafeEvents.OnPackageRestored (package);
+ }
}
}
diff --git a/main/src/addins/NUnit/Gui/TestResultsPad.cs b/main/src/addins/NUnit/Gui/TestResultsPad.cs index 9d49a55c49..f528d5c082 100644 --- a/main/src/addins/NUnit/Gui/TestResultsPad.cs +++ b/main/src/addins/NUnit/Gui/TestResultsPad.cs @@ -115,7 +115,7 @@ namespace MonoDevelop.NUnit // Failures tree failuresTreeView = new MonoDevelop.Ide.Gui.Components.PadTreeView (); failuresTreeView.HeadersVisible = false; - failuresStore = new TreeStore (typeof(Xwt.Drawing.Image), typeof(string), typeof(object), typeof(string), typeof(int)); + failuresStore = new TreeStore (typeof(Xwt.Drawing.Image), typeof(string), typeof(object), typeof(string), typeof(int), typeof(int)); var pr = new CellRendererImage (); CellRendererText tr = new CellRendererText (); TreeViewColumn col = new TreeViewColumn (); @@ -362,7 +362,9 @@ namespace MonoDevelop.NUnit errorMessage = message; AddErrorMessage (); } - + const int ErrorMessage = 1; + const int StackTrace = 2; + public void AddErrorMessage () { string msg = GettextCatalog.GetString ("Internal error"); @@ -405,7 +407,7 @@ namespace MonoDevelop.NUnit string fileName; int lineNumber; TryParseLocationFromStackTrace (line, out fileName, out lineNumber); - failuresStore.AppendValues (row, null, Escape (line), test, fileName, lineNumber); + failuresStore.AppendValues (row, null, Escape (line), test, fileName, lineNumber, StackTrace); } } @@ -485,8 +487,26 @@ namespace MonoDevelop.NUnit var last = test.GetLastResult (); if (last == null) return; + + Gtk.TreeModel foo; + Gtk.TreeIter iter; + if (!failuresTreeView.Selection.GetSelected (out foo, out iter)) + return; + + int type = (int)failuresStore.GetValue (iter, 5); + var clipboard = Clipboard.Get (Gdk.Atom.Intern ("CLIPBOARD", false)); - clipboard.Text = last.StackTrace; + switch (type) { + case ErrorMessage: + clipboard.Text = last.Message; + break; + case StackTrace: + clipboard.Text = last.StackTrace; + break; + default: + clipboard.Text = last.Message + Environment.NewLine + "Stack trace:" + Environment.NewLine + last.StackTrace; + break; + } } } @@ -561,7 +581,7 @@ namespace MonoDevelop.NUnit Gtk.TreeIter iter; if (!failuresTreeView.Selection.GetSelected (out foo, out iter)) return null; - + UnitTest t = (UnitTest)failuresStore.GetValue (iter, 2); return t; } @@ -624,11 +644,11 @@ namespace MonoDevelop.NUnit TreeIter testRow = failuresStore.AppendValues (TestStatusIcon.Failure, Escape (test.FullName), test, file); bool hasMessage = result.Message != null && result.Message.Length > 0; if (hasMessage) - failuresStore.AppendValues (testRow, null, Escape (result.Message), test); + failuresStore.AppendValues (testRow, null, Escape (result.Message), test, null, 0, ErrorMessage); if (result.StackTrace != null && result.StackTrace.Length > 0) { TreeIter row = testRow; if (hasMessage) - row = failuresStore.AppendValues (testRow, null, GettextCatalog.GetString ("Stack Trace"), test); + row = failuresStore.AppendValues (testRow, null, GettextCatalog.GetString ("Stack Trace"), test, null, 0, StackTrace); AddStackTrace (row, result.StackTrace, test); } failuresTreeView.ScrollToCell (failuresStore.GetPath (testRow), null, false, 0, 0); diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs index af78e7c4a0..71096f96a7 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs @@ -1157,6 +1157,8 @@ namespace MonoDevelop.VersionControl.Subversion.Unix { destroypool (pool); updatemonitor = null; + progressData.LogTimer.Dispose (); + progressData = null; Monitor.Exit (svn); } @@ -1274,10 +1276,8 @@ namespace MonoDevelop.VersionControl.Subversion.Unix } long totalProgress = total; - if (totalProgress != -1 && currentProgress >= totalProgress) { - progressData.LogTimer.Dispose (); + if (totalProgress != -1 && currentProgress >= totalProgress) return; - } progressData.Remainder += currentProgress % 1024; if (progressData.Remainder >= 1024) { diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Repository.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Repository.cs index 960ffa14d7..914e666d33 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Repository.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Repository.cs @@ -167,12 +167,14 @@ namespace MonoDevelop.VersionControl LoggingService.LogError ("VersionControl returned {0} items for {1}", infos.Length, localPath); LoggingService.LogError ("The infos were: {0}", string.Join (" ::: ", infos.Select (i => i.LocalPath))); } - try { + // HACK: This was slowing down the IDE a lot in case in the eventuality of submodules. + return infos [0]; + /*try { return infos.Single (); } catch (InvalidOperationException) { // Workaround for #17216. return infos [0]; - } + }*/ } /// <summary> diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs index de0f337225..0cc1588968 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectHandler.cs @@ -213,6 +213,13 @@ namespace MonoDevelop.Projects.Formats.MSBuild } } + public void RefreshProjectBuilder () + { + if (projectBuilder != null) { + projectBuilder.Refresh (); + } + } + public override void Dispose () { base.Dispose (); diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs index d6a7a8c7f0..7efaac4d77 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs @@ -1269,5 +1269,13 @@ namespace MonoDevelop.Projects importsAdded.Clear (); importsRemoved.Clear (); } + + public void RefreshProjectBuilder () + { + var handler = ItemHandler as MSBuildProjectHandler; + if (handler != null) { + handler.RefreshProjectBuilder (); + } + } } } diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs index 2d92bc3a6c..fc9ee9731a 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Solution.cs @@ -180,7 +180,7 @@ namespace MonoDevelop.Projects } // Used by serialization only - [ProjectPathItemProperty ("StartupItem", DefaultValue=null)] + [ProjectPathItemProperty ("StartupItem", DefaultValue=null, ReadOnly=true)] internal string StartupItemFileName { get { if (SingleStartup && StartupItem != null) @@ -190,8 +190,8 @@ namespace MonoDevelop.Projects } set { startItemFileName = value; } } - - [ItemProperty ("StartupItems")] + + [ItemProperty ("StartupItems", ReadOnly=true)] [ProjectPathItemProperty ("Item", Scope="*")] internal List<string> MultiStartupItemFileNames { get { @@ -241,8 +241,26 @@ namespace MonoDevelop.Projects LoadItemProperties (UserProperties, RootFolder, "MonoDevelop.Ide.ItemProperties"); } + public override void LoadUserProperties () + { + base.LoadUserProperties (); + var sitem = UserProperties.GetValue<string> ("StartupItem"); + if (!string.IsNullOrEmpty (sitem)) + startItemFileName = GetAbsoluteChildPath (sitem); + + var sitems = UserProperties.GetValue<string[]> ("StartupItems"); + if (sitems != null && sitems.Length > 0) + multiStartupItems = sitems.Select (p => (string) GetAbsoluteChildPath (p)).ToList (); + } + public override void SaveUserProperties () { + UserProperties.SetValue ("StartupItem", (string) GetRelativeChildPath (StartupItemFileName)); + if (MultiStartupItemFileNames != null) { + UserProperties.SetValue ("StartupItems", MultiStartupItemFileNames.Select (p => (string)GetRelativeChildPath (p)).ToArray ()); + } else + UserProperties.RemoveValue ("StartupItems"); + CollectItemProperties (UserProperties, RootFolder, "MonoDevelop.Ide.ItemProperties"); base.SaveUserProperties (); CleanItemProperties (UserProperties, RootFolder, "MonoDevelop.Ide.ItemProperties"); @@ -673,7 +691,7 @@ namespace MonoDevelop.Projects foreach (SolutionConfiguration conf in Configurations) conf.AddItem (eitem); // If there is no startup project or it is an invalid one, use the new project as startup if possible - if ((StartupItem == null || !StartupItem.SupportsExecute ()) && eitem.SupportsExecute ()) + if (!Loading && (StartupItem == null || !StartupItem.SupportsExecute ()) && eitem.SupportsExecute ()) StartupItem = eitem; } else { // Reuse the configuration information of the replaced item diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Docking/DockBarItem.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Docking/DockBarItem.cs index 181137d274..7fffbd3b8d 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Docking/DockBarItem.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Docking/DockBarItem.cs @@ -347,7 +347,7 @@ namespace MonoDevelop.Components.Docking if (it.ShowingContextMemu) return true; // Don't hide the item if it has the focus. Try again later. - if (it.Widget.FocusChild != null && !force && ((Gtk.Window)autoShowFrame.Toplevel).HasToplevelFocus) + if (it.Widget.FocusChild != null && !force && autoShowFrame != null && ((Gtk.Window)autoShowFrame.Toplevel).HasToplevelFocus) return true; // Don't hide the item if the mouse pointer is still inside the window. Try again later. int px, py; diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/ImageLoader.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/ImageLoader.cs index ec06229cd2..166f3e401b 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/ImageLoader.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/ImageLoader.cs @@ -139,7 +139,7 @@ namespace MonoDevelop.Components using (var stream = File.OpenRead (path)) newImage = Xwt.Drawing.Image.FromStream (stream); if (Math.Abs (scaleFactor - 1) > 0.2) - newImage = Image.Scale (1 / scaleFactor); + newImage = newImage.Scale (1 / scaleFactor); } UpdateImage (newImage, downloaded); } catch (Exception ex) { diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/TreeViewState.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/TreeViewState.cs index 72f90c9c0f..f99b9b3dbc 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/TreeViewState.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/TreeViewState.cs @@ -34,9 +34,9 @@ namespace MonoDevelop.Components { public class TreeViewState { + List<NodeInfo> state; TreeView tree; int idColumn; - List<NodeInfo> state; class NodeInfo { public object Id; @@ -53,109 +53,125 @@ namespace MonoDevelop.Components public void Save () { - TreeIter it; + TreeIter iter; + state = new List<NodeInfo> (); - if (!tree.Model.GetIterFirst (out it)) + if (!tree.Model.GetIterFirst (out iter)) return; - Save (state, it); + + Save (state, iter); } - void Save (List<NodeInfo> info, TreeIter it) + void Save (ICollection<NodeInfo> collection, TreeIter iter) { do { - object id = tree.Model.GetValue (it, idColumn); - NodeInfo ni = new NodeInfo (); - ni.Id = id; - ni.Expanded = tree.GetRowExpanded (tree.Model.GetPath (it)); - ni.Selected = tree.Selection.IterIsSelected (it); - info.Add (ni); - TreeIter cit; - if (tree.Model.IterChildren (out cit, it)) { - ni.ChildInfo = new List<NodeInfo> (); - Save (ni.ChildInfo, cit); + TreeIter child; + + var node = new NodeInfo { + Expanded = tree.GetRowExpanded (tree.Model.GetPath (iter)), + Selected = tree.Selection.IterIsSelected (iter), + Id = tree.Model.GetValue (iter, idColumn) + }; + + collection.Add (node); + + if (tree.Model.IterChildren (out child, iter)) { + node.ChildInfo = new List<NodeInfo> (); + Save (node.ChildInfo, child); } - } - while (tree.Model.IterNext (ref it)); + } while (tree.Model.IterNext (ref iter)); } public void Load () { if (state == null) throw new InvalidOperationException ("State not saved"); - TreeIter it; - if (!tree.Model.GetIterFirst (out it)) + + TreeIter iter; + if (!tree.Model.GetIterFirst (out iter)) return; - Load (state, it); + + Load (state, iter); state = null; } - void Load (List<NodeInfo> info, TreeIter it) + void Load (List<NodeInfo> info, TreeIter iter) { - bool oneSelected = false; + var nodes = new Dictionary<NodeInfo, TreeIter> (); var infoCopy = new List<NodeInfo> (info); - Dictionary<NodeInfo,TreeIter> nodes = new Dictionary<NodeInfo, TreeIter> (); + bool oneSelected = false; + do { - object id = tree.Model.GetValue (it, idColumn); + object id = tree.Model.GetValue (iter, idColumn); NodeInfo ni = ExtractNodeInfo (info, id); + if (ni != null) { - nodes [ni] = it; + nodes[ni] = iter; + if (ni.Expanded) - tree.ExpandRow (tree.Model.GetPath (it), false); + tree.ExpandRow (tree.Model.GetPath (iter), false); else - tree.CollapseRow (tree.Model.GetPath (it)); + tree.CollapseRow (tree.Model.GetPath (iter)); + if (ni.Selected) { oneSelected = true; - tree.Selection.SelectIter (it); + tree.Selection.SelectIter (iter); + } else { + tree.Selection.UnselectIter (iter); } - else - tree.Selection.UnselectIter (it); - + if (ni.ChildInfo != null) { - TreeIter cit; - if (tree.Model.IterChildren (out cit, it)) - Load (ni.ChildInfo, cit); + TreeIter child; + + if (tree.Model.IterChildren (out child, iter)) + Load (ni.ChildInfo, child); } } - } - while (tree.Model.IterNext (ref it)); + } while (tree.Model.IterNext (ref iter)); // If this tree level had a selected node and this node has been deleted, then // try to select and adjacent node if (!oneSelected) { // 'info' contains the nodes that have not been inserted if (info.Any (n => n.Selected)) { - NodeInfo an = FindAdjacentNode (infoCopy, nodes, info[0]); - if (an != null) { - it = nodes [an]; - tree.Selection.SelectIter (it); + NodeInfo adjacent = FindAdjacentNode (infoCopy, nodes, info[0]); + + if (adjacent != null) { + iter = nodes [adjacent]; + tree.Selection.SelectIter (iter); } } } } - NodeInfo FindAdjacentNode (List<NodeInfo> infos, Dictionary<NodeInfo,TreeIter> nodes, NodeInfo referenceNode) + static NodeInfo FindAdjacentNode (IList<NodeInfo> infos, IDictionary<NodeInfo,TreeIter> nodes, NodeInfo referenceNode) { - int i = infos.IndexOf (referenceNode); - for (int n=i; n<infos.Count; n++) { - if (nodes.ContainsKey (infos[n])) - return infos[n]; + int index = infos.IndexOf (referenceNode); + + for (int i = index; i < infos.Count; i++) { + if (nodes.ContainsKey (infos[i])) + return infos[i]; } - for (int n=i-1; n>=0; n--) { - if (nodes.ContainsKey (infos[n])) - return infos[n]; + + for (int i = index - 1; i >= 0; i--) { + if (nodes.ContainsKey (infos[i])) + return infos[i]; } + return null; } - NodeInfo ExtractNodeInfo (List<NodeInfo> info, object id) + static NodeInfo ExtractNodeInfo (IList<NodeInfo> info, object id) { - for (int n=0; n<info.Count; n++) { - NodeInfo ni = (NodeInfo) info [n]; + for (int i = 0; i < info.Count; i++) { + var ni = info[i]; + if (object.Equals (ni.Id, id)) { - info.RemoveAt (n); + info.RemoveAt (i); return ni; } } + return null; } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeFormatting/CodeFormattingCommands.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeFormatting/CodeFormattingCommands.cs index 12c91fdb78..4ff1fd707a 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeFormatting/CodeFormattingCommands.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeFormatting/CodeFormattingCommands.cs @@ -69,11 +69,12 @@ namespace MonoDevelop.Ide.CodeFormatting formatter.OnTheFlyFormat (doc, 0, doc.Editor.Length); } } else { - string formattedText = formatter.FormatText (doc.Project.Policies, doc.Editor.Text); - if (formattedText == null) + var text = doc.Editor.Text; + string formattedText = formatter.FormatText (doc.Project.Policies, text); + if (formattedText == null || formattedText == text) return; - doc.Editor.Replace (0, doc.Editor.Text.Length, formattedText); + doc.Editor.Replace (0, text.Length, formattedText); } doc.Editor.Document.CommitUpdateAll (); } @@ -111,8 +112,9 @@ namespace MonoDevelop.Ide.CodeFormatting } else { var pol = doc.Project != null ? doc.Project.Policies : null; try { - string text = formatter.FormatText (pol, editor.Text, selection.Offset, selection.EndOffset); - if (text != null) { + var editorText = editor.Text; + string text = formatter.FormatText (pol, editorText, selection.Offset, selection.EndOffset); + if (text != null && editorText.Substring (selection.Offset, selection.Length) != text) { editor.Replace (selection.Offset, selection.Length, text); } } catch (Exception e) { diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/CommonAboutDialog.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/CommonAboutDialog.cs index 4573cde7be..a42caae6b0 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/CommonAboutDialog.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/CommonAboutDialog.cs @@ -51,6 +51,7 @@ namespace MonoDevelop.Ide.Gui.Dialogs { public CommonAboutDialog () { + Name = "wizard_dialog"; Title = string.Format (GettextCatalog.GetString ("About {0}"), BrandingService.ApplicationName); TransientFor = IdeApp.Workbench.RootWindow; AllowGrow = false; diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceWindow.cs index f008cf6790..c5468e9ee5 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceWindow.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/SdiWorkspaceWindow.cs @@ -357,6 +357,7 @@ namespace MonoDevelop.Ide.Gui box.PackStart (toolbar.Container, false, false, 0); box.ReorderChild (toolbar.Container, 0); toolbar.Visible = (targetView == ActiveViewContent); + PathWidgetEnabled = !toolbar.Visible; } return toolbar; } @@ -654,6 +655,12 @@ namespace MonoDevelop.Ide.Gui return; pathDoc.PathChanged += HandlePathChange; this.pathDoc = pathDoc; + + // If a toolbar is already being shown, we don't show the pathbar yet + DocumentToolbar toolbar; + if (documentToolbars.TryGetValue (ActiveViewContent, out toolbar) && toolbar.Visible) + return; + PathWidgetEnabled = true; pathBar.SetPath (pathDoc.CurrentPath); } @@ -727,11 +734,15 @@ namespace MonoDevelop.Ide.Gui pathedDocument = (IPathedDocument) viewContents[newIndex].GetContent (typeof(IPathedDocument)); } - if (pathedDocument != null) + var toolbarVisible = false; + foreach (var t in documentToolbars) { + toolbarVisible = ActiveViewContent == t.Key; + t.Value.Container.Visible = toolbarVisible; + } + + if (pathedDocument != null && !toolbarVisible) AttachToPathedDocument (pathedDocument); - foreach (var t in documentToolbars) - t.Value.Container.Visible = ActiveViewContent == t.Key; if (subViewContent != null) subViewContent.Selected (); diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs index 6f7a898781..9cab784847 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs @@ -393,9 +393,11 @@ namespace MonoDevelop.Ide.TypeSystem var file = pcnt._content.GetFile (fileName); if (file != null) { var newResult = parser.Parse (false, fileName, new StringReader (content), pcnt.Project); - pcnt.UpdateContent (c => c.AddOrUpdateFiles (newResult.ParsedFile)); - pcnt.InformFileRemoved (new ParsedFileEventArgs (file)); - pcnt.InformFileAdded (new ParsedFileEventArgs (newResult.ParsedFile)); + if ((newResult.Flags & ParsedDocumentFlags.NonSerializable) != ParsedDocumentFlags.NonSerializable) { + pcnt.UpdateContent (c => c.AddOrUpdateFiles (newResult.ParsedFile)); + pcnt.InformFileRemoved (new ParsedFileEventArgs (file)); + pcnt.InformFileAdded (new ParsedFileEventArgs (newResult.ParsedFile)); + } } } } @@ -2669,7 +2671,7 @@ namespace MonoDevelop.Ide.TypeSystem return; parsedFiles.Add (Tuple.Create (parsedDocument, Context._content.GetFile (fileName))); } - Context.UpdateContent (c => c.AddOrUpdateFiles (parsedFiles.Select (p => p.Item1.ParsedFile))); + Context.UpdateContent (c => c.AddOrUpdateFiles (parsedFiles.Where (f => (f.Item1.Flags & ParsedDocumentFlags.NonSerializable) != ParsedDocumentFlags.NonSerializable).Select (p => p.Item1.ParsedFile))); foreach (var file in parsedFiles) { if (token.IsCancellationRequested) return; diff --git a/main/src/core/MonoDevelop.Ide/gtkrc b/main/src/core/MonoDevelop.Ide/gtkrc index 46079b7c48..cd967ef523 100644 --- a/main/src/core/MonoDevelop.Ide/gtkrc +++ b/main/src/core/MonoDevelop.Ide/gtkrc @@ -228,6 +228,11 @@ style "combo-box" = "default" } } +style "wizard-dialog" +{ + GtkDialog::content-area-border = 0 +} + style "combo-box-entry" = "combo-box" { engine "xamarin" { @@ -353,6 +358,7 @@ class "GtkScale" style "scale" #widget "*GtkEntry" style "entry" widget "*search-entry*" style "search-entry" widget "*GtkTextView" style "entry" +widget "wizard_dialog" style "wizard-dialog" widget_class "*<GtkButton>" style "button" widget_class "*<GtkToggleButton>" style "toggle-button" diff --git a/main/src/core/MonoDevelop.Ide/gtkrc.win32 b/main/src/core/MonoDevelop.Ide/gtkrc.win32 index af0fa8c5bd..2fc52a45b9 100644 --- a/main/src/core/MonoDevelop.Ide/gtkrc.win32 +++ b/main/src/core/MonoDevelop.Ide/gtkrc.win32 @@ -264,6 +264,11 @@ style "search-entry" = "wider" bg[NORMAL] = @base_color } +style "wizard-dialog" +{ + GtkDialog::content-area-border = 0 +} + style "scrollbar" = "default" { GtkRange::slider-width = 7 @@ -317,6 +322,7 @@ widget "*search-entry*" style "search-entry" widget_class "*<GtkButton>" style "button" widget "*.GtkToggleButton" style "button" +widget "wizard_dialog" style "wizard-dialog" widget_class "*<GtkMenu>*" style "menu" widget_class "*<GtkMenuItem>*" style "menu-item" diff --git a/main/src/core/MonoDevelop.Ide/gtkrc.win32-vista b/main/src/core/MonoDevelop.Ide/gtkrc.win32-vista index db29eeb54d..0bd3b3b586 100644 --- a/main/src/core/MonoDevelop.Ide/gtkrc.win32-vista +++ b/main/src/core/MonoDevelop.Ide/gtkrc.win32-vista @@ -233,6 +233,11 @@ style "notebook" = "default" } } +style "wizard-dialog" +{ + GtkDialog::content-area-border = +} + style "radio-button" = "default" { GtkCheckButton::indicator-size = 15 @@ -318,6 +323,8 @@ widget "*search-entry*" style "search-entry" widget_class "*<GtkButton>" style "button" widget "*.GtkToggleButton" style "button" +widget "wizard_dialog" style "wizard-dialog" + widget_class "*<GtkMenu>*" style "menu" widget_class "*<GtkMenuItem>*" style "menu-item" diff --git a/main/tests/test-projects/console-project/ConsoleProject.sln b/main/tests/test-projects/console-project/ConsoleProject.sln index 199aa24543..8ff45c4f45 100755 --- a/main/tests/test-projects/console-project/ConsoleProject.sln +++ b/main/tests/test-projects/console-project/ConsoleProject.sln @@ -1,4 +1,4 @@ -
+
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleProject", "ConsoleProject\ConsoleProject.csproj", "{4A9E3523-48F0-4BDF-A0F4-49DAD4431FAB}"
@@ -14,9 +14,6 @@ Global {4A9E3523-48F0-4BDF-A0F4-49DAD4431FAB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4A9E3523-48F0-4BDF-A0F4-49DAD4431FAB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
- GlobalSection(MonoDevelopProperties) = preSolution
- StartupItem = ConsoleProject\ConsoleProject.csproj
- EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
diff --git a/main/tests/test-projects/generated-console-project/TestSolution.sln b/main/tests/test-projects/generated-console-project/TestSolution.sln index 3af6b2e2a1..d6c9bca5fb 100644 --- a/main/tests/test-projects/generated-console-project/TestSolution.sln +++ b/main/tests/test-projects/generated-console-project/TestSolution.sln @@ -1,4 +1,4 @@ -
+
Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestProject", "TestProject.csproj", "{969F05E2-0E79-4C5B-982C-8F3DD4D46311}" @@ -14,7 +14,4 @@ Global {969F05E2-0E79-4C5B-982C-8F3DD4D46311}.Release|Any CPU.ActiveCfg = Release|Any CPU {969F05E2-0E79-4C5B-982C-8F3DD4D46311}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection
- GlobalSection(MonoDevelopProperties) = preSolution
- StartupItem = TestProject.csproj
- EndGlobalSection
EndGlobal
diff --git a/main/tests/test-projects/generated-shared-project/TestSolution.sln b/main/tests/test-projects/generated-shared-project/TestSolution.sln index 3ec62a6e4a..8484fa154f 100644 --- a/main/tests/test-projects/generated-shared-project/TestSolution.sln +++ b/main/tests/test-projects/generated-shared-project/TestSolution.sln @@ -1,4 +1,4 @@ -
+
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestProject", "TestProject.csproj", "{7DE4B613-BAB6-49DE-83FA-707D4E120306}"
@@ -16,7 +16,4 @@ Global {7DE4B613-BAB6-49DE-83FA-707D4E120306}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7DE4B613-BAB6-49DE-83FA-707D4E120306}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
- GlobalSection(MonoDevelopProperties) = preSolution
- StartupItem = TestProject.csproj
- EndGlobalSection
EndGlobal
diff --git a/main/tests/test-projects/solution-build-order/ConsoleApplication3.sln b/main/tests/test-projects/solution-build-order/ConsoleApplication3.sln index d9dfe95b00..f65cb04327 100644 --- a/main/tests/test-projects/solution-build-order/ConsoleApplication3.sln +++ b/main/tests/test-projects/solution-build-order/ConsoleApplication3.sln @@ -1,4 +1,4 @@ -
+
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
VisualStudioVersion = 12.0.30312.1
@@ -49,9 +49,6 @@ Global {D98AE4E1-382B-4E3C-8F1D-6DDC469392FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D98AE4E1-382B-4E3C-8F1D-6DDC469392FF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
- GlobalSection(MonoDevelopProperties) = preSolution
- StartupItem = ConsoleApplication3\ConsoleApplication3.csproj
- EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
diff --git a/main/tests/test-projects/unsupported-project/console-with-libs.sln b/main/tests/test-projects/unsupported-project/console-with-libs.sln index 3a1c54554b..866b16def0 100644 --- a/main/tests/test-projects/unsupported-project/console-with-libs.sln +++ b/main/tests/test-projects/unsupported-project/console-with-libs.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "console-with-libs", "console-with-libs\console-with-libs.csproj", "{EAB80A13-FC3E-4E53-8950-E6B9F19E4C90}" @@ -27,7 +27,6 @@ Global {EAB80A13-FC3E-4E53-8950-E6B9F19E4C90}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution - StartupItem = console-with-libs\console-with-libs.csproj name = console-with-libs EndGlobalSection EndGlobal |