diff --git a/data/resources/StringResources.resx b/data/resources/StringResources.resx index b5d9051aa3..46588f0fcf 100644 --- a/data/resources/StringResources.resx +++ b/data/resources/StringResources.resx @@ -2841,6 +2841,9 @@ system. I don't think that it needs translation. Show &line numbers + + Show &hidden definitions (brackets only) + Full Row diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpBracketSearcher.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpBracketSearcher.cs index 58f4a84154..2c20890d77 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpBracketSearcher.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpBracketSearcher.cs @@ -22,16 +22,22 @@ namespace CSharpBinding { if (offset > 0) { char c = document.GetCharAt(offset - 1); - int index = openingBrackets.IndexOf(c); - int otherOffset = -1; - if (index > -1) + int index = openingBrackets.IndexOf(c); + int otherOffset = -1; int ind = -1; + if (index > -1) { otherOffset = SearchBracketForward(document, offset, openingBrackets[index], closingBrackets[index]); + ind = index; + } index = closingBrackets.IndexOf(c); - if (index > -1) + if (index > -1) { otherOffset = SearchBracketBackward(document, offset - 2, openingBrackets[index], closingBrackets[index]); + ind = index; + } if (otherOffset > -1) - return new BracketSearchResult(Math.Min(offset - 1, otherOffset), 1, Math.Max(offset - 1, otherOffset), 1); + return new BracketSearchResult(Math.Min(offset - 1, otherOffset), 1, + Math.Max(offset - 1, otherOffset), 1, + openingBrackets[ind].ToString(), closingBrackets[ind].ToString()); } return null; diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetBracketSearcher.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetBracketSearcher.cs index 15a764e6ad..d3ae3c1aa3 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetBracketSearcher.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetBracketSearcher.cs @@ -23,15 +23,21 @@ namespace ICSharpCode.VBNetBinding if (offset > 0) { char c = document.GetCharAt(offset - 1); int index = openingBrackets.IndexOf(c); - int otherOffset = -1; - if (index > -1) + int otherOffset = -1; int ind = -1; + if (index > -1) { otherOffset = SearchBracketForward(document, offset, openingBrackets[index], closingBrackets[index]); + ind = index; + } index = closingBrackets.IndexOf(c); - if (index > -1) + if (index > -1) { otherOffset = SearchBracketBackward(document, offset - 2, openingBrackets[index], closingBrackets[index]); + ind = index; + } if (otherOffset > -1) - return new BracketSearchResult(Math.Min(offset - 1, otherOffset), 1, Math.Max(offset - 1, otherOffset), 1); + return new BracketSearchResult(Math.Min(offset - 1, otherOffset), 1, + Math.Max(offset - 1, otherOffset), 1, + openingBrackets[ind].ToString(), closingBrackets[ind].ToString()); int length; VBStatement statement; @@ -49,7 +55,8 @@ namespace ICSharpCode.VBNetBinding } if (startIndex > -1 && endIndex > -1) - return new BracketSearchResult(startIndex, length, endIndex, statement.EndStatement.Length); + return new BracketSearchResult(startIndex, length, endIndex, + statement.EndStatement.Length); } return null; diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj index ee722049e3..fd5362b324 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj @@ -1,234 +1,241 @@ - - - - {0162E499-42D0-409B-AA25-EED21F75336B} - Debug - AnyCPU - Library - ICSharpCode.AvalonEdit.AddIn - ICSharpCode.AvalonEdit.AddIn - v4.0 - C:\Users\Daniel\AppData\Roaming\ICSharpCode/SharpDevelop3.0\Settings.SourceAnalysis - ..\..\..\..\AddIns\DisplayBindings\AvalonEdit\ - False - False - 4 - false - False - -Microsoft.Design#CA1014;-Microsoft.Design#CA2210 - v4.0 - - - - - true - Full - False - True - DEBUG;TRACE - - - False - None - True - False - TRACE - - - False - Auto - 4194304 - AnyCPU - 4096 - - - - - 3.0 - - - 3.0 - - - 3.0 - - - - 3.5 - - - - 3.0 - - - - - - 3.0 - - - 3.0 - - - - - Always - - - Configuration\GlobalAssemblyInfo.cs - - - - - - - - - - - ChooseEncodingDialog.xaml - Code - - - - - - - - - - - - - - - - - - - - - - - - SortOptionsDialog.xaml - Code - - - - - - - - - - - - - BehaviorOptions.xaml - Code - - - - - GeneralEditorOptions.xaml - Code - - - - HighlightingOptions.xaml - Code - - - - - - TextViewOptions.xaml - Code - - - - - - - - - - - Code - - - - Code - - - - - - - - - - - - - SharpDevelopCompletionWindow.cs - - - - {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1} - ICSharpCode.AvalonEdit - False - - - {3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} - NRefactory - False - - - {2748AD25-9C63-4E12-877B-4DCE96FBED54} - ICSharpCode.SharpDevelop - False - - - {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} - ICSharpCode.Core - False - - - {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9} - ICSharpCode.Core.Presentation - False - - - {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288} - ICSharpCode.Core.WinForms - False - - - {924EE450-603D-49C1-A8E5-4AFAA31CE6F3} - ICSharpCode.SharpDevelop.Dom - False - - - - - - - - - SnippetOptionPanel.cs - - - QuickClassBrowser.cs - - - {8035765F-D51F-4A0C-A746-2FD100E19419} - ICSharpCode.SharpDevelop.Widgets - False - - - - - + + + + {0162E499-42D0-409B-AA25-EED21F75336B} + Debug + AnyCPU + Library + ICSharpCode.AvalonEdit.AddIn + ICSharpCode.AvalonEdit.AddIn + v4.0 + C:\Users\Daniel\AppData\Roaming\ICSharpCode/SharpDevelop3.0\Settings.SourceAnalysis + ..\..\..\..\AddIns\DisplayBindings\AvalonEdit\ + False + False + 4 + false + False + -Microsoft.Design#CA1014;-Microsoft.Design#CA2210 + v4.0 + + + + + true + Full + False + True + DEBUG;TRACE + + + False + None + True + False + TRACE + + + False + Auto + 4194304 + AnyCPU + 4096 + + + + + 3.0 + + + 3.0 + + + 3.0 + + + + 3.5 + + + + 3.0 + + + + + + 3.0 + + + 3.0 + + + + + Always + + + Configuration\GlobalAssemblyInfo.cs + + + + + + + + + + + ChooseEncodingDialog.xaml + Code + + + + + + + + + + + + HiddenDefinitionControl.xaml + Code + + + + + + + + + + + + + + + + SortOptionsDialog.xaml + Code + + + + + + + + + + + + + BehaviorOptions.xaml + Code + + + + + GeneralEditorOptions.xaml + Code + + + + HighlightingOptions.xaml + Code + + + + + + TextViewOptions.xaml + Code + + + + + + + + + + + Code + + + + Code + + + + + + + + + + + + + + SharpDevelopCompletionWindow.cs + + + + {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1} + ICSharpCode.AvalonEdit + False + + + {3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} + NRefactory + False + + + {2748AD25-9C63-4E12-877B-4DCE96FBED54} + ICSharpCode.SharpDevelop + False + + + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} + ICSharpCode.Core + False + + + {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9} + ICSharpCode.Core.Presentation + False + + + {857CA1A3-FC88-4BE0-AB6A-D1EE772AB288} + ICSharpCode.Core.WinForms + False + + + {924EE450-603D-49C1-A8E5-4AFAA31CE6F3} + ICSharpCode.SharpDevelop.Dom + False + + + + + + + + + SnippetOptionPanel.cs + + + QuickClassBrowser.cs + + + {8035765F-D51F-4A0C-A746-2FD100E19419} + ICSharpCode.SharpDevelop.Widgets + False + + + + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs index d1ae2d5d8e..5caf35c418 100755 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs @@ -44,6 +44,7 @@ namespace ICSharpCode.AvalonEdit.AddIn BracketHighlightRenderer bracketRenderer; CaretReferencesRenderer caretReferencesRenderer; ContextActionsRenderer contextActionsRenderer; + HiddenDefinition.HiddenDefinitionRenderer hiddenDefinitionRenderer; public CodeEditorView() { @@ -52,6 +53,7 @@ namespace ICSharpCode.AvalonEdit.AddIn this.bracketRenderer = new BracketHighlightRenderer(this.TextArea.TextView); this.caretReferencesRenderer = new CaretReferencesRenderer(this); this.contextActionsRenderer = new ContextActionsRenderer(this); + this.hiddenDefinitionRenderer = new HiddenDefinition.HiddenDefinitionRenderer(this); UpdateCustomizedHighlighting(); @@ -75,6 +77,7 @@ namespace ICSharpCode.AvalonEdit.AddIn public virtual void Dispose() { contextActionsRenderer.Dispose(); + hiddenDefinitionRenderer.Dispose(); } protected override string FileName { @@ -110,6 +113,13 @@ namespace ICSharpCode.AvalonEdit.AddIn 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.ShowHiddenDefinitions) { + this.hiddenDefinitionRenderer.BracketSearchResult = bracketSearchResult; + this.hiddenDefinitionRenderer.Show(); + } else { + this.hiddenDefinitionRenderer.ClosePopup(); + } } } else { this.bracketRenderer.SetHighlight(null); diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/HiddenDefinition/HiddenDefinitionControl.xaml b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/HiddenDefinition/HiddenDefinitionControl.xaml new file mode 100644 index 0000000000..d7a2c4fb05 --- /dev/null +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/HiddenDefinition/HiddenDefinitionControl.xaml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/HiddenDefinition/HiddenDefinitionControl.xaml.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/HiddenDefinition/HiddenDefinitionControl.xaml.cs new file mode 100644 index 0000000000..cfe08d924e --- /dev/null +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/HiddenDefinition/HiddenDefinitionControl.xaml.cs @@ -0,0 +1,27 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; + +using ICSharpCode.AvalonEdit.AddIn.Options; + +namespace ICSharpCode.AvalonEdit.AddIn.HiddenDefinition +{ + public partial class HiddenDefinitionControl : UserControl + { + public HiddenDefinitionControl() + { + InitializeComponent(); + DefinitionTextBlock.FontFamily = new FontFamily(CodeEditorOptions.Instance.FontFamily); + DefinitionTextBlock.FontSize = CodeEditorOptions.Instance.FontSize; + } + + public string DefinitionText { + get { return this.DefinitionTextBlock.Text; } + set { this.DefinitionTextBlock.Text = value; } + } + } +} \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/HiddenDefinition/HiddenDefinitionRenderer.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/HiddenDefinition/HiddenDefinitionRenderer.cs new file mode 100644 index 0000000000..a45e5fa07b --- /dev/null +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/HiddenDefinition/HiddenDefinitionRenderer.cs @@ -0,0 +1,91 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.ComponentModel.Design; +using System.Linq; +using System.Windows.Controls.Primitives; + +using ICSharpCode.AvalonEdit.Document; +using ICSharpCode.Core.Presentation; +using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.AvalonEdit.AddIn.HiddenDefinition +{ + public class HiddenDefinitionRenderer : IDisposable + { + private CodeEditorView editor; + private ExtendedPopup popup = new ExtendedPopup(); + private HiddenDefinitionControl control; + + public HiddenDefinitionRenderer(CodeEditorView editorView) + { + this.editor = editorView; + control = new HiddenDefinitionControl(); + WorkbenchSingleton.Workbench.ActiveContentChanged += WorkbenchSingleton_Workbench_ActiveContentChanged; + } + + public BracketSearchResult BracketSearchResult { get; set; } + + public void Dispose() + { + WorkbenchSingleton.Workbench.ActiveContentChanged -= WorkbenchSingleton_Workbench_ActiveContentChanged; + ClosePopup(); + popup = null; + } + + public void ClosePopup() + { + if (popup.IsOpen) + popup.IsOpen = false; + } + + public void Show() + { + ClosePopup(); + + if (BracketSearchResult == null || BracketSearchResult.OpeningBracket != "{") return; + + var line = GetLineText(BracketSearchResult.OpeningBracketOffset); + if(line == null) return; + + control.DefinitionText = line; + popup.Child = control; + popup.HorizontalOffset = 70; + popup.Placement = PlacementMode.Relative; + popup.PlacementTarget = editor.TextArea; + popup.IsOpen = true; + } + + private string GetLineText(int offset) + { + // get folding manager + var container = this.editor.Adapter.GetService(typeof(IServiceContainer)) as IServiceContainer; + if (container == null) return null; + var folding = container.GetService(typeof(ParserFoldingStrategy)) as ParserFoldingStrategy; + if (folding == null) return null; + + // get folding + var f = folding.FoldingManager.GetFoldingsContaining(offset).LastOrDefault(); + if (f == null) return null; + + // get line + var line = editor.Document.GetLineByOffset(f.StartOffset); + if (line == null || line.IsDeleted) return null; + + // check whether the line is visible + int off = line.Offset; + if (editor.TextArea.TextView.VisualLines[0].StartOffset > off) { + return this.editor.TextArea.TextView.Document.GetText(off, line.Length); + } + + return null; + } + + private void WorkbenchSingleton_Workbench_ActiveContentChanged(object sender, EventArgs e) + { + ClosePopup(); + } + } +} \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs index 74841e3c67..fde16a5eb4 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs @@ -196,6 +196,19 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options } } + bool showHiddenDefinitions = false; + + [DefaultValue(false)] + public bool ShowHiddenDefinitions { + get { return showHiddenDefinitions; } + set { + if (showHiddenDefinitions != value) { + showHiddenDefinitions = value; + OnPropertyChanged("ShowHiddenDefinitions"); + } + } + } + public void BindToTextEditor(TextEditor editor) { editor.Options = this; diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml index 7dc290860c..3902d79de4 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml @@ -23,6 +23,9 @@ + diff --git a/src/Main/Base/Project/Src/Editor/IBracketSearcher.cs b/src/Main/Base/Project/Src/Editor/IBracketSearcher.cs index 0d6007ece5..c7d74a1a8a 100644 --- a/src/Main/Base/Project/Src/Editor/IBracketSearcher.cs +++ b/src/Main/Base/Project/Src/Editor/IBracketSearcher.cs @@ -1,52 +1,59 @@ -// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) - -using System; - -namespace ICSharpCode.SharpDevelop.Editor -{ - /// - /// Allows language specific search for matching brackets. - /// - public interface IBracketSearcher - { - /// - /// Searches for a matching bracket from the given offset to the start of the document. - /// - /// A BracketSearchResult that contains the positions and lengths of the brackets. Return null if there is nothing to highlight. - BracketSearchResult SearchBracket(IDocument document, int offset); - } - - public class DefaultBracketSearcher : IBracketSearcher - { - public static readonly DefaultBracketSearcher DefaultInstance = new DefaultBracketSearcher(); - - public BracketSearchResult SearchBracket(IDocument document, int offset) - { - return null; - } - } - - /// - /// Describes a pair of matching brackets found by IBracketSearcher. - /// - public class BracketSearchResult - { - public int OpeningBracketOffset { get; private set; } - - public int OpeningBracketLength { get; private set; } - - public int ClosingBracketOffset { get; private set; } - - public int ClosingBracketLength { get; private set; } - - public BracketSearchResult(int openingBracketOffset, int openingBracketLength, - int closingBracketOffset, int closingBracketLength) - { - this.OpeningBracketOffset = openingBracketOffset; - this.OpeningBracketLength = openingBracketLength; - this.ClosingBracketOffset = closingBracketOffset; - this.ClosingBracketLength = closingBracketLength; - } - } -} +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; + +namespace ICSharpCode.SharpDevelop.Editor +{ + /// + /// Allows language specific search for matching brackets. + /// + public interface IBracketSearcher + { + /// + /// Searches for a matching bracket from the given offset to the start of the document. + /// + /// A BracketSearchResult that contains the positions and lengths of the brackets. Return null if there is nothing to highlight. + BracketSearchResult SearchBracket(IDocument document, int offset); + } + + public class DefaultBracketSearcher : IBracketSearcher + { + public static readonly DefaultBracketSearcher DefaultInstance = new DefaultBracketSearcher(); + + public BracketSearchResult SearchBracket(IDocument document, int offset) + { + return null; + } + } + + /// + /// Describes a pair of matching brackets found by IBracketSearcher. + /// + public class BracketSearchResult + { + public int OpeningBracketOffset { get; private set; } + + public int OpeningBracketLength { get; private set; } + + public int ClosingBracketOffset { get; private set; } + + public int ClosingBracketLength { get; private set; } + + public string OpeningBracket { get; private set; } + + public string ClosingBracket { get; private set; } + + public BracketSearchResult(int openingBracketOffset, int openingBracketLength, + int closingBracketOffset, int closingBracketLength, + string openingBracket = null, string closingBracket = null) + { + this.OpeningBracketOffset = openingBracketOffset; + this.OpeningBracketLength = openingBracketLength; + this.ClosingBracketOffset = closingBracketOffset; + this.ClosingBracketLength = closingBracketLength; + this.OpeningBracket = openingBracket; + this.ClosingBracket = closingBracket; + } + } +}