Browse Source

SD2-1601 - Implement disabled text editor settings:

- Use smart indentation
 - Underline errors
 - Highlight matching bracket

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5413 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Daniel Grunwald 16 years ago
parent
commit
0981fe4c8b
  1. 36
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorAdapter.cs
  2. 32
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs
  3. 3
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/BehaviorOptions.xaml
  4. 49
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs
  5. 6
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/TextViewOptions.xaml
  6. 3
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs
  7. 14
      src/Main/Base/Project/Src/Editor/AvalonEdit/AvalonEditTextEditorAdapter.cs
  8. 4
      src/Main/Base/Project/Src/Editor/AvalonEdit/IndentationStrategyAdapter.cs
  9. 8
      src/Main/Base/Project/Src/Editor/ITextEditor.cs
  10. 3
      src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingService.cs
  11. 60
      src/Main/Base/Project/Src/Services/Tasks/ErrorPainter.cs
  12. 8
      src/Main/Base/Project/Src/TextEditor/Gui/TextEditorAdapter.cs

36
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorAdapter.cs

@ -10,6 +10,7 @@ using System.Collections.Generic; @@ -10,6 +10,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using ICSharpCode.AvalonEdit.AddIn.Options;
using ICSharpCode.AvalonEdit.AddIn.Snippets;
using ICSharpCode.AvalonEdit.Indentation;
using ICSharpCode.Core;
@ -48,20 +49,39 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -48,20 +49,39 @@ namespace ICSharpCode.AvalonEdit.AddIn
get { return languageBinding; }
}
public override ITextEditorOptions Options {
get { return CodeEditorOptions.Instance; }
}
internal void FileNameChanged()
{
if (languageBinding != null)
languageBinding.Detach();
languageBinding = LanguageBindingService.CreateBinding(this);
if (languageBinding != null) {
languageBinding.Attach(this);
// update properties set by languageBinding
this.TextEditor.TextArea.IndentationStrategy = new IndentationStrategyAdapter(this, languageBinding.FormattingStrategy);
} else {
this.TextEditor.TextArea.IndentationStrategy = new DefaultIndentationStrategy();
languageBinding = LanguageBindingService.CreateBinding(this); // never returns null
languageBinding.Attach(this);
// update properties set by languageBinding
this.TextEditor.TextArea.IndentationStrategy = new OptionControlledIndentationStrategy(this, languageBinding.FormattingStrategy);
}
sealed class OptionControlledIndentationStrategy : IndentationStrategyAdapter
{
public OptionControlledIndentationStrategy(ITextEditor editor, IFormattingStrategy formattingStrategy)
: base(editor, formattingStrategy)
{
}
public override void IndentLine(ICSharpCode.AvalonEdit.Document.TextDocument document, ICSharpCode.AvalonEdit.Document.DocumentLine line)
{
if (CodeEditorOptions.Instance.UseSmartIndentation)
base.IndentLine(document, line);
else
new DefaultIndentationStrategy().IndentLine(document, line);
}
// Do not override IndentLines: it is called only when smart indentation is explicitly requested by the user (Ctrl+I),
// so we keep it enabled even when the option is set to false.
}
public override ICompletionListWindow ShowCompletionWindow(ICompletionItemList data)

32
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs

@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
// </file>
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
@ -56,18 +57,29 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -56,18 +57,29 @@ namespace ICSharpCode.AvalonEdit.AddIn
var tabBinding = editingKeyBindings.Single(b => b.Key == Key.Tab && b.Modifiers == ModifierKeys.None);
tabBinding.Command = new CustomTabCommand(this, tabBinding.Command);
}
protected override void OnOptionChanged(PropertyChangedEventArgs e)
{
base.OnOptionChanged(e);
if (e.PropertyName == "HighlightBrackets")
TextArea_PositionChanged(null, e);
}
void TextArea_PositionChanged(object sender, EventArgs e)
{
/*
* Special case: ITextEditor.Language guarantees that it never returns null.
* In this case however it can be null, since this code may be called while the document is loaded.
* ITextEditor.Language gets set in CodeEditorAdapter.FileNameChanged, which is called after
* loading of the document has finished.
* */
if (this.Adapter.Language != null) {
var bracketSearchResult = this.Adapter.Language.BracketSearcher.SearchBracket(this.Adapter.Document, this.TextArea.Caret.Offset);
this.bracketRenderer.SetHighlight(bracketSearchResult);
if (CodeEditorOptions.Instance.HighlightBrackets) {
/*
* Special case: ITextEditor.Language guarantees that it never returns null.
* In this case however it can be null, since this code may be called while the document is loaded.
* ITextEditor.Language gets set in CodeEditorAdapter.FileNameChanged, which is called after
* loading of the document has finished.
* */
if (this.Adapter.Language != null) {
var bracketSearchResult = this.Adapter.Language.BracketSearcher.SearchBracket(this.Adapter.Document, this.TextArea.Caret.Offset);
this.bracketRenderer.SetHighlight(bracketSearchResult);
}
} else {
this.bracketRenderer.SetHighlight(null);
}
}

3
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/BehaviorOptions.xaml

@ -17,8 +17,7 @@ @@ -17,8 +17,7 @@
IsChecked="{core:OptionBinding local:CodeEditorOptions.ConvertTabsToSpaces}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.Behaviour.ConvertTabsToSpacesCheckBox}" />
<CheckBox
IsEnabled="False"
IsChecked="True"
IsChecked="{core:OptionBinding local:CodeEditorOptions.UseSmartIndentation}"
Content="(TODO: translate) Use smart indentation" />
</StackPanel>
</GroupBox>

49
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs

@ -10,12 +10,13 @@ using System.ComponentModel; @@ -10,12 +10,13 @@ using System.ComponentModel;
using System.Windows.Data;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.AvalonEdit.AddIn.Options
{
[Serializable]
public class CodeEditorOptions : TextEditorOptions
public class CodeEditorOptions : TextEditorOptions, ITextEditorOptions
{
public static CodeEditorOptions Instance {
get { return PropertyService.Get("CodeEditorOptions", new CodeEditorOptions()); }
@ -95,6 +96,44 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options @@ -95,6 +96,44 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options
}
}
bool underlineErrors = true;
[DefaultValue(true)]
public bool UnderlineErrors {
get { return underlineErrors; }
set {
if (underlineErrors != value) {
underlineErrors = value;
OnPropertyChanged("UnderlineErrors");
}
}
}
bool highlightBrackets = true;
[DefaultValue(true)]
public bool HighlightBrackets {
get { return highlightBrackets; }
set {
if (highlightBrackets != value) {
highlightBrackets = value;
OnPropertyChanged("HighlightBrackets");
}
}
}
bool useSmartIndentation;
public bool UseSmartIndentation {
get { return useSmartIndentation; }
set {
if (useSmartIndentation != value) {
useSmartIndentation = value;
OnPropertyChanged("UseSmartIndentation");
}
}
}
public void BindToTextEditor(TextEditor editor)
{
editor.Options = this;
@ -103,5 +142,13 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options @@ -103,5 +142,13 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options
editor.SetBinding(TextEditor.ShowLineNumbersProperty, new Binding("ShowLineNumbers") { Source = this });
editor.SetBinding(TextEditor.WordWrapProperty, new Binding("WordWrap") { Source = this });
}
bool ITextEditorOptions.AutoInsertBlockEnd {
get { return true; }
}
int ITextEditorOptions.VerticalRulerColumn {
get { return 120; }
}
}
}

6
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/TextViewOptions.xaml

@ -16,12 +16,10 @@ @@ -16,12 +16,10 @@
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.Markers.EOLMarkersCheckBox}" />
<CheckBox
Margin="0,16,0,0"
IsChecked="True"
IsEnabled="False"
IsChecked="{core:OptionBinding local:CodeEditorOptions.UnderlineErrors}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.Markers.UnderLineErrorsCheckBox}" />
<CheckBox
IsChecked="True"
IsEnabled="False"
IsChecked="{core:OptionBinding local:CodeEditorOptions.HighlightBrackets}"
Content="{core:Localize Dialog.Options.IDEOptions.TextEditor.Markers.HiglightBracketCheckBox}" />
</StackPanel>
</GroupBox>

3
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs

@ -19,6 +19,7 @@ namespace ICSharpCode.AvalonEdit @@ -19,6 +19,7 @@ namespace ICSharpCode.AvalonEdit
{
#region PropertyChanged handling
/// <inheritdoc/>
[field: NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
@ -190,6 +191,7 @@ namespace ICSharpCode.AvalonEdit @@ -190,6 +191,7 @@ namespace ICSharpCode.AvalonEdit
if (_indentationSize != value) {
_indentationSize = value;
OnPropertyChanged("IndentationSize");
OnPropertyChanged("IndentationString");
}
}
}
@ -207,6 +209,7 @@ namespace ICSharpCode.AvalonEdit @@ -207,6 +209,7 @@ namespace ICSharpCode.AvalonEdit
if (_convertTabsToSpaces != value) {
_convertTabsToSpaces = value;
OnPropertyChanged("ConvertTabsToSpaces");
OnPropertyChanged("IndentationString");
}
}
}

14
src/Main/Base/Project/Src/Editor/AvalonEdit/AvalonEditTextEditorAdapter.cs

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Windows;
@ -71,7 +72,7 @@ namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit @@ -71,7 +72,7 @@ namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit
}
public ITextEditorCaret Caret { get; private set; }
public ITextEditorOptions Options { get; private set; }
public virtual ITextEditorOptions Options { get; private set; }
public virtual ILanguageBinding Language {
get { throw new NotSupportedException(); }
@ -151,6 +152,17 @@ namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit @@ -151,6 +152,17 @@ namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit
return 120;
}
}
public bool UnderlineErrors {
get {
return true;
}
}
public event PropertyChangedEventHandler PropertyChanged {
add { avalonEditOptions.PropertyChanged += value; }
remove { avalonEditOptions.PropertyChanged -= value; }
}
}
public virtual ICSharpCode.Core.FileName FileName {

4
src/Main/Base/Project/Src/Editor/AvalonEdit/IndentationStrategyAdapter.cs

@ -30,14 +30,14 @@ namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit @@ -30,14 +30,14 @@ namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit
this.formattingStrategy = formattingStrategy;
}
public void IndentLine(TextDocument document, DocumentLine line)
public virtual void IndentLine(TextDocument document, DocumentLine line)
{
if (line == null)
throw new ArgumentNullException("line");
formattingStrategy.IndentLine(editor, editor.Document.GetLine(line.LineNumber));
}
public void IndentLines(TextDocument document, int beginLine, int endLine)
public virtual void IndentLines(TextDocument document, int beginLine, int endLine)
{
formattingStrategy.IndentLines(editor, beginLine, endLine);
}

8
src/Main/Base/Project/Src/Editor/ITextEditor.cs

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Input;
using ICSharpCode.Core;
@ -123,7 +124,7 @@ namespace ICSharpCode.SharpDevelop.Editor @@ -123,7 +124,7 @@ namespace ICSharpCode.SharpDevelop.Editor
IEnumerable<ICompletionItem> GetSnippets();
}
public interface ITextEditorOptions
public interface ITextEditorOptions : INotifyPropertyChanged
{
/// <summary>
/// Gets the text used for one indentation level.
@ -151,6 +152,11 @@ namespace ICSharpCode.SharpDevelop.Editor @@ -151,6 +152,11 @@ namespace ICSharpCode.SharpDevelop.Editor
/// This property returns a valid value even if the vertical ruler is set to be invisible.
/// </summary>
int VerticalRulerColumn { get; }
/// <summary>
/// Gets whether errors should be underlined.
/// </summary>
bool UnderlineErrors { get; }
}
public interface ITextEditorCaret

3
src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingService.cs

@ -22,6 +22,9 @@ namespace ICSharpCode.SharpDevelop @@ -22,6 +22,9 @@ namespace ICSharpCode.SharpDevelop
bindings = AddInTree.BuildItems<LanguageBindingDescriptor>(languageBindingPath, null, false);
}
/// <summary>
/// Creates the binding for the specified text editor. This method never returns null.
/// </summary>
public static ILanguageBinding CreateBinding(ITextEditor editor)
{
return new AggregatedLanguageBinding(FindMatchingBindings(editor));

60
src/Main/Base/Project/Src/Services/Tasks/ErrorPainter.cs

@ -28,15 +28,16 @@ namespace ICSharpCode.SharpDevelop @@ -28,15 +28,16 @@ namespace ICSharpCode.SharpDevelop
if (this.markerService == null)
throw new InvalidOperationException("this ITextEditor has no text marker service!");
TaskService.Added += new TaskEventHandler(OnAdded);
TaskService.Removed += new TaskEventHandler(OnRemoved);
TaskService.Cleared += new EventHandler(OnCleared);
DebuggerService.DebugStarted += OnDebugStarted;
DebuggerService.DebugStopped += OnDebugStopped;
TaskService.Added += OnAdded;
TaskService.Removed += OnRemoved;
TaskService.Cleared += OnCleared;
DebuggerService.DebugStarted += OnDebugStartedStopped;
DebuggerService.DebugStopped += OnDebugStartedStopped;
textEditor.Options.PropertyChanged += textEditor_Options_PropertyChanged;
UpdateErrors();
UpdateEnabled();
}
bool isDisposed;
/// <summary>
@ -48,23 +49,44 @@ namespace ICSharpCode.SharpDevelop @@ -48,23 +49,44 @@ namespace ICSharpCode.SharpDevelop
if (isDisposed)
return;
isDisposed = true;
TaskService.Added -= new TaskEventHandler(OnAdded);
TaskService.Removed -= new TaskEventHandler(OnRemoved);
TaskService.Cleared -= new EventHandler(OnCleared);
DebuggerService.DebugStarted -= OnDebugStarted;
DebuggerService.DebugStopped -= OnDebugStopped;
TaskService.Added -= OnAdded;
TaskService.Removed -= OnRemoved;
TaskService.Cleared -= OnCleared;
DebuggerService.DebugStarted -= OnDebugStartedStopped;
DebuggerService.DebugStopped -= OnDebugStartedStopped;
textEditor.Options.PropertyChanged -= textEditor_Options_PropertyChanged;
ClearErrors();
}
void OnDebugStarted(object sender, EventArgs e)
bool isEnabled;
void OnDebugStartedStopped(object sender, EventArgs e)
{
ClearErrors();
UpdateEnabled();
}
void OnDebugStopped(object sender, EventArgs e)
void textEditor_Options_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
foreach (Task task in TaskService.Tasks) {
AddTask(task);
if (e.PropertyName == "UnderlineErrors") {
UpdateEnabled();
}
}
void UpdateEnabled()
{
bool newEnabled = textEditor.Options.UnderlineErrors;
if (DebuggerService.IsDebuggerLoaded && DebuggerService.CurrentDebugger.IsDebugging)
newEnabled = false;
if (isEnabled != newEnabled) {
isEnabled = newEnabled;
ClearErrors();
if (newEnabled) {
foreach (Task task in TaskService.Tasks) {
AddTask(task);
}
}
}
}
@ -105,7 +127,7 @@ namespace ICSharpCode.SharpDevelop @@ -105,7 +127,7 @@ namespace ICSharpCode.SharpDevelop
void AddTask(Task task)
{
if (DebuggerService.IsDebuggerLoaded && DebuggerService.CurrentDebugger.IsDebugging)
if (!isEnabled)
return;
if (!CheckTask(task))
return;
@ -151,6 +173,8 @@ namespace ICSharpCode.SharpDevelop @@ -151,6 +173,8 @@ namespace ICSharpCode.SharpDevelop
if (isDisposed)
return;
ClearErrors();
if (!isEnabled)
return;
foreach (Task task in TaskService.Tasks) {
AddTask(task);
}

8
src/Main/Base/Project/Src/TextEditor/Gui/TextEditorAdapter.cs

@ -119,6 +119,14 @@ namespace ICSharpCode.SharpDevelop @@ -119,6 +119,14 @@ namespace ICSharpCode.SharpDevelop
return properties.VerticalRulerRow;
}
}
public bool UnderlineErrors {
get {
return true;
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged { add {} remove {} }
}
static ICSharpCode.NRefactory.Location ToLocation(TextLocation position)

Loading…
Cancel
Save