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 @@ -80,6 +80,15 @@ namespace ICSharpCode.AvalonEdit.Rendering
/// </param>
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>
/// Gets if this VisualLineElement can be split.
/// </summary>

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

@ -57,6 +57,18 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -57,6 +57,18 @@ namespace ICSharpCode.AvalonEdit.Rendering
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/>
public override bool CanSplit {
get { return true; }

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

@ -56,12 +56,31 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -56,12 +56,31 @@ namespace ICSharpCode.AvalonEdit.Rendering
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)
{
throw new NotImplementedException();
throw new NotSupportedException();
}
}
}

Loading…
Cancel
Save