Browse Source

Display title of #region in folding.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4838 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 16 years ago
parent
commit
7ed5729102
  1. 24
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
  2. 41
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ParserFoldingStrategy.cs
  3. 10
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs
  4. 11
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/FoldingElementGenerator.cs
  5. 17
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/FoldingSection.cs
  6. 4
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/BackgroundGeometryBuilder.cs

24
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs

@ -5,9 +5,9 @@ @@ -5,9 +5,9 @@
// <version>$Revision$</version>
// </file>
using ICSharpCode.SharpDevelop.Editor.Commands;
using System;
using System.Collections.ObjectModel;
using System.ComponentModel.Design;
using System.Diagnostics;
using System.IO;
using System.Linq;
@ -18,6 +18,7 @@ using System.Windows.Data; @@ -18,6 +18,7 @@ using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Editing;
using ICSharpCode.AvalonEdit.Highlighting;
@ -31,6 +32,7 @@ using ICSharpCode.SharpDevelop.Dom; @@ -31,6 +32,7 @@ using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
using ICSharpCode.SharpDevelop.Editor.Commands;
namespace ICSharpCode.AvalonEdit.AddIn
{
@ -666,13 +668,21 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -666,13 +668,21 @@ namespace ICSharpCode.AvalonEdit.AddIn
void UpdateFolding(ITextEditor editor, ParseInformation parseInfo)
{
if (editor != null) {
ParserFoldingStrategy folding = editor.GetService(typeof(ParserFoldingStrategy)) as ParserFoldingStrategy;
IServiceContainer container = editor.GetService(typeof(IServiceContainer)) as IServiceContainer;
ParserFoldingStrategy folding = container.GetService(typeof(ParserFoldingStrategy)) as ParserFoldingStrategy;
if (folding != null) {
if (parseInfo != null)
folding.Attach();
else
folding.Detach();
folding.UpdateFoldings(parseInfo);
if (parseInfo == null) {
folding.Dispose();
container.RemoveService(typeof(ParserFoldingStrategy));
} else {
folding.UpdateFoldings(parseInfo);
}
} else {
TextArea textArea = editor.GetService(typeof(TextArea)) as TextArea;
if (parseInfo != null) {
folding = new ParserFoldingStrategy(textArea);
container.AddService(typeof(ParserFoldingStrategy), folding);
}
}
}
}

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

@ -19,12 +19,13 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -19,12 +19,13 @@ namespace ICSharpCode.AvalonEdit.AddIn
/// <summary>
/// Uses SharpDevelop.Dom to create parsing information.
/// </summary>
public class ParserFoldingStrategy
public class ParserFoldingStrategy : IDisposable
{
readonly FoldingManager foldingManager;
TextArea textArea;
FoldingMargin margin;
FoldingElementGenerator generator;
bool isFirstUpdate = true;
public ParserFoldingStrategy(TextArea textArea)
{
@ -32,26 +33,20 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -32,26 +33,20 @@ namespace ICSharpCode.AvalonEdit.AddIn
foldingManager = new FoldingManager(textArea.TextView, textArea.Document);
margin = new FoldingMargin() { FoldingManager = foldingManager, TextView = textArea.TextView };
generator = new FoldingElementGenerator() { FoldingManager = foldingManager };
textArea.LeftMargins.Add(margin);
textArea.TextView.ElementGenerators.Add(generator);
}
public bool IsAttached {
get { return textArea.TextView.ElementGenerators.Contains(generator); }
}
public void Attach()
public void Dispose()
{
if (!IsAttached) {
textArea.LeftMargins.Add(margin);
textArea.TextView.ElementGenerators.Add(generator);
if (textArea != null) {
textArea.LeftMargins.Remove(margin);
textArea.TextView.ElementGenerators.Remove(generator);
foldingManager.Clear();
textArea = null;
}
}
public void Detach()
{
textArea.LeftMargins.Remove(margin);
textArea.TextView.ElementGenerators.Remove(generator);
}
public void UpdateFoldings(ParseInformation parseInfo)
{
var oldFoldings = foldingManager.AllFoldings.ToArray();
@ -72,12 +67,17 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -72,12 +67,17 @@ namespace ICSharpCode.AvalonEdit.AddIn
} else {
// no matching current folding; create a new one:
section = foldingManager.CreateFolding(newFolding.StartOffset, newFolding.EndOffset);
// auto-close #regions only when opening the document
section.IsFolded = isFirstUpdate && newFolding.DefaultClosed;
}
section.Title = newFolding.Name;
}
// remove all outstanding old foldings:
while (oldFoldingIndex < oldFoldings.Length) {
foldingManager.RemoveFolding(oldFoldings[oldFoldingIndex++]);
}
isFirstUpdate = false;
}
IEnumerable<NewFolding> GetNewFoldings(ParseInformation parseInfo)
@ -88,8 +88,11 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -88,8 +88,11 @@ namespace ICSharpCode.AvalonEdit.AddIn
AddClassMembers(c, newFoldMarkers);
}
foreach (FoldingRegion foldingRegion in parseInfo.CompilationUnit.FoldingRegions) {
newFoldMarkers.Add(new NewFolding(textArea.Document.GetOffset(foldingRegion.Region.BeginLine, foldingRegion.Region.BeginColumn),
textArea.Document.GetOffset(foldingRegion.Region.EndLine, foldingRegion.Region.EndColumn)));
NewFolding f = new NewFolding(textArea.Document.GetOffset(foldingRegion.Region.BeginLine, foldingRegion.Region.BeginColumn),
textArea.Document.GetOffset(foldingRegion.Region.EndLine, foldingRegion.Region.EndColumn));
f.DefaultClosed = true;
f.Name = foldingRegion.Name;
newFoldMarkers.Add(f);
}
}
return newFoldMarkers.Where(f => f.EndOffset > f.StartOffset).OrderBy(f=>f.StartOffset);
@ -122,12 +125,16 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -122,12 +125,16 @@ namespace ICSharpCode.AvalonEdit.AddIn
struct NewFolding
{
public readonly int StartOffset, EndOffset;
public string Name;
public bool DefaultClosed;
public NewFolding(int start, int end)
{
Debug.Assert(start < end);
this.StartOffset = start;
this.EndOffset = end;
this.Name = null;
this.DefaultClosed = false;
}
}
}

10
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs

@ -136,6 +136,16 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion @@ -136,6 +136,16 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion
}
}
/// <inheritdoc/>
protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
{
base.OnMouseDoubleClick(e);
if (e.ChangedButton == MouseButton.Left) {
e.Handled = true;
RequestInsertion(e);
}
}
/// <summary>
/// Gets/Sets the selected item.
/// </summary>

11
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/FoldingElementGenerator.cs

@ -51,15 +51,20 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -51,15 +51,20 @@ namespace ICSharpCode.AvalonEdit.Editing
if (FoldingManager == null)
return null;
int foldedUntil = -1;
string title = null;
foreach (FoldingSection fs in FoldingManager.GetFoldingsAt(offset)) {
if (fs.IsFolded) {
if (fs.EndOffset > foldedUntil)
if (fs.EndOffset > foldedUntil) {
foldedUntil = fs.EndOffset;
title = fs.Title;
}
}
}
if (foldedUntil > offset) {
if (string.IsNullOrEmpty(title))
title = "...";
FormattedText text = new FormattedText(
"...",
title,
CurrentContext.GlobalTextRunProperties.CultureInfo,
FlowDirection.LeftToRight,
CurrentContext.GlobalTextRunProperties.Typeface,
@ -86,7 +91,7 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -86,7 +91,7 @@ namespace ICSharpCode.AvalonEdit.Editing
sealed class FoldingLineTextRun : FormattedTextRun
{
public FoldingLineTextRun(FormattedTextElement element, TextRunProperties properties)
public FoldingLineTextRun(FormattedTextElement element, TextRunProperties properties)
: base(element, properties)
{
}

17
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/FoldingSection.cs

@ -20,6 +20,7 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -20,6 +20,7 @@ namespace ICSharpCode.AvalonEdit.Editing
FoldingManager manager;
bool isFolded;
CollapsedLineSection collapsedSection;
string title;
/// <summary>
/// Gets/sets if the section is folded.
@ -50,6 +51,22 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -50,6 +51,22 @@ namespace ICSharpCode.AvalonEdit.Editing
}
}
/// <summary>
/// Gets/Sets the text used to display the collapsed version of the folding section.
/// </summary>
public string Title {
get {
return title;
}
set {
if (title != value) {
title = value;
if (this.IsFolded && manager != null)
manager.textView.Redraw(this, DispatcherPriority.Normal);
}
}
}
internal FoldingSection(FoldingManager manager, int startOffset, int endOffset)
{
this.manager = manager;

4
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/BackgroundGeometryBuilder.cs

@ -48,6 +48,10 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -48,6 +48,10 @@ namespace ICSharpCode.AvalonEdit.Rendering
AddRectangle(r.Left, r.Top, r.Right, r.Bottom);
}
/// <summary>
/// Calculates the list of rectangle where the segment in shown.
/// This returns one rectangle for each line inside the segment.
/// </summary>
public static IEnumerable<Rect> GetRectsForSegment(TextView textView, ISegment segment)
{
if (textView == null)

Loading…
Cancel
Save