view Windows/Forms/ListViewColumnSorter.cs @ 21:031354c2a34c default tip

* Add Hyperlink that does sensible stuff by default
author IBBoard <dev@ibboard.co.uk>
date Sat, 19 May 2012 16:45:19 +0100
parents 02a7c7aaf2c1
children
line wrap: on
line source

// This file (ColorableStatusBar.cs) is a part of the IBBoard.Windows.Forms library and is copyright 2009 IBBoard.
//
// The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.

using System.Collections;	
using System.Windows.Forms;
using System.Globalization; 

/// <summary>
/// This class is an implementation of the 'IComparer' interface.
/// </summary>
namespace IBBoard.Windows.Forms
{
	public class ListViewColumnSorter : IComparer
	{
		/// <summary>
		/// Specifies the column to be sorted
		/// </summary>
		private int ColumnToSort;
		/// <summary>
		/// Specifies the order in which to sort (i.e. 'Ascending').
		/// </summary>
		private SortOrder OrderOfSort;
		/// <summary>
		/// Case insensitive comparer object
		/// </summary>
		private CaseInsensitiveComparer ObjectCompare;

		/// <summary>
		/// Class constructor.  Initializes various elements
		/// </summary>
		public ListViewColumnSorter()
		{
			// Initialize the column to '0'
			ColumnToSort = 0;

			// Initialize the sort order to 'none'
			OrderOfSort = SortOrder.None;

			// Initialize the CaseInsensitiveComparer object
			ObjectCompare = new CaseInsensitiveComparer();
		}

		/// <summary>
		/// This method is inherited from the IComparer interface.  It compares the two objects passed using a case insensitive comparison.
		/// </summary>
		/// <param name="x">First object to be compared</param>
		/// <param name="y">Second object to be compared</param>
		/// <returns>The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'</returns>
		public int Compare(object x, object y)
		{
			int compareResult;
			ListViewItem listviewX, listviewY;

			// Cast the objects to be compared to ListViewItem objects
			listviewX = (ListViewItem)x;
			listviewY = (ListViewItem)y;
			double resultx, resulty;
			
			if (double.TryParse(listviewX.SubItems[ColumnToSort].Text, NumberStyles.Any, 
				NumberFormatInfo.InvariantInfo, out resultx) && double.TryParse(listviewY.SubItems[ColumnToSort].Text, NumberStyles.Any, 
				NumberFormatInfo.InvariantInfo, out resulty))
			{
				if (OrderOfSort == SortOrder.Ascending)
				{
					// Ascending sort is selected, return normal result of compare operation
					return resultx.CompareTo(resulty);
				}
				else if (OrderOfSort == SortOrder.Descending)
				{
					// Descending sort is selected, return negative result of compare operation
					return resulty.CompareTo(resultx);
				}
				else
				{
					// Return '0' to indicate they are equal
					return 0;
				}
			}
			else
			{

				// Compare the two items
				compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text,listviewY.SubItems[ColumnToSort].Text);
			
				// Calculate correct return value based on object comparison
				if (OrderOfSort == SortOrder.Ascending)
				{
					// Ascending sort is selected, return normal result of compare operation
					return compareResult;
				}
				else if (OrderOfSort == SortOrder.Descending)
				{
					// Descending sort is selected, return negative result of compare operation
					return (-compareResult);
				}
				else
				{
					// Return '0' to indicate they are equal
					return 0;
				}
			}
		}
    
		/// <summary>
		/// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0').
		/// </summary>
		public int SortColumn
		{
			set
			{
				ColumnToSort = value;
			}
			get
			{
				return ColumnToSort;
			}
		}

		/// <summary>
		/// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending').
		/// </summary>
		public SortOrder Order
		{
			set
			{
				OrderOfSort = value;
			}
			get
			{
				return OrderOfSort;
			}
		}
    
	}
}