Browse Source

Expand foldings when the caret is moved into them.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4856 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 16 years ago
parent
commit
75b4682d7f
  1. 1
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ParserFoldingStrategy.cs
  2. 1
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs
  3. 37
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretWeakEventHandler.cs
  4. 42
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/FoldingManager.cs
  5. 1
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/ICSharpCode.AvalonEdit.csproj

1
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ParserFoldingStrategy.cs

@ -31,6 +31,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -31,6 +31,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
{
this.textArea = textArea;
foldingManager = new FoldingManager(textArea.TextView, textArea.Document);
foldingManager.ExpandFoldingsWhenCaretIsMovedIntoThem(textArea.Caret);
margin = new FoldingMargin() { FoldingManager = foldingManager, TextView = textArea.TextView };
generator = new FoldingElementGenerator() { FoldingManager = foldingManager };
textArea.LeftMargins.Add(margin);

1
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs

@ -221,6 +221,7 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -221,6 +221,7 @@ namespace ICSharpCode.AvalonEdit.Editing
/// This event might be raised multiple times during a big update operation.
/// You might want to check TextDocument.IsInUpdate and delay time-consuming
/// actions until the update operation ends.
/// TODO: only raise this event outside of document updates
/// </summary>
public event EventHandler PositionChanged;

37
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretWeakEventHandler.cs

@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
/*
* Created by SharpDevelop.
* User: daniel
* Date: 31.08.2009
* Time: 21:06
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using ICSharpCode.AvalonEdit.Utils;
using System;
namespace ICSharpCode.AvalonEdit.Editing
{
/// <summary>
/// Contains classes for handling weak events on the Caret class.
/// </summary>
public static class CaretWeakEventManager
{
/// <summary>
/// Handles the Caret.PositionChanged event.
/// </summary>
public sealed class PositionChanged : WeakEventManagerBase<PositionChanged, Caret>
{
/// <inheritdoc/>
protected override void StartListening(Caret source)
{
source.PositionChanged += DeliverEvent;
}
/// <inheritdoc/>
protected override void StopListening(Caret source)
{
source.PositionChanged -= DeliverEvent;
}
}
}
}

42
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/FoldingManager.cs

@ -8,10 +8,11 @@ @@ -8,10 +8,11 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Threading;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Rendering;
using System.Windows.Threading;
namespace ICSharpCode.AvalonEdit.Editing
{
@ -39,6 +40,45 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -39,6 +40,45 @@ namespace ICSharpCode.AvalonEdit.Editing
this.foldings = new TextSegmentCollection<FoldingSection>(document);
}
// keep a reference to the helper as long as the folding manager exists
ExpandFoldingsWhenCaretIsMovedIntoThemHelper helper;
/// <summary>
/// Will listen to Caret.PositionChanged events and automatically expand folding sections
/// when the caret is moved into them.
/// </summary>
public void ExpandFoldingsWhenCaretIsMovedIntoThem(Caret caret)
{
if (helper == null)
helper = new ExpandFoldingsWhenCaretIsMovedIntoThemHelper(this);
CaretWeakEventManager.PositionChanged.AddListener(caret, helper);
}
sealed class ExpandFoldingsWhenCaretIsMovedIntoThemHelper : IWeakEventListener
{
FoldingManager manager;
public ExpandFoldingsWhenCaretIsMovedIntoThemHelper(FoldingManager manager)
{
this.manager = manager;
}
bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object sender, EventArgs e)
{
if (managerType == typeof(CaretWeakEventManager.PositionChanged)) {
Caret caret = (Caret)sender;
int caretOffset = caret.Offset;
foreach (FoldingSection s in manager.GetFoldingsContaining(caretOffset)) {
if (s.IsFolded && s.StartOffset < caretOffset && caretOffset < s.EndOffset) {
s.IsFolded = false;
}
}
return true;
}
return false;
}
}
/// <summary>
/// Creates a folding for the specified text section.
/// </summary>

1
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/ICSharpCode.AvalonEdit.csproj

@ -131,6 +131,7 @@ @@ -131,6 +131,7 @@
</Compile>
<Compile Include="Editing\CaretNavigationCommandHandler.cs">
</Compile>
<Compile Include="Editing\CaretWeakEventHandler.cs" />
<Compile Include="Editing\DragDropException.cs" />
<Compile Include="Editing\EditingCommandHandler.cs" />
<Compile Include="Editing\FoldingElementGenerator.cs">

Loading…
Cancel
Save