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

/// <summary>
/// A ListView elemeinek rendezésére szolgáló osztály, amely az IComparer interfész implementációja
/// </summary>
public class ListViewSorter : IComparer
{
    /// <summary>
    /// Melyik oszlop szerint rendezünk
    /// </summary>
    private int ColumnToSort;

    /// <summary>
    /// A rendezés iránya
    /// </summary>
    private SortOrder OrderOfSort;

    /// <summary>
    /// Case insensitive comparer objektum
    /// </summary>
    private CaseInsensitiveComparer ObjectCompare;

    /// <summary>
    /// Konstruktor
    /// </summary>
    public ListViewSorter()
    {
        ColumnToSort = 0;
        OrderOfSort = SortOrder.None;
        ObjectCompare = new CaseInsensitiveComparer();
    }

    /// <summary>
    /// Az IComparer interfészből származtatott metódus, amely a paraméterként kapott két objektumot hasonlítja össze 'case insensitive' módon
    /// </summary>
    /// <param name="x">Első összehasonlítandó objektum</param>
    /// <param name="y">Második összehasonlítandó objektum</param>
    /// <returns>Az összehasonlítás eredménye. "0" ha egyenlő, negatív ha x< y és pozitív ha x > y</returns>
    public int Compare(object x, object y)
    {
        int compareResult;
        ListViewItem listviewX, listviewY;
        long sizeX, sizeY;

        listviewX = (ListViewItem) x;
        listviewY = (ListViewItem) y;

        if (listviewX.Text.Equals("..") || listviewY.Text.Equals("..") || listviewX.SubItems[1].Text.Equals("<dir>") || listviewY.SubItems[1].Text.Equals("<dir>"))
        {
            return 0;
        }

        // Objektumok összehasonlítása
        if (ColumnToSort == 1)
        {
            if (!long.TryParse(listviewX.Tag.ToString(), out sizeX))
            {
                sizeX = -1;
            }

            if (!long.TryParse(listviewY.Tag.ToString(), out sizeY))
            {
                sizeY = -1;
            }

            compareResult = sizeX.CompareTo(sizeY);
        }
        else
        {
            compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text);
        }

        // A visszatérési érték kiszámítása az összehasonlítás eredménye alapján
        if (OrderOfSort == SortOrder.Ascending)
        {
            // Növekvő sorrend esetén az eredeti értékkel tér vissza
            return compareResult;
        }
        else if (OrderOfSort == SortOrder.Descending)
        {
            // Csökkenő sorrend esetén az eredeti érték ellentettjével tér vissza
            return (-compareResult);
        }
        else
        {
            // Egyenlőség esetén 0-val tér vissza
            return 0;
        }
    }

    /// <summary>
    /// Az oszlop számának beállítása/lekérdezése, amely szerint rendezünk
    /// </summary>
    public int SortColumn
    {
        set
        {
            ColumnToSort = value;
        }
        get
        {
            return ColumnToSort;
        }
    }

    /// <summary>
    /// A rendezés irányának beállítása/lekérdezése
    /// </summary>
    public SortOrder Order
    {
        set
        {
            OrderOfSort = value;
        }
        get
        {
            return OrderOfSort;
        }
    }

}