diff --git a/data/resources/StringResources.resx b/data/resources/StringResources.resx index c6d41f1639..0be935f412 100644 --- a/data/resources/StringResources.resx +++ b/data/resources/StringResources.resx @@ -3789,6 +3789,10 @@ Please configure the NAnt executable's location in the SharpDevelop Options.Could not find type definition at the cursor position. Error message when using Search>Find Base Classes when the cursor is not on a type reference. + + Could not find type definition or type member at the cursor position. + Error message when using Search>Find Base Classes when the cursor is not on a type reference or type member. + Send Line to Ruby Console @@ -6473,6 +6477,9 @@ Removed the end part of the original message ", reason '${Message}'" since this Base classes of ${Name} + + Base members of ${Name} + The operation cannot be performed because your source code contains errors: @@ -6525,6 +6532,9 @@ Removed the end part of the original message ", reason '${Message}'" since this Find base classes + + Find base symbols + Find &derived classes @@ -8182,4 +8192,13 @@ Error while starting: This resource is not being used. Its purpose is to test the translation database and has a line break + + Tooltip settings + + + Insert selected code completion entry by typing the following characters: + + + Only insert selected code completion entry by typing <Tab> or <Enter>. + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs index 8921e09daf..1139a8a51d 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs @@ -74,7 +74,7 @@ namespace CSharpBinding return ""; var builder = new TypeSystemAstBuilder(); MethodDeclaration decl; - if (member is IMethod) { + if (member.SymbolKind == SymbolKind.Method) { // If it's a method, convert it directly (including parameters + type parameters) decl = (MethodDeclaration)builder.ConvertEntity(member); } else { diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs index 11bbd494da..69cba35ecd 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs @@ -18,6 +18,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using ICSharpCode.Core; @@ -115,6 +116,7 @@ namespace CSharpBinding.Completion } else { startPos = caretOffset; if (char.IsLetterOrDigit (completionChar) || completionChar == '_') { + if (!CodeCompletionOptions.CompleteWhenTyping) return false; if (startPos > 1 && char.IsLetterOrDigit (completionContext.Document.GetCharAt (startPos - 2))) return false; completionData = cce.GetCompletionData(startPos, false); @@ -137,7 +139,7 @@ namespace CSharpBinding.Completion return true; } - if (!ctrlSpace) { + if (CodeCompletionOptions.InsightEnabled && !ctrlSpace) { // Method Insight var pce = new CSharpParameterCompletionEngine( completionContext.Document, diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CompletionData.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CompletionData.cs index 7c04f56b9f..d717ebaf7b 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CompletionData.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CompletionData.cs @@ -78,13 +78,14 @@ namespace CSharpBinding.Completion public IImage Image { get; set; } public virtual double Priority { - get { return 0; } + get { return CodeCompletionDataUsageCache.GetPriority(DisplayText, true); } } public virtual void Complete(CompletionContext context) { context.Editor.Document.Replace(context.StartOffset, context.Length, this.CompletionText); context.EndOffset = context.StartOffset + this.CompletionText.Length; + CodeCompletionDataUsageCache.IncrementUsage(DisplayText); } object fancyContent; diff --git a/src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/AddDirectoryTestFixture.cs b/src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/AddDirectoryTestFixture.cs index 1f009ae3cf..a80adaa451 100644 --- a/src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/AddDirectoryTestFixture.cs +++ b/src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/AddDirectoryTestFixture.cs @@ -16,16 +16,11 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -using ICSharpCode.SharpDevelop.Project; +using System; +using ICSharpCode.SharpDevelop; using ICSharpCode.WixBinding; using NUnit.Framework; -using System; -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Xml; using WixBinding.Tests.PackageFiles; -using WixBinding.Tests.Utils; namespace WixBinding.Tests.DirectoryImport { diff --git a/src/AddIns/BackendBindings/XamlBinding/XamlBinding.Tests/CodeInsertionTests.cs b/src/AddIns/BackendBindings/XamlBinding/XamlBinding.Tests/CodeInsertionTests.cs index 03a15dbee2..604353a77f 100644 --- a/src/AddIns/BackendBindings/XamlBinding/XamlBinding.Tests/CodeInsertionTests.cs +++ b/src/AddIns/BackendBindings/XamlBinding/XamlBinding.Tests/CodeInsertionTests.cs @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Editor.CodeCompletion; using NUnit.Framework; diff --git a/src/AddIns/Debugger/Debugger.AddIn/Breakpoints/BreakpointBookmark.cs b/src/AddIns/Debugger/Debugger.AddIn/Breakpoints/BreakpointBookmark.cs index 6ea6bb3a16..893eb203ae 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Breakpoints/BreakpointBookmark.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Breakpoints/BreakpointBookmark.cs @@ -152,6 +152,10 @@ namespace Debugger.AddIn.Breakpoints return string.Format("{0} @{1}", this.FileName, this.LineNumber); } + public override bool DisplaysTooltip { + get { return true; } + } + public override object CreateTooltipContent() { return new BreakpointEditorPopup(this) { diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin index 9fb440f6b1..b74dd89bc2 100755 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin @@ -149,20 +149,20 @@ icon="Icons.16x16.Class" class = "ICSharpCode.AvalonEdit.AddIn.ContextActions.FindDerivedClassesOrOverrides"/> - + class = "ICSharpCode.AvalonEdit.AddIn.ContextActions.FindBaseClassesOrMembers"/> - + - + item="/SharpDevelop/Workbench/MainMenu/Search/FindBaseClassesOrMembers" /> diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs index 0c14792c7c..df011392f8 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs @@ -569,6 +569,10 @@ namespace ICSharpCode.AvalonEdit.AddIn SD.ParserService.ParseAsync(this.FileName, this.Document.CreateSnapshot()).FireAndForget(); } else { if (e.Text.Length == 1) { + // disable all code completion bindings when CC is disabled + if (!CodeCompletionOptions.EnableCodeCompletion) + return; + foreach (ICodeCompletionBinding cc in CodeCompletionBindings) { if (cc.HandleKeyPressed(adapter, c)) break; diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindBaseClasses.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindBaseClasses.cs index 690d0b0b88..9194c1ca97 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindBaseClasses.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindBaseClasses.cs @@ -31,16 +31,20 @@ using ICSharpCode.SharpDevelop.Editor.ContextActions; namespace ICSharpCode.AvalonEdit.AddIn.ContextActions { - public class FindBaseClasses : ResolveResultMenuCommand + public class FindBaseClassesOrMembers : ResolveResultMenuCommand { public override void Run(ResolveResult symbol) { IEntity entityUnderCaret = GetSymbol(symbol) as IEntity; if (entityUnderCaret is ITypeDefinition) { MakePopupWithBaseClasses((ITypeDefinition)entityUnderCaret).OpenAtCaretAndFocus(); - } else { - MessageService.ShowError("${res:ICSharpCode.Refactoring.NoClassUnderCursorError}"); + return; } + if (entityUnderCaret is IMember) { + MakePopupWithBaseMembers((IMember)entityUnderCaret).OpenAtCaretAndFocus(); + return; + } + MessageService.ShowError("${res:ICSharpCode.Refactoring.NoClassOrMemberUnderCursorError}"); } static ContextActionsPopup MakePopupWithBaseClasses(ITypeDefinition @class) @@ -49,14 +53,54 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions var popupViewModel = new ContextActionsPopupViewModel(); popupViewModel.Title = MenuService.ConvertLabel(StringParser.Parse( "${res:SharpDevelop.Refactoring.BaseClassesOf}", new StringTagPair("Name", @class.Name))); - popupViewModel.Actions = BuildListViewModel(baseClassList); + popupViewModel.Actions = BuildBaseClassListViewModel(baseClassList); return new ContextActionsPopup { Actions = popupViewModel }; } - static ObservableCollection BuildListViewModel(IEnumerable classList) + static ObservableCollection BuildBaseClassListViewModel(IEnumerable classList) { return new ObservableCollection( classList.Select(@class => GoToEntityAction.MakeViewModel(@class, null))); } + + #region Base (overridden) members + static ContextActionsPopup MakePopupWithBaseMembers(IMember member) + { + var baseClassList = member.DeclaringTypeDefinition.GetAllBaseTypeDefinitions().Where( + baseClass => baseClass != member.DeclaringTypeDefinition).ToList(); + var popupViewModel = new ContextActionsPopupViewModel { + Title = MenuService.ConvertLabel(StringParser.Parse( + "${res:SharpDevelop.Refactoring.BaseMembersOf}", + new StringTagPair("Name", member.FullName)) + )}; + popupViewModel.Actions = BuildBaseMemberListViewModel(member); + return new ContextActionsPopup { Actions = popupViewModel }; + } + + static ObservableCollection BuildBaseMemberListViewModel(IMember member) + { + var c = new ObservableCollection(); + ObservableCollection lastBase = c; + + IMember thisMember = member; + while (thisMember != null) { + IMember baseMember = InheritanceHelper.GetBaseMembers(thisMember, true).FirstOrDefault(); + if (baseMember != null) { + // Only allow this base member, if overriding a virtual/abstract member of a class + // or implementing a member of an interface. + if ((baseMember.DeclaringTypeDefinition.Kind == TypeKind.Interface) || (baseMember.IsOverridable && thisMember.IsOverride)) { + var newChild = new ObservableCollection(); + lastBase.Add(GoToEntityAction.MakeViewModel(baseMember, newChild)); + lastBase = newChild; + } else { + thisMember = null; + } + } + thisMember = baseMember; + } + + return c; + } + #endregion } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs index 24f8b416da..ec63f87575 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs @@ -19,6 +19,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; @@ -286,7 +287,10 @@ namespace ICSharpCode.AvalonEdit.AddIn int line = GetLineFromMousePosition(e); if (line < 1) return; - IBookmark bm = GetBookmarkFromLine(line); + IBookmark bm = manager.Bookmarks + .Where(m => m.LineNumber == line && m.DisplaysTooltip) + .OrderBy(m => m.ZOrder) + .FirstOrDefault(); if (bm == null) return; object content = bm.CreateTooltipContent(); popupToolTip = content as Popup; @@ -301,7 +305,7 @@ namespace ICSharpCode.AvalonEdit.AddIn e.Handled = true; popupToolTip.IsOpen = true; distanceToPopupLimit = double.PositiveInfinity; // reset limit; we'll re-calculate it on the next mouse movement - } else { + } else if (content != null) { if (toolTip == null) { toolTip = new ToolTip(); toolTip.Closed += ToolTipClosed; diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetCompletionItem.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetCompletionItem.cs index d2882c81f7..4b58cbfdc4 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetCompletionItem.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetCompletionItem.cs @@ -49,8 +49,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets if (textArea == null) throw new ArgumentException("textEditor must be an AvalonEdit text editor"); this.codeSnippet = codeSnippet; - - //this.Priority = CodeCompletionDataUsageCache.GetPriority("snippet" + codeSnippet.Name, true); + this.Priority = CodeCompletionDataUsageCache.GetPriority("snippet" + codeSnippet.Name, true); } public bool AlwaysInsertSnippet { get; set; } diff --git a/src/AddIns/DisplayBindings/HexEditor/Project/Src/View/HexEditView.cs b/src/AddIns/DisplayBindings/HexEditor/Project/Src/View/HexEditView.cs index bfe4d78981..cfeb86cb19 100644 --- a/src/AddIns/DisplayBindings/HexEditor/Project/Src/View/HexEditView.cs +++ b/src/AddIns/DisplayBindings/HexEditor/Project/Src/View/HexEditView.cs @@ -136,12 +136,12 @@ namespace HexEditor.View void DocumentChanged(object sender, EventArgs e) { if (PrimaryFile != null) PrimaryFile.MakeDirty(); - CommandManager.InvalidateRequerySuggested(); + SD.WinForms.InvalidateCommands(); } void SelectionChanged(object sender, System.EventArgs e) { - CommandManager.InvalidateRequerySuggested(); + SD.WinForms.InvalidateCommands(); } } } diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj b/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj index 6b2f2acc10..58b4161739 100644 --- a/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj @@ -54,7 +54,7 @@ - + Component diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceEditor.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceEditor.cs index ff5ceefb46..b81caa748d 100644 --- a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceEditor.cs +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceEditor.cs @@ -21,6 +21,7 @@ using System.Drawing; using System.Windows.Forms; using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.WinForms; namespace ResourceEditor { @@ -39,7 +40,7 @@ namespace ResourceEditor protected ListViewViewState internalState = ListViewViewState.Nothing; - public System.Enum InternalState { + public Enum InternalState { get { return internalState; } @@ -55,14 +56,14 @@ namespace ResourceEditor public ResourceEditorControl() { InitializeComponent(); - resourceList.SelectedIndexChanged += new EventHandler(resourceListSelectionChanged); + resourceList.SelectedIndexChanged += ResourceListSelectionChanged; } - void resourceListSelectionChanged(object sender, EventArgs e) + void ResourceListSelectionChanged(object sender, EventArgs e) { if(resourceList.SelectedItems.Count == 0) { internalState = ListViewViewState.Nothing; - showResource(null); + ShowResource(null); } else { internalState = ListViewViewState.ItemsSelected; } @@ -72,7 +73,7 @@ namespace ResourceEditor } object key = resourceList.SelectedItems[0].Text; ResourceItem item = (ResourceItem)resourceList.Resources[key.ToString()]; - showResource(item); + ShowResource(item); } void InitializeComponent() @@ -92,17 +93,17 @@ namespace ResourceEditor Controls.Add(splitter); Controls.Add(resourceList); - this.Resize += new EventHandler(initializeLayout); + this.Resize += InitializeLayout; } - void initializeLayout(object sender, EventArgs e) + void InitializeLayout(object sender, EventArgs e) { resourceList.Height = Convert.ToInt32(0.75 * Height); } - void showView(Control viewer) + void ShowView(Control viewer) { - // remvoe old view if there is one + // remove old view if there is one if(panel.Controls.Count == 1) { Control control = panel.Controls[0]; panel.Controls.Remove(control); @@ -114,41 +115,41 @@ namespace ResourceEditor panel.Controls.Add(viewer); currentView = (IResourceView)viewer; currentView.WriteProtected = resourceList.WriteProtected; - currentView.ResourceChanged += new ResourceChangedEventHandler(viewResourceChanged); + currentView.ResourceChanged += ViewResourceChanged; } } - void viewResourceChanged(object sender, ResourceEventArgs e) + void ViewResourceChanged(object sender, ResourceEventArgs e) { resourceList.SetResourceValue(e.ResourceName, e.ResourceValue); } - void showResource(ResourceItem item) + void ShowResource(ResourceItem item) { if(item == null) { - showView(null); + ShowView(null); return; } if (item.ResourceValue is Icon) { IconView iv = new IconView(item); - showView(iv); + ShowView(iv); } else if(item.ResourceValue is Bitmap) { BitmapView bv = new BitmapView(item); - showView(bv); + ShowView(bv); } else if(item.ResourceValue is Cursor) { CursorView cv = new CursorView(item); - showView(cv); + ShowView(cv); } else if(item.ResourceValue is string) { TextView tv = new TextView(item); - showView(tv); + ShowView(tv); } else if(item.ResourceValue is byte[]) { BinaryView bv = new BinaryView(item); - showView(bv); + ShowView(bv); } else if(item.ResourceValue is bool) { BooleanView bv = new BooleanView(item); - showView(bv); + ShowView(bv); } else { - showView(null); + ShowView(null); } } diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/DisplayDefinition.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEditorDisplayBinding.cs similarity index 79% rename from src/AddIns/DisplayBindings/ResourceEditor/Project/Src/DisplayDefinition.cs rename to src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEditorDisplayBinding.cs index 28ad9149da..6fc0f754c0 100644 --- a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/DisplayDefinition.cs +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEditorDisplayBinding.cs @@ -32,7 +32,6 @@ namespace ResourceEditor { public class ResourceEditorDisplayBinding : IDisplayBinding { - // IDisplayBinding interface public bool CanCreateContentForFile(FileName fileName) { return true; // definition in .addin does extension-based filtering @@ -54,9 +53,6 @@ namespace ResourceEditor } } - /// - /// This class describes the main functionality of a language codon - /// public class ResourceEditWrapper : AbstractViewContentHandlingLoadErrors, IClipboardHandler { ResourceEditorControl resourceEditor = new ResourceEditorControl(); @@ -73,14 +69,16 @@ namespace ResourceEditor void SetDirty(object sender, EventArgs e) { - this.PrimaryFile.MakeDirty(); + PrimaryFile.MakeDirty(); + SD.WinForms.InvalidateCommands(); } public ResourceEditWrapper(OpenedFile file) { this.TabPageText = "Resource editor"; - base.UserContent = resourceEditor; - resourceEditor.ResourceList.Changed += new EventHandler(SetDirty); + UserContent = resourceEditor; + resourceEditor.ResourceList.Changed += SetDirty; + resourceEditor.ResourceList.ItemSelectionChanged += (sender, e) => SD.WinForms.InvalidateCommands(); this.Files.Add(file); } @@ -104,7 +102,7 @@ namespace ResourceEditor public bool EnableCut { get { - if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + if (resourceEditor.ResourceList.IsEditing) { return false; } return resourceEditor.ResourceList.SelectedItems.Count > 0; @@ -114,7 +112,7 @@ namespace ResourceEditor public bool EnableCopy { get { - if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + if (resourceEditor.ResourceList.IsEditing) { return false; } return resourceEditor.ResourceList.SelectedItems.Count > 0; @@ -124,7 +122,7 @@ namespace ResourceEditor public bool EnablePaste { get { - if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + if (resourceEditor.ResourceList.IsEditing) { return false; } return true; @@ -134,7 +132,7 @@ namespace ResourceEditor public bool EnableDelete { get { - if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + if (resourceEditor.ResourceList.IsEditing) { return false; } return resourceEditor.ResourceList.SelectedItems.Count > 0; @@ -144,7 +142,7 @@ namespace ResourceEditor public bool EnableSelectAll { get { - if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + if (resourceEditor.ResourceList.IsEditing) { return false; } return true; @@ -241,33 +239,17 @@ namespace ResourceEditor public void Delete() { - if (resourceEditor.ResourceList.WriteProtected) { + var resourceList = resourceEditor.ResourceList; + if (resourceList.WriteProtected || resourceList.SelectedItems.Count == 0) return; - } - - if (resourceEditor.ResourceList.SelectedItems.Count==0) return; // nothing to do - DialogResult rc; - - try { - - rc=MessageBox.Show(ResourceService.GetString("ResourceEditor.DeleteEntry.Confirm"),ResourceService.GetString("ResourceEditor.DeleteEntry.Title"),MessageBoxButtons.OKCancel); - } - catch { - // when something happens - like resource is missing - try to use default message - rc = MessageBox.Show("Do you really want to delete?","Delete-Warning!",MessageBoxButtons.OKCancel); - } - - if (rc != DialogResult.OK) { + if (!SD.MessageService.AskQuestion("${res:ResourceEditor.DeleteEntry.Confirm}", "${res:ResourceEditor.DeleteEntry.Title}")) return; - } - foreach (ListViewItem item in resourceEditor.ResourceList.SelectedItems) { - //// not clear why this check is present here - seems to be extra - ////if (item.Text != null) { - resourceEditor.ResourceList.Resources.Remove(item.Text); - resourceEditor.ResourceList.Items.Remove(item); + foreach (ListViewItem item in resourceList.SelectedItems) { + resourceList.Resources.Remove(item.Text); + resourceList.Items.Remove(item); // and set dirty flag - resourceEditor.ResourceList.OnChanged(); + resourceList.OnChanged(); } } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs index bc1a88fefd..bf4e38bc32 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs @@ -200,6 +200,7 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion if (listBox == null && value != null) ApplyTemplate(); listBox.SelectedItem = value; + listBox.ScrollIntoView(value); } } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindow.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindow.cs index 1810c94e0e..3a81b86a0f 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindow.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindow.cs @@ -17,13 +17,10 @@ // DEALINGS IN THE SOFTWARE. using System; -using System.Diagnostics; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; -using System.Windows.Data; using System.Windows.Input; -using System.Windows.Threading; using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Editing; @@ -67,6 +64,8 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion } #region ToolTip handling + public bool ShowDocumentationTooltips { get; set; } + void toolTip_Closed(object sender, RoutedEventArgs e) { // Clear content after tooltip is closed. @@ -78,6 +77,11 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion void completionList_SelectionChanged(object sender, SelectionChangedEventArgs e) { + if (!ShowDocumentationTooltips) { + toolTip.IsOpen = false; + return; + } + var item = completionList.SelectedItem; if (item == null) return; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeIssues/Synced/PracticesAndImprovements/ConvertToConstantIssue.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeIssues/Synced/PracticesAndImprovements/ConvertToConstantIssue.cs index f63b49f172..30aa5b8cb3 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeIssues/Synced/PracticesAndImprovements/ConvertToConstantIssue.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeIssues/Synced/PracticesAndImprovements/ConvertToConstantIssue.cs @@ -180,7 +180,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring return; var returnTypeRR = ctx.Resolve(varDecl.Type); - if (returnTypeRR.Type.IsReferenceType.HasValue && returnTypeRR.Type.IsReferenceType.Value) + if (!IsValidConstType(returnTypeRR.Type)) return; var variable = varDecl.Variables.First(); diff --git a/src/Main/Base/Project/Editor/Bookmarks/BookmarkBase.cs b/src/Main/Base/Project/Editor/Bookmarks/BookmarkBase.cs index 1f060e0787..e1fbb0accf 100644 --- a/src/Main/Base/Project/Editor/Bookmarks/BookmarkBase.cs +++ b/src/Main/Base/Project/Editor/Bookmarks/BookmarkBase.cs @@ -195,6 +195,10 @@ namespace ICSharpCode.SharpDevelop.Editor.Bookmarks { } + public virtual bool DisplaysTooltip { + get { return false; } + } + public virtual object CreateTooltipContent() { return null; diff --git a/src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs b/src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs index 1c077f4d45..26825bd7c7 100644 --- a/src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs +++ b/src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs @@ -98,6 +98,10 @@ namespace ICSharpCode.SharpDevelop.Editor.Bookmarks throw new NotSupportedException(); } + bool IBookmark.DisplaysTooltip { + get { return false; } + } + object IBookmark.CreateTooltipContent() { return null; diff --git a/src/Main/Base/Project/Editor/Bookmarks/IBookmark.cs b/src/Main/Base/Project/Editor/Bookmarks/IBookmark.cs index c80366c656..07efd13911 100644 --- a/src/Main/Base/Project/Editor/Bookmarks/IBookmark.cs +++ b/src/Main/Base/Project/Editor/Bookmarks/IBookmark.cs @@ -61,6 +61,11 @@ namespace ICSharpCode.SharpDevelop.Editor.Bookmarks /// void Drop(int lineNumber); + /// + /// Gets whether this bookmark might want to display a tooltip. + /// + bool DisplaysTooltip { get; } + /// /// Creates the tooltip content for the bookmark. /// diff --git a/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml b/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml new file mode 100644 index 0000000000..d2bca2d28d --- /dev/null +++ b/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml.cs b/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml.cs deleted file mode 100644 index 906da07b7d..0000000000 --- a/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml.cs +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team -// -// 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.Windows; -using ICSharpCode.Core; -using ICSharpCode.SharpDevelop.Gui; - -namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion -{ - /// - /// Interaction logic for CodeCompletionPanelXaml.xaml - /// - public partial class CodeCompletionPanel : OptionPanel - { - public CodeCompletionPanel() - { - InitializeComponent(); - this.DataContext = this; - } - - #region overrides - - public override void LoadOptions() - { - base.LoadOptions(); - this.EnableCodeCompletion = CodeCompletionOptions.EnableCodeCompletion; - this.UseDataUsageCache = CodeCompletionOptions.DataUsageCacheEnabled; - DataUsageCacheItemCount = CodeCompletionOptions.DataUsageCacheItemCount; - UseTooltips = CodeCompletionOptions.TooltipsEnabled; - useDebugTooltipsOnly.IsChecked = CodeCompletionOptions.TooltipsOnlyWhenDebugging; - completeWhenTyping.IsChecked = CodeCompletionOptions.CompleteWhenTyping; - useKeywordCompletionCheckBox.IsChecked = CodeCompletionOptions.KeywordCompletionEnabled; - UseInsight = CodeCompletionOptions.InsightEnabled; - refreshInsightOnComma.IsChecked = CodeCompletionOptions.InsightRefreshOnComma; - } - - - public override bool SaveOptions() - { - CodeCompletionOptions.EnableCodeCompletion = this.EnableCodeCompletion; - CodeCompletionOptions.DataUsageCacheEnabled = this.UseDataUsageCache; - CodeCompletionOptions.DataUsageCacheItemCount = DataUsageCacheItemCount; - CodeCompletionOptions.TooltipsEnabled = UseTooltips; - CodeCompletionOptions.TooltipsOnlyWhenDebugging = (bool)useDebugTooltipsOnly.IsChecked; - CodeCompletionOptions.CompleteWhenTyping = (bool)completeWhenTyping.IsChecked; - CodeCompletionOptions.KeywordCompletionEnabled = (bool)useKeywordCompletionCheckBox.IsChecked; - CodeCompletionOptions.InsightEnabled = UseInsight; - CodeCompletionOptions.InsightRefreshOnComma = (bool)refreshInsightOnComma.IsChecked; - return base.SaveOptions(); - } - - #endregion - - #region Properties - - private bool enableCodeCompletion; - - public bool EnableCodeCompletion { - get { return enableCodeCompletion; } - set { enableCodeCompletion = value; - base.RaisePropertyChanged(() => EnableCodeCompletion);} - } - - - private bool useDataUsageCache; - - public bool UseDataUsageCache { - get { return useDataUsageCache; } - set { useDataUsageCache = value; - base.RaisePropertyChanged(() => UseDataUsageCache);} - } - - private int dataUsageCacheItemCount; - - public int DataUsageCacheItemCount { - get { return dataUsageCacheItemCount; } - set { dataUsageCacheItemCount = value; - base.RaisePropertyChanged(() => DataUsageCacheItemCount);} - } - - - private bool useTooltips; - - public bool UseTooltips { - get { return useTooltips; } - set { useTooltips = value; - base.RaisePropertyChanged(() => UseTooltips);} - } - - private bool useInsight; - - public bool UseInsight { - get { return useInsight; } - set { useInsight = value; - base.RaisePropertyChanged(() => UseInsight);} - } - - #endregion - - - void Button_Click(object sender, RoutedEventArgs e) - { - CodeCompletionDataUsageCache.ResetCache(); - } - } -} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilCommandLine.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilCommandLine.cs index 5cc6c8780a..3e1762be87 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilCommandLine.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilCommandLine.cs @@ -24,7 +24,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { public class SvcUtilCommandLine { - StringBuilder argumentBuilder = new StringBuilder(); + List arguments = new List(); public SvcUtilCommandLine(ServiceReferenceGeneratorOptions options) { @@ -32,7 +32,11 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference } public string Command { get; set; } - public string Arguments { get; private set; } + + public string[] GetArguments() + { + return arguments.ToArray(); + } void GenerateCommandLine(ServiceReferenceGeneratorOptions options) { @@ -48,8 +52,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference AppendIfNotEmpty("/ct:", options.GetDictionaryCollectionTypeDescription()); AppendAssemblyReferences(options.Assemblies); AppendIfNotEmpty(options.Url); - - this.Arguments = argumentBuilder.ToString(); } void AppendIfTrue(string argument, bool flag) @@ -62,7 +64,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference void AppendIfNotEmpty(string argumentName, string argumentValue) { if (!String.IsNullOrEmpty(argumentValue)) { - Append(argumentName + GetQuotedArgument(argumentValue)); + Append(argumentName + argumentValue); } } @@ -75,29 +77,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference void Append(string argument) { - argumentBuilder.Append(argument); - argumentBuilder.Append(' '); - } - - public override string ToString() - { - return String.Format( - "{0} {1}", - GetQuotedCommand(), - Arguments); - } - - string GetQuotedCommand() - { - return GetQuotedArgument(Command); - } - - string GetQuotedArgument(string argument) - { - if (ContainsSpaceCharacter(argument)) { - return String.Format("\"{0}\"", argument); - } - return argument; + arguments.Add(argument); } bool ContainsSpaceCharacter(string text) diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilRunner.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilRunner.cs index ad54add75e..c18949da6d 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilRunner.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilRunner.cs @@ -40,7 +40,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference var commandLine = new SvcUtilCommandLine(Options); commandLine.Command = GetSvcUtilPath(); using (ProcessRunner processRunner = new ProcessRunner()) { - this.ExitCode = await processRunner.RunInOutputPadAsync(SvcUtilMessageView.Category, commandLine.Command, ProcessRunner.CommandLineToArgumentArray(commandLine.Arguments)); + this.ExitCode = await processRunner.RunInOutputPadAsync(SvcUtilMessageView.Category, commandLine.Command, commandLine.GetArguments()); } if (ProcessExited != null) { ProcessExited(this, new EventArgs()); diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReferenceHelper.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReferenceHelper.cs index fdde3ea3f4..e88a1aa5d1 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReferenceHelper.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReferenceHelper.cs @@ -24,12 +24,12 @@ using System.Web.Services.Discovery; namespace ICSharpCode.SharpDevelop.Gui { internal static class ServiceReferenceHelper - { + { public static string GetServiceName(ServiceDescription description) { if (description.Name != null) { return description.Name; - } else if (description.RetrievalUrl != null) { + } else if (!String.IsNullOrEmpty(description.RetrievalUrl)) { Uri uri = new Uri(description.RetrievalUrl); if (uri.Segments.Length > 0) { return uri.Segments[uri.Segments.Length - 1]; diff --git a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/SymbolTypeAtCaretConditionEvaluator.cs b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/SymbolTypeAtCaretConditionEvaluator.cs index 02f9110143..defd05dddb 100644 --- a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/SymbolTypeAtCaretConditionEvaluator.cs +++ b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/SymbolTypeAtCaretConditionEvaluator.cs @@ -44,7 +44,7 @@ namespace ICSharpCode.SharpDevelop.Internal.ConditionEvaluators string typesList = condition.Properties["type"]; if (typesList != null) { foreach (string type in typesList.Split(',')) { - switch (type) { + switch (type.Trim()) { case "*": // Wildcard -> allow any type return true; diff --git a/src/Main/Base/Project/Src/Project/ProjectChangeWatcher.cs b/src/Main/Base/Project/Src/Project/ProjectChangeWatcher.cs index 29344d06c9..fb84cba889 100644 --- a/src/Main/Base/Project/Src/Project/ProjectChangeWatcher.cs +++ b/src/Main/Base/Project/Src/Project/ProjectChangeWatcher.cs @@ -172,27 +172,36 @@ namespace ICSharpCode.SharpDevelop.Project static void MainFormActivated() { - if (wasChangedExternally && !showingMessageBox) { - - if (ProjectService.OpenSolution != null) { - // Set wasChangedExternally=false only after the dialog is closed, - // so that additional changes to the project while the dialog is open - // don't cause it to appear twice. - - // The MainFormActivated event occurs when the dialog is closed before - // we get a change to set wasChangedExternally=false, so we use 'showingMessageBox' - // to prevent the dialog from appearing infititely. - showingMessageBox = true; - int result = MessageService.ShowCustomDialog(MessageService.DefaultMessageBoxTitle, "${res:ICSharpCode.SharpDevelop.Project.SolutionAlteredExternallyMessage}", 0, 1, "${res:ICSharpCode.SharpDevelop.Project.ReloadSolution}", "${res:ICSharpCode.SharpDevelop.Project.KeepOldSolution}", "${res:ICSharpCode.SharpDevelop.Project.CloseSolution}"); - showingMessageBox = false; - wasChangedExternally = false; - if (result == 0) - SD.ProjectService.OpenSolutionOrProject(ProjectService.OpenSolution.FileName); - else if (result == 2) - new CloseSolution().Run(); - } else { - wasChangedExternally = false; + if (wasChangedExternally) { + if (!showingMessageBox) { + if (ProjectService.OpenSolution != null) { + // Set wasChangedExternally=false only after the dialog is closed, + // so that additional changes to the project while the dialog is open + // don't cause it to appear twice. + + // The MainFormActivated event occurs when the dialog is closed before + // we get a change to set wasChangedExternally=false, so we use 'showingMessageBox' + // to prevent the dialog from appearing infititely. + showingMessageBox = true; + int result = MessageService.ShowCustomDialog(MessageService.DefaultMessageBoxTitle, "${res:ICSharpCode.SharpDevelop.Project.SolutionAlteredExternallyMessage}", 0, 1, "${res:ICSharpCode.SharpDevelop.Project.ReloadSolution}", "${res:ICSharpCode.SharpDevelop.Project.KeepOldSolution}", "${res:ICSharpCode.SharpDevelop.Project.CloseSolution}"); + showingMessageBox = false; + wasChangedExternally = false; + if (result == 1) { + FileChangeWatcher.AskForReload(); + } else { + FileChangeWatcher.CancelReloadQueue(); + if (result == 0) { + SD.ProjectService.OpenSolutionOrProject(ProjectService.OpenSolution.FileName); + } else { + new CloseSolution().Run(); + } + } + } else { + wasChangedExternally = false; + } } + } else { + FileChangeWatcher.AskForReload(); } } diff --git a/src/Main/Base/Project/Src/Services/ParserService/CodeCompletionOptions.cs b/src/Main/Base/Project/Src/Services/ParserService/CodeCompletionOptions.cs index b82f1bb429..730bb2ac95 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/CodeCompletionOptions.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/CodeCompletionOptions.cs @@ -63,30 +63,35 @@ namespace ICSharpCode.SharpDevelop set { properties.Set("TooltipsOnlyWhenDebugging", value); } } - public static bool KeywordCompletionEnabled { - get { return properties.Get("KeywordCompletionEnabled", true); } - set { properties.Set("KeywordCompletionEnabled", value); } - } - public static bool CompleteWhenTyping { get { return properties.Get("CompleteWhenTyping", true); } set { properties.Set("CompleteWhenTyping", value); } } + public static bool CommitOnTabEnterOnly { + get { return properties.Get("CommitOnTabEnterOnly", false); } + set { properties.Set("CommitOnTabEnterOnly", value); } + } + public static bool InsightEnabled { get { return properties.Get("InsightEnabled", true); } set { properties.Set("InsightEnabled", value); } } - public static bool InsightRefreshOnComma { - get { return properties.Get("InsightRefreshOnComma", true); } - set { properties.Set("InsightRefreshOnComma", value); } - } - public static TooltipLinkTarget TooltipLinkTarget { get { return properties.Get("TooltipLinkTarget", TooltipLinkTarget.Documentation); } set { properties.Set("TooltipLinkTarget", value); } } + + public static string CompletionCharList { + get { return properties.Get("CompletionCharList", @"{}[]().,:;+-*/%&|^!~=<>?@#'""\"); } + set { properties.Set("CompletionCharList", value); } + } + + public static bool CommitOnChar(char key) + { + return CompletionCharList.IndexOf(key) >= 0; + } } public enum TooltipLinkTarget { diff --git a/src/Main/Base/Project/WinForms/IWinFormsService.cs b/src/Main/Base/Project/WinForms/IWinFormsService.cs index 4af46757f2..1eb510550c 100644 --- a/src/Main/Base/Project/WinForms/IWinFormsService.cs +++ b/src/Main/Base/Project/WinForms/IWinFormsService.cs @@ -142,5 +142,10 @@ namespace ICSharpCode.SharpDevelop.WinForms /// /// SDWindowsFormsHost instance CustomWindowsFormsHost CreateWindowsFormsHost(IServiceProvider serviceProvider = null, bool processShortcutsInWPF = false); + + /// + /// Provides access to from Windows Forms-based AddIns. + /// + void InvalidateCommands(); } } diff --git a/src/Main/Base/Project/Workbench/AbstractViewContentHandlingLoadErrors.cs b/src/Main/Base/Project/Workbench/AbstractViewContentHandlingLoadErrors.cs index 37e20e3b2e..582fe34d29 100644 --- a/src/Main/Base/Project/Workbench/AbstractViewContentHandlingLoadErrors.cs +++ b/src/Main/Base/Project/Workbench/AbstractViewContentHandlingLoadErrors.cs @@ -40,7 +40,7 @@ namespace ICSharpCode.SharpDevelop.Workbench /// public abstract class AbstractViewContentHandlingLoadErrors : AbstractViewContent { - ContentPresenter contentControl = new ContentPresenter(); + readonly ContentPresenter contentControl = new ContentPresenter(); object userContent; protected AbstractViewContentHandlingLoadErrors() diff --git a/src/Main/Base/Project/Workbench/FileChangeWatcher.cs b/src/Main/Base/Project/Workbench/FileChangeWatcher.cs index c0c85e1859..5702fa56bc 100644 --- a/src/Main/Base/Project/Workbench/FileChangeWatcher.cs +++ b/src/Main/Base/Project/Workbench/FileChangeWatcher.cs @@ -18,10 +18,7 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; -using System.Windows.Forms; -using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.Core; namespace ICSharpCode.SharpDevelop.Workbench @@ -206,21 +203,65 @@ namespace ICSharpCode.SharpDevelop.Workbench string fileName = file.FileName; if (!File.Exists(fileName)) return; - - string message = StringParser.Parse( - "${res:ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.TextEditorDisplayBinding.FileAlteredMessage}", - new StringTagPair("File", Path.GetFullPath(fileName)) - ); - if ((AutoLoadExternalChangesOption && file.IsDirty == false) - || MessageService.AskQuestion(message, StringParser.Parse("${res:MainWindow.DialogName}"))) - { + + if (AutoLoadExternalChangesOption && !file.IsDirty) { if (File.Exists(fileName)) { file.ReloadFromDisk(); } } else { - file.MakeDirty(); + QueueFileForReloadDialog(file); + } + } + } + + #region Reload Queue + static readonly HashSet queue = new HashSet(); + static volatile bool currentlyReloading; + + static void QueueFileForReloadDialog(OpenedFile file) + { + if (file == null) + throw new ArgumentNullException("file"); + lock (queue) { + queue.Add(file); + } + } + + public static void AskForReload() + { + if (currentlyReloading) return; + currentlyReloading = true; + try { + lock (queue) { + foreach (var file in queue) { + string fileName = file.FileName; + if (!File.Exists(fileName)) + continue; + string message = StringParser.Parse( + "${res:ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.TextEditorDisplayBinding.FileAlteredMessage}", + new StringTagPair("File", Path.GetFullPath(fileName)) + ); + if (SD.MessageService.AskQuestion(message, StringParser.Parse("${res:MainWindow.DialogName}"))) { + if (File.Exists(fileName)) { + file.ReloadFromDisk(); + } + } else { + file.MakeDirty(); + } + } + queue.Clear(); } + } finally { + currentlyReloading = false; + } + } + + public static void CancelReloadQueue() + { + lock (queue) { + queue.Clear(); } } + #endregion } } diff --git a/src/Main/SharpDevelop/SharpDevelop.csproj b/src/Main/SharpDevelop/SharpDevelop.csproj index abc1ba0b2e..c28c87fe62 100644 --- a/src/Main/SharpDevelop/SharpDevelop.csproj +++ b/src/Main/SharpDevelop/SharpDevelop.csproj @@ -241,6 +241,9 @@ Resources\StringResources.resx + + StringResources.resx + Configuration\GlobalAssemblyInfo.cs.template diff --git a/src/Main/SharpDevelop/WinForms/WinFormsService.cs b/src/Main/SharpDevelop/WinForms/WinFormsService.cs index 03be27db7c..5500fea972 100644 --- a/src/Main/SharpDevelop/WinForms/WinFormsService.cs +++ b/src/Main/SharpDevelop/WinForms/WinFormsService.cs @@ -22,7 +22,6 @@ using System.Drawing.Printing; using System.Windows.Forms; using ICSharpCode.Core; using ICSharpCode.Core.WinForms; -using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Widgets; using ICSharpCode.SharpDevelop.Workbench; @@ -195,5 +194,10 @@ namespace ICSharpCode.SharpDevelop.WinForms DisposeChild = false }; } + + public void InvalidateCommands() + { + System.Windows.Input.CommandManager.InvalidateRequerySuggested(); + } } }