Browse Source

Merge branch 'master' of github.com:icsharpcode/SharpDevelop

pull/505/merge
Peter Forstmeier 11 years ago
parent
commit
1fbd20047b
  1. 19
      data/resources/StringResources.resx
  2. 2
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs
  3. 4
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs
  4. 3
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CompletionData.cs
  5. 9
      src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/AddDirectoryTestFixture.cs
  6. 1
      src/AddIns/BackendBindings/XamlBinding/XamlBinding.Tests/CodeInsertionTests.cs
  7. 4
      src/AddIns/Debugger/Debugger.AddIn/Breakpoints/BreakpointBookmark.cs
  8. 12
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin
  9. 4
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
  10. 54
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindBaseClasses.cs
  11. 8
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs
  12. 3
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetCompletionItem.cs
  13. 4
      src/AddIns/DisplayBindings/HexEditor/Project/Src/View/HexEditView.cs
  14. 2
      src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj
  15. 41
      src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceEditor.cs
  16. 52
      src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEditorDisplayBinding.cs
  17. 1
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs
  18. 10
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindow.cs
  19. 2
      src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeIssues/Synced/PracticesAndImprovements/ConvertToConstantIssue.cs
  20. 4
      src/Main/Base/Project/Editor/Bookmarks/BookmarkBase.cs
  21. 4
      src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs
  22. 5
      src/Main/Base/Project/Editor/Bookmarks/IBookmark.cs
  23. 92
      src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml
  24. 41
      src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml.cs
  25. 2
      src/Main/Base/Project/Editor/CodeCompletion/ICompletionItem.cs
  26. 20
      src/Main/Base/Project/Editor/CodeCompletion/ICompletionItemList.cs
  27. 2
      src/Main/Base/Project/Editor/ToolTipService.cs
  28. 2
      src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
  29. 6
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  30. 110
      src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml
  31. 122
      src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml.cs
  32. 36
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilCommandLine.cs
  33. 2
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilRunner.cs
  34. 4
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReferenceHelper.cs
  35. 2
      src/Main/Base/Project/Src/Internal/ConditionEvaluators/SymbolTypeAtCaretConditionEvaluator.cs
  36. 49
      src/Main/Base/Project/Src/Project/ProjectChangeWatcher.cs
  37. 25
      src/Main/Base/Project/Src/Services/ParserService/CodeCompletionOptions.cs
  38. 5
      src/Main/Base/Project/WinForms/IWinFormsService.cs
  39. 2
      src/Main/Base/Project/Workbench/AbstractViewContentHandlingLoadErrors.cs
  40. 65
      src/Main/Base/Project/Workbench/FileChangeWatcher.cs
  41. 3
      src/Main/SharpDevelop/SharpDevelop.csproj
  42. 6
      src/Main/SharpDevelop/WinForms/WinFormsService.cs

19
data/resources/StringResources.resx

@ -3789,6 +3789,10 @@ Please configure the NAnt executable's location in the SharpDevelop Options.</va
<value>Could not find type definition at the cursor position.</value> <value>Could not find type definition at the cursor position.</value>
<comment>Error message when using Search&gt;Find Base Classes when the cursor is not on a type reference.</comment> <comment>Error message when using Search&gt;Find Base Classes when the cursor is not on a type reference.</comment>
</data> </data>
<data name="ICSharpCode.Refactoring.NoClassOrMemberUnderCursorError" xml:space="preserve">
<value>Could not find type definition or type member at the cursor position.</value>
<comment>Error message when using Search&gt;Find Base Classes when the cursor is not on a type reference or type member.</comment>
</data>
<data name="ICSharpCode.RubyBinding.SendLineToRubyConsole" xml:space="preserve"> <data name="ICSharpCode.RubyBinding.SendLineToRubyConsole" xml:space="preserve">
<value>Send Line to Ruby Console</value> <value>Send Line to Ruby Console</value>
</data> </data>
@ -6473,6 +6477,9 @@ Removed the end part of the original message ", reason '${Message}'" since this
<data name="SharpDevelop.Refactoring.BaseClassesOf" xml:space="preserve"> <data name="SharpDevelop.Refactoring.BaseClassesOf" xml:space="preserve">
<value>Base classes of ${Name}</value> <value>Base classes of ${Name}</value>
</data> </data>
<data name="SharpDevelop.Refactoring.BaseMembersOf" xml:space="preserve">
<value>Base members of ${Name}</value>
</data>
<data name="SharpDevelop.Refactoring.CannotPerformOperationBecauseOfSyntaxErrors" xml:space="preserve"> <data name="SharpDevelop.Refactoring.CannotPerformOperationBecauseOfSyntaxErrors" xml:space="preserve">
<value>The operation cannot be performed because your source code contains errors:</value> <value>The operation cannot be performed because your source code contains errors:</value>
</data> </data>
@ -6525,6 +6532,9 @@ Removed the end part of the original message ", reason '${Message}'" since this
<data name="SharpDevelop.Refactoring.FindBaseClassesCommand" xml:space="preserve"> <data name="SharpDevelop.Refactoring.FindBaseClassesCommand" xml:space="preserve">
<value>Find base classes</value> <value>Find base classes</value>
</data> </data>
<data name="SharpDevelop.Refactoring.FindBaseClassesOrMembersCommand" xml:space="preserve">
<value>Find base symbols</value>
</data>
<data name="SharpDevelop.Refactoring.FindDerivedClassesCommand" xml:space="preserve"> <data name="SharpDevelop.Refactoring.FindDerivedClassesCommand" xml:space="preserve">
<value>Find &amp;derived classes</value> <value>Find &amp;derived classes</value>
</data> </data>
@ -8182,4 +8192,13 @@ Error while starting:
<value>This resource is not being used. Its purpose is to test the translation database and has <value>This resource is not being used. Its purpose is to test the translation database and has
a line break</value> a line break</value>
</data> </data>
<data name="Dialog.Options.IDEOptions.CodeCompletion.TooltipLabel" xml:space="preserve">
<value>Tooltip settings</value>
</data>
<data name="Dialog.Options.IDEOptions.CodeCompletion.CommitOnCharacters" xml:space="preserve">
<value>Insert selected code completion entry by typing the following characters:</value>
</data>
<data name="Dialog.Options.IDEOptions.CodeCompletion.CommitOnTabEnterOnly" xml:space="preserve">
<value>Only insert selected code completion entry by typing &lt;Tab&gt; or &lt;Enter&gt;.</value>
</data>
</root> </root>

2
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs

@ -74,7 +74,7 @@ namespace CSharpBinding
return ""; return "";
var builder = new TypeSystemAstBuilder(); var builder = new TypeSystemAstBuilder();
MethodDeclaration decl; MethodDeclaration decl;
if (member is IMethod) { if (member.SymbolKind == SymbolKind.Method) {
// If it's a method, convert it directly (including parameters + type parameters) // If it's a method, convert it directly (including parameters + type parameters)
decl = (MethodDeclaration)builder.ConvertEntity(member); decl = (MethodDeclaration)builder.ConvertEntity(member);
} else { } else {

4
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs

@ -18,6 +18,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using ICSharpCode.Core; using ICSharpCode.Core;
@ -115,6 +116,7 @@ namespace CSharpBinding.Completion
} else { } else {
startPos = caretOffset; startPos = caretOffset;
if (char.IsLetterOrDigit (completionChar) || completionChar == '_') { if (char.IsLetterOrDigit (completionChar) || completionChar == '_') {
if (!CodeCompletionOptions.CompleteWhenTyping) return false;
if (startPos > 1 && char.IsLetterOrDigit (completionContext.Document.GetCharAt (startPos - 2))) if (startPos > 1 && char.IsLetterOrDigit (completionContext.Document.GetCharAt (startPos - 2)))
return false; return false;
completionData = cce.GetCompletionData(startPos, false); completionData = cce.GetCompletionData(startPos, false);
@ -137,7 +139,7 @@ namespace CSharpBinding.Completion
return true; return true;
} }
if (!ctrlSpace) { if (CodeCompletionOptions.InsightEnabled && !ctrlSpace) {
// Method Insight // Method Insight
var pce = new CSharpParameterCompletionEngine( var pce = new CSharpParameterCompletionEngine(
completionContext.Document, completionContext.Document,

3
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CompletionData.cs

@ -78,13 +78,14 @@ namespace CSharpBinding.Completion
public IImage Image { get; set; } public IImage Image { get; set; }
public virtual double Priority { public virtual double Priority {
get { return 0; } get { return CodeCompletionDataUsageCache.GetPriority(DisplayText, true); }
} }
public virtual void Complete(CompletionContext context) public virtual void Complete(CompletionContext context)
{ {
context.Editor.Document.Replace(context.StartOffset, context.Length, this.CompletionText); context.Editor.Document.Replace(context.StartOffset, context.Length, this.CompletionText);
context.EndOffset = context.StartOffset + this.CompletionText.Length; context.EndOffset = context.StartOffset + this.CompletionText.Length;
CodeCompletionDataUsageCache.IncrementUsage(DisplayText);
} }
object fancyContent; object fancyContent;

9
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 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using ICSharpCode.SharpDevelop.Project; using System;
using ICSharpCode.SharpDevelop;
using ICSharpCode.WixBinding; using ICSharpCode.WixBinding;
using NUnit.Framework; 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.PackageFiles;
using WixBinding.Tests.Utils;
namespace WixBinding.Tests.DirectoryImport namespace WixBinding.Tests.DirectoryImport
{ {

1
src/AddIns/BackendBindings/XamlBinding/XamlBinding.Tests/CodeInsertionTests.cs

@ -21,6 +21,7 @@ using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion; using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
using NUnit.Framework; using NUnit.Framework;

4
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); return string.Format("{0} @{1}", this.FileName, this.LineNumber);
} }
public override bool DisplaysTooltip {
get { return true; }
}
public override object CreateTooltipContent() public override object CreateTooltipContent()
{ {
return new BreakpointEditorPopup(this) { return new BreakpointEditorPopup(this) {

12
src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin

@ -149,20 +149,20 @@
icon="Icons.16x16.Class" icon="Icons.16x16.Class"
class = "ICSharpCode.AvalonEdit.AddIn.ContextActions.FindDerivedClassesOrOverrides"/> class = "ICSharpCode.AvalonEdit.AddIn.ContextActions.FindDerivedClassesOrOverrides"/>
<MenuItem id = "FindBaseClasses" <MenuItem id = "FindBaseClassesOrMembers"
label = "${res:SharpDevelop.Refactoring.FindBaseClassesCommand}" label = "${res:SharpDevelop.Refactoring.FindBaseClassesOrMembersCommand}"
icon="Icons.16x16.Interface" icon="Icons.16x16.Interface"
class = "ICSharpCode.AvalonEdit.AddIn.ContextActions.FindBaseClasses"/> class = "ICSharpCode.AvalonEdit.AddIn.ContextActions.FindBaseClassesOrMembers"/>
</Path> </Path>
<Path name = "/SharpDevelop/EntityContextMenu"> <Path name = "/SharpDevelop/EntityContextMenu">
<Condition name="SymbolTypeAtCaret" type="type" action="Exclude"> <Condition name="SymbolTypeAtCaret" type="type,member" action="Exclude">
<Include id="FindDerivedOrOverridesClasses" <Include id="FindDerivedOrOverridesClasses"
insertafter="FindReferences" insertafter="FindReferences"
item="/SharpDevelop/Workbench/MainMenu/Search/FindDerivedOrOverridesClasses" /> item="/SharpDevelop/Workbench/MainMenu/Search/FindDerivedOrOverridesClasses" />
<Include id="FindBaseClasses" <Include id="FindBaseClassesOrMembers"
insertafter="FindDerivedOrOverridesClasses" insertafter="FindDerivedOrOverridesClasses"
item="/SharpDevelop/Workbench/MainMenu/Search/FindBaseClasses" /> item="/SharpDevelop/Workbench/MainMenu/Search/FindBaseClassesOrMembers" />
</Condition> </Condition>
</Path> </Path>

4
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(); SD.ParserService.ParseAsync(this.FileName, this.Document.CreateSnapshot()).FireAndForget();
} else { } else {
if (e.Text.Length == 1) { if (e.Text.Length == 1) {
// disable all code completion bindings when CC is disabled
if (!CodeCompletionOptions.EnableCodeCompletion)
return;
foreach (ICodeCompletionBinding cc in CodeCompletionBindings) { foreach (ICodeCompletionBinding cc in CodeCompletionBindings) {
if (cc.HandleKeyPressed(adapter, c)) if (cc.HandleKeyPressed(adapter, c))
break; break;

54
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindBaseClasses.cs

@ -31,16 +31,20 @@ using ICSharpCode.SharpDevelop.Editor.ContextActions;
namespace ICSharpCode.AvalonEdit.AddIn.ContextActions namespace ICSharpCode.AvalonEdit.AddIn.ContextActions
{ {
public class FindBaseClasses : ResolveResultMenuCommand public class FindBaseClassesOrMembers : ResolveResultMenuCommand
{ {
public override void Run(ResolveResult symbol) public override void Run(ResolveResult symbol)
{ {
IEntity entityUnderCaret = GetSymbol(symbol) as IEntity; IEntity entityUnderCaret = GetSymbol(symbol) as IEntity;
if (entityUnderCaret is ITypeDefinition) { if (entityUnderCaret is ITypeDefinition) {
MakePopupWithBaseClasses((ITypeDefinition)entityUnderCaret).OpenAtCaretAndFocus(); MakePopupWithBaseClasses((ITypeDefinition)entityUnderCaret).OpenAtCaretAndFocus();
} else { return;
MessageService.ShowError("${res:ICSharpCode.Refactoring.NoClassUnderCursorError}");
} }
if (entityUnderCaret is IMember) {
MakePopupWithBaseMembers((IMember)entityUnderCaret).OpenAtCaretAndFocus();
return;
}
MessageService.ShowError("${res:ICSharpCode.Refactoring.NoClassOrMemberUnderCursorError}");
} }
static ContextActionsPopup MakePopupWithBaseClasses(ITypeDefinition @class) static ContextActionsPopup MakePopupWithBaseClasses(ITypeDefinition @class)
@ -49,14 +53,54 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions
var popupViewModel = new ContextActionsPopupViewModel(); var popupViewModel = new ContextActionsPopupViewModel();
popupViewModel.Title = MenuService.ConvertLabel(StringParser.Parse( popupViewModel.Title = MenuService.ConvertLabel(StringParser.Parse(
"${res:SharpDevelop.Refactoring.BaseClassesOf}", new StringTagPair("Name", @class.Name))); "${res:SharpDevelop.Refactoring.BaseClassesOf}", new StringTagPair("Name", @class.Name)));
popupViewModel.Actions = BuildListViewModel(baseClassList); popupViewModel.Actions = BuildBaseClassListViewModel(baseClassList);
return new ContextActionsPopup { Actions = popupViewModel }; return new ContextActionsPopup { Actions = popupViewModel };
} }
static ObservableCollection<ContextActionViewModel> BuildListViewModel(IEnumerable<ITypeDefinition> classList) static ObservableCollection<ContextActionViewModel> BuildBaseClassListViewModel(IEnumerable<ITypeDefinition> classList)
{ {
return new ObservableCollection<ContextActionViewModel>( return new ObservableCollection<ContextActionViewModel>(
classList.Select(@class => GoToEntityAction.MakeViewModel(@class, null))); 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<ContextActionViewModel> BuildBaseMemberListViewModel(IMember member)
{
var c = new ObservableCollection<ContextActionViewModel>();
ObservableCollection<ContextActionViewModel> 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<ContextActionViewModel>();
lastBase.Add(GoToEntityAction.MakeViewModel(baseMember, newChild));
lastBase = newChild;
} else {
thisMember = null;
}
}
thisMember = baseMember;
}
return c;
}
#endregion
} }
} }

8
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs

@ -19,6 +19,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Controls.Primitives; using System.Windows.Controls.Primitives;
@ -286,7 +287,10 @@ namespace ICSharpCode.AvalonEdit.AddIn
int line = GetLineFromMousePosition(e); int line = GetLineFromMousePosition(e);
if (line < 1) return; 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; if (bm == null) return;
object content = bm.CreateTooltipContent(); object content = bm.CreateTooltipContent();
popupToolTip = content as Popup; popupToolTip = content as Popup;
@ -301,7 +305,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
e.Handled = true; e.Handled = true;
popupToolTip.IsOpen = true; popupToolTip.IsOpen = true;
distanceToPopupLimit = double.PositiveInfinity; // reset limit; we'll re-calculate it on the next mouse movement distanceToPopupLimit = double.PositiveInfinity; // reset limit; we'll re-calculate it on the next mouse movement
} else { } else if (content != null) {
if (toolTip == null) { if (toolTip == null) {
toolTip = new ToolTip(); toolTip = new ToolTip();
toolTip.Closed += ToolTipClosed; toolTip.Closed += ToolTipClosed;

3
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetCompletionItem.cs

@ -49,8 +49,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets
if (textArea == null) if (textArea == null)
throw new ArgumentException("textEditor must be an AvalonEdit text editor"); throw new ArgumentException("textEditor must be an AvalonEdit text editor");
this.codeSnippet = codeSnippet; this.codeSnippet = codeSnippet;
this.Priority = CodeCompletionDataUsageCache.GetPriority("snippet" + codeSnippet.Name, true);
//this.Priority = CodeCompletionDataUsageCache.GetPriority("snippet" + codeSnippet.Name, true);
} }
public bool AlwaysInsertSnippet { get; set; } public bool AlwaysInsertSnippet { get; set; }

4
src/AddIns/DisplayBindings/HexEditor/Project/Src/View/HexEditView.cs

@ -136,12 +136,12 @@ namespace HexEditor.View
void DocumentChanged(object sender, EventArgs e) void DocumentChanged(object sender, EventArgs e)
{ {
if (PrimaryFile != null) PrimaryFile.MakeDirty(); if (PrimaryFile != null) PrimaryFile.MakeDirty();
CommandManager.InvalidateRequerySuggested(); SD.WinForms.InvalidateCommands();
} }
void SelectionChanged(object sender, System.EventArgs e) void SelectionChanged(object sender, System.EventArgs e)
{ {
CommandManager.InvalidateRequerySuggested(); SD.WinForms.InvalidateCommands();
} }
} }
} }

2
src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj

@ -54,7 +54,7 @@
<Compile Include="Src\Commands\EditCommentCommand.cs" /> <Compile Include="Src\Commands\EditCommentCommand.cs" />
<Compile Include="Src\Commands\RenameEntryCommand.cs" /> <Compile Include="Src\Commands\RenameEntryCommand.cs" />
<Compile Include="Src\Commands\SaveEntryAsCommand.cs" /> <Compile Include="Src\Commands\SaveEntryAsCommand.cs" />
<Compile Include="Src\DisplayDefinition.cs" /> <Compile Include="Src\ResourceEditorDisplayBinding.cs" />
<Compile Include="Src\ResourceEdit\AbstractImageView.cs"> <Compile Include="Src\ResourceEdit\AbstractImageView.cs">
<SubType>Component</SubType> <SubType>Component</SubType>
</Compile> </Compile>

41
src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceEditor.cs

@ -21,6 +21,7 @@ using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.WinForms;
namespace ResourceEditor namespace ResourceEditor
{ {
@ -39,7 +40,7 @@ namespace ResourceEditor
protected ListViewViewState internalState = ListViewViewState.Nothing; protected ListViewViewState internalState = ListViewViewState.Nothing;
public System.Enum InternalState { public Enum InternalState {
get { get {
return internalState; return internalState;
} }
@ -55,14 +56,14 @@ namespace ResourceEditor
public ResourceEditorControl() public ResourceEditorControl()
{ {
InitializeComponent(); 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) { if(resourceList.SelectedItems.Count == 0) {
internalState = ListViewViewState.Nothing; internalState = ListViewViewState.Nothing;
showResource(null); ShowResource(null);
} else { } else {
internalState = ListViewViewState.ItemsSelected; internalState = ListViewViewState.ItemsSelected;
} }
@ -72,7 +73,7 @@ namespace ResourceEditor
} }
object key = resourceList.SelectedItems[0].Text; object key = resourceList.SelectedItems[0].Text;
ResourceItem item = (ResourceItem)resourceList.Resources[key.ToString()]; ResourceItem item = (ResourceItem)resourceList.Resources[key.ToString()];
showResource(item); ShowResource(item);
} }
void InitializeComponent() void InitializeComponent()
@ -92,17 +93,17 @@ namespace ResourceEditor
Controls.Add(splitter); Controls.Add(splitter);
Controls.Add(resourceList); 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); 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) { if(panel.Controls.Count == 1) {
Control control = panel.Controls[0]; Control control = panel.Controls[0];
panel.Controls.Remove(control); panel.Controls.Remove(control);
@ -114,41 +115,41 @@ namespace ResourceEditor
panel.Controls.Add(viewer); panel.Controls.Add(viewer);
currentView = (IResourceView)viewer; currentView = (IResourceView)viewer;
currentView.WriteProtected = resourceList.WriteProtected; 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); resourceList.SetResourceValue(e.ResourceName, e.ResourceValue);
} }
void showResource(ResourceItem item) void ShowResource(ResourceItem item)
{ {
if(item == null) { if(item == null) {
showView(null); ShowView(null);
return; return;
} }
if (item.ResourceValue is Icon) { if (item.ResourceValue is Icon) {
IconView iv = new IconView(item); IconView iv = new IconView(item);
showView(iv); ShowView(iv);
} else if(item.ResourceValue is Bitmap) { } else if(item.ResourceValue is Bitmap) {
BitmapView bv = new BitmapView(item); BitmapView bv = new BitmapView(item);
showView(bv); ShowView(bv);
} else if(item.ResourceValue is Cursor) { } else if(item.ResourceValue is Cursor) {
CursorView cv = new CursorView(item); CursorView cv = new CursorView(item);
showView(cv); ShowView(cv);
} else if(item.ResourceValue is string) { } else if(item.ResourceValue is string) {
TextView tv = new TextView(item); TextView tv = new TextView(item);
showView(tv); ShowView(tv);
} else if(item.ResourceValue is byte[]) { } else if(item.ResourceValue is byte[]) {
BinaryView bv = new BinaryView(item); BinaryView bv = new BinaryView(item);
showView(bv); ShowView(bv);
} else if(item.ResourceValue is bool) { } else if(item.ResourceValue is bool) {
BooleanView bv = new BooleanView(item); BooleanView bv = new BooleanView(item);
showView(bv); ShowView(bv);
} else { } else {
showView(null); ShowView(null);
} }
} }

52
src/AddIns/DisplayBindings/ResourceEditor/Project/Src/DisplayDefinition.cs → src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEditorDisplayBinding.cs

@ -32,7 +32,6 @@ namespace ResourceEditor
{ {
public class ResourceEditorDisplayBinding : IDisplayBinding public class ResourceEditorDisplayBinding : IDisplayBinding
{ {
// IDisplayBinding interface
public bool CanCreateContentForFile(FileName fileName) public bool CanCreateContentForFile(FileName fileName)
{ {
return true; // definition in .addin does extension-based filtering return true; // definition in .addin does extension-based filtering
@ -54,9 +53,6 @@ namespace ResourceEditor
} }
} }
/// <summary>
/// This class describes the main functionality of a language codon
/// </summary>
public class ResourceEditWrapper : AbstractViewContentHandlingLoadErrors, IClipboardHandler public class ResourceEditWrapper : AbstractViewContentHandlingLoadErrors, IClipboardHandler
{ {
ResourceEditorControl resourceEditor = new ResourceEditorControl(); ResourceEditorControl resourceEditor = new ResourceEditorControl();
@ -73,14 +69,16 @@ namespace ResourceEditor
void SetDirty(object sender, EventArgs e) void SetDirty(object sender, EventArgs e)
{ {
this.PrimaryFile.MakeDirty(); PrimaryFile.MakeDirty();
SD.WinForms.InvalidateCommands();
} }
public ResourceEditWrapper(OpenedFile file) public ResourceEditWrapper(OpenedFile file)
{ {
this.TabPageText = "Resource editor"; this.TabPageText = "Resource editor";
base.UserContent = resourceEditor; UserContent = resourceEditor;
resourceEditor.ResourceList.Changed += new EventHandler(SetDirty); resourceEditor.ResourceList.Changed += SetDirty;
resourceEditor.ResourceList.ItemSelectionChanged += (sender, e) => SD.WinForms.InvalidateCommands();
this.Files.Add(file); this.Files.Add(file);
} }
@ -104,7 +102,7 @@ namespace ResourceEditor
public bool EnableCut public bool EnableCut
{ {
get { get {
if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { if (resourceEditor.ResourceList.IsEditing) {
return false; return false;
} }
return resourceEditor.ResourceList.SelectedItems.Count > 0; return resourceEditor.ResourceList.SelectedItems.Count > 0;
@ -114,7 +112,7 @@ namespace ResourceEditor
public bool EnableCopy public bool EnableCopy
{ {
get { get {
if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { if (resourceEditor.ResourceList.IsEditing) {
return false; return false;
} }
return resourceEditor.ResourceList.SelectedItems.Count > 0; return resourceEditor.ResourceList.SelectedItems.Count > 0;
@ -124,7 +122,7 @@ namespace ResourceEditor
public bool EnablePaste public bool EnablePaste
{ {
get { get {
if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { if (resourceEditor.ResourceList.IsEditing) {
return false; return false;
} }
return true; return true;
@ -134,7 +132,7 @@ namespace ResourceEditor
public bool EnableDelete public bool EnableDelete
{ {
get { get {
if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { if (resourceEditor.ResourceList.IsEditing) {
return false; return false;
} }
return resourceEditor.ResourceList.SelectedItems.Count > 0; return resourceEditor.ResourceList.SelectedItems.Count > 0;
@ -144,7 +142,7 @@ namespace ResourceEditor
public bool EnableSelectAll public bool EnableSelectAll
{ {
get { get {
if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { if (resourceEditor.ResourceList.IsEditing) {
return false; return false;
} }
return true; return true;
@ -241,33 +239,17 @@ namespace ResourceEditor
public void Delete() public void Delete()
{ {
if (resourceEditor.ResourceList.WriteProtected) { var resourceList = resourceEditor.ResourceList;
if (resourceList.WriteProtected || resourceList.SelectedItems.Count == 0)
return; return;
} if (!SD.MessageService.AskQuestion("${res:ResourceEditor.DeleteEntry.Confirm}", "${res:ResourceEditor.DeleteEntry.Title}"))
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) {
return; return;
}
foreach (ListViewItem item in resourceEditor.ResourceList.SelectedItems) { foreach (ListViewItem item in resourceList.SelectedItems) {
//// not clear why this check is present here - seems to be extra resourceList.Resources.Remove(item.Text);
////if (item.Text != null) { resourceList.Items.Remove(item);
resourceEditor.ResourceList.Resources.Remove(item.Text);
resourceEditor.ResourceList.Items.Remove(item);
// and set dirty flag // and set dirty flag
resourceEditor.ResourceList.OnChanged(); resourceList.OnChanged();
} }
} }

1
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs

@ -200,6 +200,7 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion
if (listBox == null && value != null) if (listBox == null && value != null)
ApplyTemplate(); ApplyTemplate();
listBox.SelectedItem = value; listBox.SelectedItem = value;
listBox.ScrollIntoView(value);
} }
} }

10
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindow.cs

@ -17,13 +17,10 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System; using System;
using System.Diagnostics;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Controls.Primitives; using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Threading;
using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Editing; using ICSharpCode.AvalonEdit.Editing;
@ -67,6 +64,8 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion
} }
#region ToolTip handling #region ToolTip handling
public bool ShowDocumentationTooltips { get; set; }
void toolTip_Closed(object sender, RoutedEventArgs e) void toolTip_Closed(object sender, RoutedEventArgs e)
{ {
// Clear content after tooltip is closed. // Clear content after tooltip is closed.
@ -78,6 +77,11 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion
void completionList_SelectionChanged(object sender, SelectionChangedEventArgs e) void completionList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{ {
if (!ShowDocumentationTooltips) {
toolTip.IsOpen = false;
return;
}
var item = completionList.SelectedItem; var item = completionList.SelectedItem;
if (item == null) if (item == null)
return; return;

2
src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeIssues/Synced/PracticesAndImprovements/ConvertToConstantIssue.cs

@ -180,7 +180,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
return; return;
var returnTypeRR = ctx.Resolve(varDecl.Type); var returnTypeRR = ctx.Resolve(varDecl.Type);
if (returnTypeRR.Type.IsReferenceType.HasValue && returnTypeRR.Type.IsReferenceType.Value) if (!IsValidConstType(returnTypeRR.Type))
return; return;
var variable = varDecl.Variables.First(); var variable = varDecl.Variables.First();

4
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() public virtual object CreateTooltipContent()
{ {
return null; return null;

4
src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs

@ -98,6 +98,10 @@ namespace ICSharpCode.SharpDevelop.Editor.Bookmarks
throw new NotSupportedException(); throw new NotSupportedException();
} }
bool IBookmark.DisplaysTooltip {
get { return false; }
}
object IBookmark.CreateTooltipContent() object IBookmark.CreateTooltipContent()
{ {
return null; return null;

5
src/Main/Base/Project/Editor/Bookmarks/IBookmark.cs

@ -61,6 +61,11 @@ namespace ICSharpCode.SharpDevelop.Editor.Bookmarks
/// </summary> /// </summary>
void Drop(int lineNumber); void Drop(int lineNumber);
/// <summary>
/// Gets whether this bookmark might want to display a tooltip.
/// </summary>
bool DisplaysTooltip { get; }
/// <summary> /// <summary>
/// Creates the tooltip content for the bookmark. /// Creates the tooltip content for the bookmark.
/// </summary> /// </summary>

92
src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml

@ -0,0 +1,92 @@
<gui:OptionPanel x:Class="ICSharpCode.SharpDevelop.Editor.CodeCompletion.CodeCompletionOptionPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:core="http://icsharpcode.net/sharpdevelop/core"
xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui"
xmlns:sd="clr-namespace:ICSharpCode.SharpDevelop"
xmlns:widgets="clr-namespace:ICSharpCode.SharpDevelop.Widgets;assembly=ICSharpCode.SharpDevelop.Widgets">
<widgets:StackPanelWithSpacing SpaceBetweenItems="5">
<GroupBox
Margin="5">
<GroupBox.Header>
<CheckBox
VerticalAlignment="Center"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.CodeCompletionCheckBox}"
IsChecked="{core:OptionBinding sd:CodeCompletionOptions.EnableCodeCompletion}"
x:Name="checkEnableCodeCompletion" />
</GroupBox.Header>
<widgets:StackPanelWithSpacing SpaceBetweenItems="10" IsEnabled="{Binding IsChecked, ElementName=checkEnableCodeCompletion}">
<TextBlock
Text="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.LanguageDependend}"
TextWrapping="Wrap"/>
<CheckBox
IsChecked="{core:OptionBinding sd:CodeCompletionOptions.CompleteWhenTyping}"
Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.CompleteWhenTyping}"/>
<CheckBox
IsChecked="{core:OptionBinding sd:CodeCompletionOptions.CommitOnTabEnterOnly}"
Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.CommitOnTabEnterOnly}"/>
<TextBlock
Text="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.CommitOnCharacters}"
TextWrapping="Wrap"/>
<TextBox
Text="{core:OptionBinding sd:CodeCompletionOptions.CompletionCharList}"/>
<CheckBox Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.UseDataUsageCache}"
x:Name="checkUseDataUsageCache"
IsChecked="{core:OptionBinding sd:CodeCompletionOptions.DataUsageCacheEnabled}"/>
<widgets:StackPanelWithSpacing SpaceBetweenItems="4" Margin="30,0,0,0"
Orientation="Horizontal" IsEnabled="{Binding IsChecked, ElementName=checkUseDataUsageCache}">
<Label Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.SaveItemCountBeforeNumber}"/>
<widgets:NumericUpDown MinWidth="50"
Minimum="50" Maximum="10000" SmallChange="50"
Value="{core:OptionBinding sd:CodeCompletionOptions.DataUsageCacheItemCount}"/>
<Label Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.SaveItemCountAfterNumber}"/>
<Button
Style="{x:Static core:GlobalStyles.ButtonStyle}"
Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.ClearCache}"
Click="Button_Click"/>
</widgets:StackPanelWithSpacing>
</widgets:StackPanelWithSpacing>
</GroupBox>
<GroupBox Header="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.TooltipLabel}" Margin="5">
<widgets:StackPanelWithSpacing SpaceBetweenItems="10">
<CheckBox
Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.UseTooltips}"
x:Name="checkUseTooltips"
IsChecked="{core:OptionBinding sd:CodeCompletionOptions.TooltipsEnabled}" />
<CheckBox
Margin="30,0,0,0"
IsChecked="{core:OptionBinding sd:CodeCompletionOptions.TooltipsOnlyWhenDebugging}"
Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.UseDebugTooltipsOnly}"
IsEnabled="{Binding IsChecked, ElementName=checkUseTooltips}" />
<CheckBox
VerticalAlignment="Center"
x:Name="checkUseInsight"
Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.UseInsight}"
IsChecked="{core:OptionBinding sd:CodeCompletionOptions.InsightEnabled}" />
<StackPanel Grid.Row="9" Orientation="Horizontal" Margin="0,10">
<TextBlock Text="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.TooltipLinkTarget}" Margin="0,2,5,0" />
<ComboBox
sd:EnumBinding.EnumType="{x:Type sd:TooltipLinkTarget}"
SelectedValue="{core:OptionBinding sd:CodeCompletionOptions.TooltipLinkTarget}" />
</StackPanel>
</widgets:StackPanelWithSpacing>
</GroupBox>
</widgets:StackPanelWithSpacing>
</gui:OptionPanel>

41
src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml.cs

@ -0,0 +1,41 @@
// 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.SharpDevelop.Gui;
namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
{
/// <summary>
/// Interaction logic for CodeCompletionOptionPanel.xaml
/// </summary>
public partial class CodeCompletionOptionPanel : OptionPanel
{
public CodeCompletionOptionPanel()
{
InitializeComponent();
this.DataContext = this;
}
void Button_Click(object sender, RoutedEventArgs e)
{
CodeCompletionDataUsageCache.ResetCache();
}
}
}

2
src/Main/Base/Project/Editor/CodeCompletion/ICompletionItem.cs

@ -61,7 +61,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
public virtual string Description { get; set; } public virtual string Description { get; set; }
public virtual IImage Image { get; set; } public virtual IImage Image { get; set; }
public virtual double Priority { get { return 0; } } public virtual double Priority { get; protected set; }
public DefaultCompletionItem(string text) public DefaultCompletionItem(string text)
{ {

20
src/Main/Base/Project/Editor/CodeCompletion/ICompletionItemList.cs

@ -138,16 +138,20 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
/// <inheritdoc/> /// <inheritdoc/>
public virtual CompletionItemListKeyResult ProcessInput(char key) public virtual CompletionItemListKeyResult ProcessInput(char key)
{ {
if (key == ' ' && this.InsertSpace) { if (char.IsLetterOrDigit(key) || key == '_') {
this.InsertSpace = false; // insert space only once InsertSpace = false; // don't insert space if user types normally
return CompletionItemListKeyResult.BeforeStartKey;
} else if (char.IsLetterOrDigit(key) || key == '_') {
this.InsertSpace = false; // don't insert space if user types normally
return CompletionItemListKeyResult.NormalKey; return CompletionItemListKeyResult.NormalKey;
} else {
// do not reset insertSpace when doing an insertion!
return CompletionItemListKeyResult.InsertionKey;
} }
if (key == ' ' && InsertSpace) {
InsertSpace = false;
// insert space only once
return CompletionItemListKeyResult.BeforeStartKey;
}
if (CodeCompletionOptions.CommitOnTabEnterOnly || !CodeCompletionOptions.CommitOnChar(key)) {
return CompletionItemListKeyResult.Cancel;
}
// do not reset insertSpace when doing an insertion!
return CompletionItemListKeyResult.InsertionKey;
} }
/// <inheritdoc/> /// <inheritdoc/>

2
src/Main/Base/Project/Editor/ToolTipService.cs

@ -41,7 +41,7 @@ namespace ICSharpCode.SharpDevelop.Editor
if (e == null) if (e == null)
throw new ArgumentNullException("e"); throw new ArgumentNullException("e");
if (!CodeCompletionOptions.EnableCodeCompletion || !CodeCompletionOptions.TooltipsEnabled) { if (!CodeCompletionOptions.TooltipsEnabled) {
e.Handled = true; e.Handled = true;
return; return;
} }

2
src/Main/Base/Project/ICSharpCode.SharpDevelop.addin

@ -2178,7 +2178,7 @@
<OptionPanel id = "CodeCompletion" <OptionPanel id = "CodeCompletion"
insertafter="Behavior" insertafter="Behavior"
label = "${res:Dialog.Options.IDEOptions.TextEditor.CodeCompletion.PanelName}" label = "${res:Dialog.Options.IDEOptions.TextEditor.CodeCompletion.PanelName}"
class = "ICSharpCode.SharpDevelop.Editor.CodeCompletion.CodeCompletionPanel"/> class = "ICSharpCode.SharpDevelop.Editor.CodeCompletion.CodeCompletionOptionPanel"/>
</Path> </Path>
<Path name = "/SharpDevelop/Pads/BookmarkPad/Toolbar"> <Path name = "/SharpDevelop/Pads/BookmarkPad/Toolbar">

6
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -140,6 +140,9 @@
<Compile Include="Editor\Bookmarks\IBookmarkMargin.cs" /> <Compile Include="Editor\Bookmarks\IBookmarkMargin.cs" />
<Compile Include="Editor\Bookmarks\SDBookmark.cs" /> <Compile Include="Editor\Bookmarks\SDBookmark.cs" />
<Compile Include="Editor\Bookmarks\SDMarkerBookmark.cs" /> <Compile Include="Editor\Bookmarks\SDMarkerBookmark.cs" />
<Compile Include="Editor\CodeCompletion\CodeCompletionOptionPanel.xaml.cs">
<DependentUpon>CodeCompletionOptionPanel.xaml</DependentUpon>
</Compile>
<Compile Include="Editor\CodeCompletion\Images\CompletionImage.cs" /> <Compile Include="Editor\CodeCompletion\Images\CompletionImage.cs" />
<Compile Include="Editor\CodeCompletion\SnippetCompletionData.cs" /> <Compile Include="Editor\CodeCompletion\SnippetCompletionData.cs" />
<Compile Include="Editor\ContextActions\ContextActionsPopupViewModel.cs" /> <Compile Include="Editor\ContextActions\ContextActionsPopupViewModel.cs" />
@ -228,7 +231,6 @@
<Compile Include="Src\Commands\SharpDevelopRoutedCommands.cs" /> <Compile Include="Src\Commands\SharpDevelopRoutedCommands.cs" />
<Compile Include="Src\Commands\ViewInBrowser.cs" /> <Compile Include="Src\Commands\ViewInBrowser.cs" />
<Compile Include="Src\Editor\AvalonEdit\IndentationStrategyAdapter.cs" /> <Compile Include="Src\Editor\AvalonEdit\IndentationStrategyAdapter.cs" />
<Compile Include="Src\Editor\CodeCompletion\CodeCompletionPanelXaml.xaml.cs" />
<Compile Include="Src\Editor\Commands\ClassBookmarkSubmenuBuilder.cs" /> <Compile Include="Src\Editor\Commands\ClassBookmarkSubmenuBuilder.cs" />
<Compile Include="Src\Editor\Commands\ClassMemberMenuBuilder.cs" /> <Compile Include="Src\Editor\Commands\ClassMemberMenuBuilder.cs" />
<Compile Include="Src\Editor\Commands\DeclaringTypeSubMenuBuilder.cs" /> <Compile Include="Src\Editor\Commands\DeclaringTypeSubMenuBuilder.cs" />
@ -890,7 +892,7 @@
<Folder Include="Project\Configuration" /> <Folder Include="Project\Configuration" />
<Folder Include="Workbench\DisplayBinding" /> <Folder Include="Workbench\DisplayBinding" />
<Page Include="Editor\Bookmarks\BookmarkPadContent.xaml" /> <Page Include="Editor\Bookmarks\BookmarkPadContent.xaml" />
<Page Include="Src\Editor\CodeCompletion\CodeCompletionPanelXaml.xaml" /> <Page Include="Editor\CodeCompletion\CodeCompletionOptionPanel.xaml" />
<Page Include="Src\Editor\Dialogs\RenameSymbolDialog.xaml" /> <Page Include="Src\Editor\Dialogs\RenameSymbolDialog.xaml" />
<Page Include="Src\Gui\Components\FontSelector.xaml" /> <Page Include="Src\Gui\Components\FontSelector.xaml" />
<Page Include="Src\Gui\Components\StringListEditorDialog.xaml" /> <Page Include="Src\Gui\Components\StringListEditorDialog.xaml" />

110
src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml

@ -1,110 +0,0 @@
<gui:OptionPanel x:Class="ICSharpCode.SharpDevelop.Editor.CodeCompletion.CodeCompletionPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:core="http://icsharpcode.net/sharpdevelop/core"
xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui"
xmlns:sd="clr-namespace:ICSharpCode.SharpDevelop"
xmlns:widgets="clr-namespace:ICSharpCode.SharpDevelop.Widgets;assembly=ICSharpCode.SharpDevelop.Widgets">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock
Margin="0,0,0,5"
Text="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.MainOption}"
TextWrapping="Wrap"
VerticalAlignment="Center"/>
<CheckBox Grid.Row="1" VerticalAlignment="Center"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.General.CodeCompletionCheckBox}"
IsChecked="{Binding EnableCodeCompletion}">
</CheckBox>
<GroupBox Grid.Row="2" Margin="0,8,0,0"
Header="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.DetailSettings}"
IsEnabled="{Binding EnableCodeCompletion}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="25"></RowDefinition>
<RowDefinition Height="25"></RowDefinition>
<RowDefinition Height="25"></RowDefinition>
<RowDefinition Height="25"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="25"></RowDefinition>
<RowDefinition Height="25"></RowDefinition>
<RowDefinition Height="25"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<CheckBox Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.UseDataUsageCache}"
IsChecked="{Binding UseDataUsageCache}">
</CheckBox>
<widgets:StackPanelWithSpacing Grid.Row="1" SpaceBetweenItems="4" Margin="30,0,0,0"
Orientation="Horizontal" IsEnabled="{Binding UseDataUsageCache}">
<Label Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.SaveItemCountBeforeNumber}"></Label>
<widgets:NumericUpDown MinWidth="50"
Minimum="50" Maximum="10000" SmallChange="50" IsEnabled="{Binding UseDataUsageCache}"
Value="{Binding DataUsageCacheItemCount}">
</widgets:NumericUpDown>
<Label Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.SaveItemCountAfterNumber}"></Label>
<Button Style="{x:Static core:GlobalStyles.ButtonStyle}"
Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.ClearCache}"
Click="Button_Click">
</Button>
</widgets:StackPanelWithSpacing>
<CheckBox Grid.Row="2"
Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.UseTooltips}"
IsChecked="{Binding UseTooltips}">
</CheckBox>
<CheckBox x:Name="useDebugTooltipsOnly" Grid.Row="3" Margin="30,0,0,0"
Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.UseDebugTooltipsOnly}"
IsEnabled="{Binding UseTooltips}">
</CheckBox>
<TextBlock Grid.Row="4" Margin="0,3,0,13"
Text="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.LanguageDependend}"
TextWrapping="Wrap">
</TextBlock>
<CheckBox x:Name="completeWhenTyping" Grid.Row="5"
Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.CompleteWhenTyping}">
</CheckBox>
<CheckBox x:Name="useKeywordCompletionCheckBox" Grid.Row="6"
Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.UseKeywordCompletion}">
</CheckBox>
<CheckBox Grid.Row="7" VerticalAlignment="Center"
Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.UseInsight}"
IsChecked="{Binding UseInsight}" >
</CheckBox>
<CheckBox x:Name="refreshInsightOnComma" Grid.Row="8" Margin="30,0,0,0"
Content="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.RefreshInsightOnComma}"
IsEnabled="{Binding UseInsight}">
</CheckBox>
<StackPanel Grid.Row="9" Orientation="Horizontal" Margin="0,10">
<TextBlock Text="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.TooltipLinkTarget}" Margin="0,2,2,0" />
<ComboBox sd:EnumBinding.EnumType="{x:Type sd:TooltipLinkTarget}"
SelectedValue="{core:OptionBinding sd:CodeCompletionOptions.TooltipLinkTarget}" />
</StackPanel>
</Grid>
</GroupBox>
</Grid>
</gui:OptionPanel>

122
src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml.cs

@ -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
{
/// <summary>
/// Interaction logic for CodeCompletionPanelXaml.xaml
/// </summary>
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();
}
}
}

36
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 public class SvcUtilCommandLine
{ {
StringBuilder argumentBuilder = new StringBuilder(); List<string> arguments = new List<string>();
public SvcUtilCommandLine(ServiceReferenceGeneratorOptions options) public SvcUtilCommandLine(ServiceReferenceGeneratorOptions options)
{ {
@ -32,7 +32,11 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
} }
public string Command { get; set; } public string Command { get; set; }
public string Arguments { get; private set; }
public string[] GetArguments()
{
return arguments.ToArray();
}
void GenerateCommandLine(ServiceReferenceGeneratorOptions options) void GenerateCommandLine(ServiceReferenceGeneratorOptions options)
{ {
@ -48,8 +52,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
AppendIfNotEmpty("/ct:", options.GetDictionaryCollectionTypeDescription()); AppendIfNotEmpty("/ct:", options.GetDictionaryCollectionTypeDescription());
AppendAssemblyReferences(options.Assemblies); AppendAssemblyReferences(options.Assemblies);
AppendIfNotEmpty(options.Url); AppendIfNotEmpty(options.Url);
this.Arguments = argumentBuilder.ToString();
} }
void AppendIfTrue(string argument, bool flag) void AppendIfTrue(string argument, bool flag)
@ -62,7 +64,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
void AppendIfNotEmpty(string argumentName, string argumentValue) void AppendIfNotEmpty(string argumentName, string argumentValue)
{ {
if (!String.IsNullOrEmpty(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) void Append(string argument)
{ {
argumentBuilder.Append(argument); arguments.Add(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;
} }
bool ContainsSpaceCharacter(string text) bool ContainsSpaceCharacter(string text)

2
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); var commandLine = new SvcUtilCommandLine(Options);
commandLine.Command = GetSvcUtilPath(); commandLine.Command = GetSvcUtilPath();
using (ProcessRunner processRunner = new ProcessRunner()) { 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) { if (ProcessExited != null) {
ProcessExited(this, new EventArgs()); ProcessExited(this, new EventArgs());

4
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReferenceHelper.cs

@ -24,12 +24,12 @@ using System.Web.Services.Discovery;
namespace ICSharpCode.SharpDevelop.Gui namespace ICSharpCode.SharpDevelop.Gui
{ {
internal static class ServiceReferenceHelper internal static class ServiceReferenceHelper
{ {
public static string GetServiceName(ServiceDescription description) public static string GetServiceName(ServiceDescription description)
{ {
if (description.Name != null) { if (description.Name != null) {
return description.Name; return description.Name;
} else if (description.RetrievalUrl != null) { } else if (!String.IsNullOrEmpty(description.RetrievalUrl)) {
Uri uri = new Uri(description.RetrievalUrl); Uri uri = new Uri(description.RetrievalUrl);
if (uri.Segments.Length > 0) { if (uri.Segments.Length > 0) {
return uri.Segments[uri.Segments.Length - 1]; return uri.Segments[uri.Segments.Length - 1];

2
src/Main/Base/Project/Src/Internal/ConditionEvaluators/SymbolTypeAtCaretConditionEvaluator.cs

@ -44,7 +44,7 @@ namespace ICSharpCode.SharpDevelop.Internal.ConditionEvaluators
string typesList = condition.Properties["type"]; string typesList = condition.Properties["type"];
if (typesList != null) { if (typesList != null) {
foreach (string type in typesList.Split(',')) { foreach (string type in typesList.Split(',')) {
switch (type) { switch (type.Trim()) {
case "*": case "*":
// Wildcard -> allow any type // Wildcard -> allow any type
return true; return true;

49
src/Main/Base/Project/Src/Project/ProjectChangeWatcher.cs

@ -172,27 +172,36 @@ namespace ICSharpCode.SharpDevelop.Project
static void MainFormActivated() static void MainFormActivated()
{ {
if (wasChangedExternally && !showingMessageBox) { if (wasChangedExternally) {
if (!showingMessageBox) {
if (ProjectService.OpenSolution != null) { if (ProjectService.OpenSolution != null) {
// Set wasChangedExternally=false only after the dialog is closed, // Set wasChangedExternally=false only after the dialog is closed,
// so that additional changes to the project while the dialog is open // so that additional changes to the project while the dialog is open
// don't cause it to appear twice. // don't cause it to appear twice.
// The MainFormActivated event occurs when the dialog is closed before // The MainFormActivated event occurs when the dialog is closed before
// we get a change to set wasChangedExternally=false, so we use 'showingMessageBox' // we get a change to set wasChangedExternally=false, so we use 'showingMessageBox'
// to prevent the dialog from appearing infititely. // to prevent the dialog from appearing infititely.
showingMessageBox = true; 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}"); 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; showingMessageBox = false;
wasChangedExternally = false; wasChangedExternally = false;
if (result == 0) if (result == 1) {
SD.ProjectService.OpenSolutionOrProject(ProjectService.OpenSolution.FileName); FileChangeWatcher.AskForReload();
else if (result == 2) } else {
new CloseSolution().Run(); FileChangeWatcher.CancelReloadQueue();
} else { if (result == 0) {
wasChangedExternally = false; SD.ProjectService.OpenSolutionOrProject(ProjectService.OpenSolution.FileName);
} else {
new CloseSolution().Run();
}
}
} else {
wasChangedExternally = false;
}
} }
} else {
FileChangeWatcher.AskForReload();
} }
} }

25
src/Main/Base/Project/Src/Services/ParserService/CodeCompletionOptions.cs

@ -63,30 +63,35 @@ namespace ICSharpCode.SharpDevelop
set { properties.Set("TooltipsOnlyWhenDebugging", value); } set { properties.Set("TooltipsOnlyWhenDebugging", value); }
} }
public static bool KeywordCompletionEnabled {
get { return properties.Get("KeywordCompletionEnabled", true); }
set { properties.Set("KeywordCompletionEnabled", value); }
}
public static bool CompleteWhenTyping { public static bool CompleteWhenTyping {
get { return properties.Get("CompleteWhenTyping", true); } get { return properties.Get("CompleteWhenTyping", true); }
set { properties.Set("CompleteWhenTyping", value); } set { properties.Set("CompleteWhenTyping", value); }
} }
public static bool CommitOnTabEnterOnly {
get { return properties.Get("CommitOnTabEnterOnly", false); }
set { properties.Set("CommitOnTabEnterOnly", value); }
}
public static bool InsightEnabled { public static bool InsightEnabled {
get { return properties.Get("InsightEnabled", true); } get { return properties.Get("InsightEnabled", true); }
set { properties.Set("InsightEnabled", value); } set { properties.Set("InsightEnabled", value); }
} }
public static bool InsightRefreshOnComma {
get { return properties.Get("InsightRefreshOnComma", true); }
set { properties.Set("InsightRefreshOnComma", value); }
}
public static TooltipLinkTarget TooltipLinkTarget { public static TooltipLinkTarget TooltipLinkTarget {
get { return properties.Get("TooltipLinkTarget", TooltipLinkTarget.Documentation); } get { return properties.Get("TooltipLinkTarget", TooltipLinkTarget.Documentation); }
set { properties.Set("TooltipLinkTarget", value); } 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 { public enum TooltipLinkTarget {

5
src/Main/Base/Project/WinForms/IWinFormsService.cs

@ -142,5 +142,10 @@ namespace ICSharpCode.SharpDevelop.WinForms
/// </param> /// </param>
/// <returns>SDWindowsFormsHost instance</returns> /// <returns>SDWindowsFormsHost instance</returns>
CustomWindowsFormsHost CreateWindowsFormsHost(IServiceProvider serviceProvider = null, bool processShortcutsInWPF = false); CustomWindowsFormsHost CreateWindowsFormsHost(IServiceProvider serviceProvider = null, bool processShortcutsInWPF = false);
/// <summary>
/// Provides access to <see cref="System.Windows.Input.CommandManager.RequerySuggested"/> from Windows Forms-based AddIns.
/// </summary>
void InvalidateCommands();
} }
} }

2
src/Main/Base/Project/Workbench/AbstractViewContentHandlingLoadErrors.cs

@ -40,7 +40,7 @@ namespace ICSharpCode.SharpDevelop.Workbench
/// </summary> /// </summary>
public abstract class AbstractViewContentHandlingLoadErrors : AbstractViewContent public abstract class AbstractViewContentHandlingLoadErrors : AbstractViewContent
{ {
ContentPresenter contentControl = new ContentPresenter(); readonly ContentPresenter contentControl = new ContentPresenter();
object userContent; object userContent;
protected AbstractViewContentHandlingLoadErrors() protected AbstractViewContentHandlingLoadErrors()

65
src/Main/Base/Project/Workbench/FileChangeWatcher.cs

@ -18,10 +18,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Windows.Forms;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.Core; using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Workbench namespace ICSharpCode.SharpDevelop.Workbench
@ -206,21 +203,65 @@ namespace ICSharpCode.SharpDevelop.Workbench
string fileName = file.FileName; string fileName = file.FileName;
if (!File.Exists(fileName)) if (!File.Exists(fileName))
return; return;
string message = StringParser.Parse( if (AutoLoadExternalChangesOption && !file.IsDirty) {
"${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 (File.Exists(fileName)) { if (File.Exists(fileName)) {
file.ReloadFromDisk(); file.ReloadFromDisk();
} }
} else { } else {
file.MakeDirty(); QueueFileForReloadDialog(file);
}
}
}
#region Reload Queue
static readonly HashSet<OpenedFile> queue = new HashSet<OpenedFile>();
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
} }
} }

3
src/Main/SharpDevelop/SharpDevelop.csproj

@ -241,6 +241,9 @@
<EmbeddedResource Include="..\..\..\data\resources\StringResources.resx"> <EmbeddedResource Include="..\..\..\data\resources\StringResources.resx">
<Link>Resources\StringResources.resx</Link> <Link>Resources\StringResources.resx</Link>
</EmbeddedResource> </EmbeddedResource>
<None Include="..\..\..\data\resources\StringResources.resx">
<Link>StringResources.resx</Link>
</None>
<EmbeddedResource Include="Resources\BitmapResources.resources" /> <EmbeddedResource Include="Resources\BitmapResources.resources" />
<None Include="..\GlobalAssemblyInfo.cs.template"> <None Include="..\GlobalAssemblyInfo.cs.template">
<Link>Configuration\GlobalAssemblyInfo.cs.template</Link> <Link>Configuration\GlobalAssemblyInfo.cs.template</Link>

6
src/Main/SharpDevelop/WinForms/WinFormsService.cs

@ -22,7 +22,6 @@ using System.Drawing.Printing;
using System.Windows.Forms; using System.Windows.Forms;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Core.WinForms; using ICSharpCode.Core.WinForms;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Widgets; using ICSharpCode.SharpDevelop.Widgets;
using ICSharpCode.SharpDevelop.Workbench; using ICSharpCode.SharpDevelop.Workbench;
@ -195,5 +194,10 @@ namespace ICSharpCode.SharpDevelop.WinForms
DisposeChild = false DisposeChild = false
}; };
} }
public void InvalidateCommands()
{
System.Windows.Input.CommandManager.InvalidateRequerySuggested();
}
} }
} }

Loading…
Cancel
Save