Click here to Skip to main content
15,867,968 members
Articles / Desktop Programming / WPF

Using AvalonEdit (WPF Text Editor)

Rate me:
Please Sign up or sign in to vote.
4.97/5 (271 votes)
1 Apr 2013LGPL313 min read 1.8M   72.2K   534  
AvalonEdit is an extensible Open-Source text editor with support for syntax highlighting and folding.
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)

using System;
using System.Globalization;
using ICSharpCode.AvalonEdit.Document;

namespace ICSharpCode.AvalonEdit
{
	/// <summary>
	/// Represents a text location with a visual column.
	/// </summary>
	public struct TextViewPosition : IEquatable<TextViewPosition>
	{
		int line, column, visualColumn;
		
		/// <summary>
		/// Gets/Sets Location.
		/// </summary>
		public TextLocation Location {
			get {
				return new TextLocation(line, column);
			}
			set {
				line = value.Line;
				column = value.Column;
			}
		}
		
		/// <summary>
		/// Gets/Sets the line number.
		/// </summary>
		public int Line {
			get { return line; }
			set { line = value; }
		}
		
		/// <summary>
		/// Gets/Sets the (text) column number.
		/// </summary>
		public int Column {
			get { return column; }
			set { column = value; }
		}
		
		/// <summary>
		/// Gets/Sets the visual column number.
		/// Can be -1 (meaning unknown visual column).
		/// </summary>
		public int VisualColumn {
			get { return visualColumn; }
			set { visualColumn = value; }
		}
		
		/// <summary>
		/// Creates a new TextViewPosition instance.
		/// </summary>
		public TextViewPosition(int line, int column, int visualColumn)
		{
			this.line = line;
			this.column = column;
			this.visualColumn = visualColumn;
		}
		
		/// <summary>
		/// Creates a new TextViewPosition instance.
		/// </summary>
		public TextViewPosition(int line, int column)
			: this(line, column, -1)
		{
		}
		
		/// <summary>
		/// Creates a new TextViewPosition instance.
		/// </summary>
		public TextViewPosition(TextLocation location, int visualColumn)
		{
			this.line = location.Line;
			this.column = location.Column;
			this.visualColumn = visualColumn;
		}
		
		/// <summary>
		/// Creates a new TextViewPosition instance.
		/// </summary>
		public TextViewPosition(TextLocation location)
			: this(location, -1)
		{
		}
		
		/// <inheritdoc/>
		public override string ToString()
		{
			return string.Format(CultureInfo.InvariantCulture,
			                     "[TextViewPosition Line={0} Column={1} VisualColumn={2}]",
			                     this.line, this.column, this.visualColumn);
		}
		
		/// <summary>
		/// Implicit conversion to <see cref="TextLocation"/>.
		/// </summary>
		[Obsolete("Use the Location property instead of the implicit conversion to TextLocation")]
		public static implicit operator TextLocation(TextViewPosition position)
		{
			return new TextLocation(position.Line, position.Column);
		}
		
		#region Equals and GetHashCode implementation
		// The code in this region is useful if you want to use this structure in collections.
		// If you don't need it, you can just remove the region and the ": IEquatable<Struct1>" declaration.
		
		/// <inheritdoc/>
		public override bool Equals(object obj)
		{
			if (obj is TextViewPosition)
				return Equals((TextViewPosition)obj); // use Equals method below
			else
				return false;
		}
		
		/// <inheritdoc/>
		public override int GetHashCode()
		{
			int hashCode = 0;
			unchecked {
				hashCode += 1000000007 * Line.GetHashCode();
				hashCode += 1000000009 * Column.GetHashCode();
				hashCode += 1000000021 * VisualColumn.GetHashCode();
			}
			return hashCode;
		}
		
		/// <summary>
		/// Equality test.
		/// </summary>
		public bool Equals(TextViewPosition other)
		{
			return this.Line == other.Line && this.Column == other.Column && this.VisualColumn == other.VisualColumn;
		}
		
		/// <summary>
		/// Equality test.
		/// </summary>
		public static bool operator ==(TextViewPosition left, TextViewPosition right)
		{
			return left.Equals(right);
		}
		
		/// <summary>
		/// Inequality test.
		/// </summary>
		public static bool operator !=(TextViewPosition left, TextViewPosition right)
		{
			return !(left.Equals(right)); // use operator == and negate result
		}
		#endregion
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU Lesser General Public License (LGPLv3)


Written By
Germany Germany
I am the lead developer on the SharpDevelop open source project.

Comments and Discussions