// 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 { /// /// Represents a text location with a visual column. /// public struct TextViewPosition : IEquatable { int line, column, visualColumn; /// /// Gets/Sets the line number. /// public int Line { get { return line; } set { line = value; } } /// /// Gets/Sets the (text) column number. /// public int Column { get { return column; } set { column = value; } } /// /// Gets/Sets the visual column number. /// Can be -1 (meaning unknown visual column). /// public int VisualColumn { get { return visualColumn; } set { visualColumn = value; } } /// /// Creates a new TextViewPosition instance. /// public TextViewPosition(int line, int column, int visualColumn) { this.line = line; this.column = column; this.visualColumn = visualColumn; } /// /// Creates a new TextViewPosition instance. /// public TextViewPosition(int line, int column) : this(line, column, -1) { } /// /// Creates a new TextViewPosition instance. /// public TextViewPosition(TextLocation location, int visualColumn) { this.line = location.Line; this.column = location.Column; this.visualColumn = visualColumn; } /// /// Creates a new TextViewPosition instance. /// public TextViewPosition(TextLocation location) : this(location, -1) { } /// public override string ToString() { return string.Format(CultureInfo.InvariantCulture, "[TextViewPosition Line={0} Column={1} VisualColumn={2}]", this.line, this.column, this.visualColumn); } /// /// Implicit conversion to . /// 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" declaration. /// public override bool Equals(object obj) { if (obj is TextViewPosition) return Equals((TextViewPosition)obj); // use Equals method below else return false; } /// public override int GetHashCode() { int hashCode = 0; unchecked { hashCode += 1000000007 * Line.GetHashCode(); hashCode += 1000000009 * Column.GetHashCode(); hashCode += 1000000021 * VisualColumn.GetHashCode(); } return hashCode; } /// /// Equality test. /// public bool Equals(TextViewPosition other) { return this.Line == other.Line && this.Column == other.Column && this.VisualColumn == other.VisualColumn; } /// /// Equality test. /// public static bool operator ==(TextViewPosition left, TextViewPosition right) { return left.Equals(right); } /// /// Inequality test. /// public static bool operator !=(TextViewPosition left, TextViewPosition right) { return !(left.Equals(right)); // use operator == and negate result } #endregion } }