Browse Source

Fix http://community.sharpdevelop.net/forums/t/11817.aspx - NotImplementedException when word-wrapping bidirectional text

pull/1/head
Daniel Grunwald 15 years ago
parent
commit
dd17ac9e4a
  1. 9
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLineElement.cs
  2. 12
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLineText.cs
  3. 23
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLineTextSource.cs

9
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLineElement.cs

@ -80,6 +80,15 @@ namespace ICSharpCode.AvalonEdit.Rendering
/// </param> /// </param>
public abstract TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context); public abstract TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context);
/// <summary>
/// Retrieves the text span immediately before the visual column.
/// </summary>
/// <remarks>This method is used for word-wrapping in bidirectional text.</remarks>
public virtual TextSpan<CultureSpecificCharacterBufferRange> GetPrecedingText(int visualColumnLimit, ITextRunConstructionContext context)
{
return null;
}
/// <summary> /// <summary>
/// Gets if this VisualLineElement can be split. /// Gets if this VisualLineElement can be split.
/// </summary> /// </summary>

12
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLineText.cs

@ -57,6 +57,18 @@ namespace ICSharpCode.AvalonEdit.Rendering
return new TextCharacters(text, 0, text.Length, this.TextRunProperties); return new TextCharacters(text, 0, text.Length, this.TextRunProperties);
} }
/// <inheritdoc/>
public override TextSpan<CultureSpecificCharacterBufferRange> GetPrecedingText(int visualColumnLimit, ITextRunConstructionContext context)
{
if (context == null)
throw new ArgumentNullException("context");
int relativeOffset = visualColumnLimit - VisualColumn;
string text = context.Document.GetText(context.VisualLine.FirstDocumentLine.Offset + RelativeTextOffset, relativeOffset);
CharacterBufferRange range = new CharacterBufferRange(text, 0, text.Length);
return new TextSpan<CultureSpecificCharacterBufferRange>(range.Length, new CultureSpecificCharacterBufferRange(this.TextRunProperties.CultureInfo, range));
}
/// <inheritdoc/> /// <inheritdoc/>
public override bool CanSplit { public override bool CanSplit {
get { return true; } get { return true; }

23
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLineTextSource.cs

@ -56,12 +56,31 @@ namespace ICSharpCode.AvalonEdit.Rendering
public override TextSpan<CultureSpecificCharacterBufferRange> GetPrecedingText(int textSourceCharacterIndexLimit) public override TextSpan<CultureSpecificCharacterBufferRange> GetPrecedingText(int textSourceCharacterIndexLimit)
{ {
throw new NotImplementedException(); try {
foreach (VisualLineElement element in VisualLine.Elements) {
if (textSourceCharacterIndexLimit > element.VisualColumn
&& textSourceCharacterIndexLimit <= element.VisualColumn + element.VisualLength)
{
TextSpan<CultureSpecificCharacterBufferRange> span = element.GetPrecedingText(textSourceCharacterIndexLimit, this);
if (span == null)
break;
int relativeOffset = textSourceCharacterIndexLimit - element.VisualColumn;
if (span.Length > relativeOffset)
throw new ArgumentException("The returned TextSpan is too long.", element.GetType().Name + ".GetPrecedingText");
return span;
}
}
CharacterBufferRange empty = CharacterBufferRange.Empty;
return new TextSpan<CultureSpecificCharacterBufferRange>(empty.Length, new CultureSpecificCharacterBufferRange(null, empty));
} catch (Exception ex) {
Debug.WriteLine(ex.ToString());
throw;
}
} }
public override int GetTextEffectCharacterIndexFromTextSourceCharacterIndex(int textSourceCharacterIndex) public override int GetTextEffectCharacterIndexFromTextSourceCharacterIndex(int textSourceCharacterIndex)
{ {
throw new NotImplementedException(); throw new NotSupportedException();
} }
} }
} }

Loading…
Cancel
Save