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 17 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
{ {
this.textArea = textArea; this.textArea = textArea;
foldingManager = new FoldingManager(textArea.TextView, textArea.Document); foldingManager = new FoldingManager(textArea.TextView, textArea.Document);
foldingManager.ExpandFoldingsWhenCaretIsMovedIntoThem(textArea.Caret);
margin = new FoldingMargin() { FoldingManager = foldingManager, TextView = textArea.TextView }; margin = new FoldingMargin() { FoldingManager = foldingManager, TextView = textArea.TextView };
generator = new FoldingElementGenerator() { FoldingManager = foldingManager }; generator = new FoldingElementGenerator() { FoldingManager = foldingManager };
textArea.LeftMargins.Add(margin); textArea.LeftMargins.Add(margin);

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

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

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

@ -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 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Threading;
using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Rendering; using ICSharpCode.AvalonEdit.Rendering;
using System.Windows.Threading;
namespace ICSharpCode.AvalonEdit.Editing namespace ICSharpCode.AvalonEdit.Editing
{ {
@ -39,6 +40,45 @@ namespace ICSharpCode.AvalonEdit.Editing
this.foldings = new TextSegmentCollection<FoldingSection>(document); 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> /// <summary>
/// Creates a folding for the specified text section. /// Creates a folding for the specified text section.
/// </summary> /// </summary>

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

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

Loading…
Cancel
Save