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;
+ }
+ }
+}