// 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; namespace ICSharpCode.AvalonEdit.Document { /// /// A line/column position. /// Text editor lines/columns are counted started from one. /// /// /// The document provides the methods and /// to convert between offsets and TextLocations. /// public struct TextLocation : IComparable, IEquatable { /// /// Represents no text location (0, 0). /// public static readonly TextLocation Empty = new TextLocation(0, 0); /// /// Creates a TextLocation instance. /// /// Warning: the parameters are (line, column). /// Not (column, line) as in ICSharpCode.TextEditor! /// /// public TextLocation(int line, int column) { y = line; x = column; } int x, y; /// /// Gets the line number. /// public int Line { get { return y; } } /// /// Gets the column number. /// public int Column { get { return x; } } /// /// Gets whether the TextLocation instance is empty. /// public bool IsEmpty { get { return x <= 0 && y <= 0; } } /// /// Gets a string representation for debugging purposes. /// public override string ToString() { return string.Format(CultureInfo.InvariantCulture, "(Line {1}, Col {0})", this.x, this.y); } /// /// Gets a hash code. /// public override int GetHashCode() { return unchecked (87 * x.GetHashCode() ^ y.GetHashCode()); } /// /// Equality test. /// public override bool Equals(object obj) { if (!(obj is TextLocation)) return false; return (TextLocation)obj == this; } /// /// Equality test. /// public bool Equals(TextLocation other) { return this == other; } /// /// Equality test. /// public static bool operator ==(TextLocation left, TextLocation right) { return left.x == right.x && left.y == right.y; } /// /// Inequality test. /// public static bool operator !=(TextLocation left, TextLocation right) { return left.x != right.x || left.y != right.y; } /// /// Compares two text locations. /// public static bool operator <(TextLocation left, TextLocation right) { if (left.y < right.y) return true; else if (left.y == right.y) return left.x < right.x; else return false; } /// /// Compares two text locations. /// public static bool operator >(TextLocation left, TextLocation right) { if (left.y > right.y) return true; else if (left.y == right.y) return left.x > right.x; else return false; } /// /// Compares two text locations. /// public static bool operator <=(TextLocation left, TextLocation right) { return !(left > right); } /// /// Compares two text locations. /// public static bool operator >=(TextLocation left, TextLocation right) { return !(left < right); } /// /// Compares two text locations. /// public int CompareTo(TextLocation other) { if (this == other) return 0; if (this < other) return -1; else return 1; } } }