ListViewItemComparer.cpp

#include "StdAfx.h"
#include "ListViewItemComparer.h"


using namespace Core;
using namespace System;
using namespace System::Diagnostics;


/// [ Constructor ]
ListViewItemComparer::ListViewItemComparer() :
    m_column( 0 ),
    m_sortOrder( Windows::Forms::SortOrder::Ascending )
{
}

/// [ Constructor ]
ListViewItemComparer::ListViewItemComparer( int column ) :
    m_column( column ),
    m_sortOrder( Windows::Forms::SortOrder::Ascending )
{
}


/// 2つのオブジェクトを比較し、一方が他方より小さいか、等しいか、大きいかを示す値を返す
int ListViewItemComparer::Compare( System::Object^ x, System::Object^ y )
{
    // ListViewItem にキャストする
    Windows::Forms::ListViewItem^ itemX = safe_cast< Windows::Forms::ListViewItem^ >( x );
    Windows::Forms::ListViewItem^ itemY = safe_cast< Windows::Forms::ListViewItem^ >( y );

    // ... それらを文字列として比較する
    int result = String::Compare(
        itemX->SubItems[ m_column ]->Text,
        itemY->SubItems[ m_column ]->Text
    );

    if( m_sortOrder == Windows::Forms::SortOrder::Descending )
    {
        // 並べ替え方法が降順に指定されているならば、結果を反転する
        result = -result;
    }
    return result;
}


/// 列を設定する [ Property ]
void ListViewItemComparer::Column::set( int value )
{
    if( m_column == value )
    {
        // 現在と同じ値を指定されたならば、並べ替え方法を変更する
        if( m_sortOrder == Windows::Forms::SortOrder::Ascending )
        {
            // 昇順に設定されていたならば、降順にする
            m_sortOrder = Windows::Forms::SortOrder::Descending;
        }
        else
        {
            // 昇順にする
            m_sortOrder = Windows::Forms::SortOrder::Ascending;
        }
    }
    else
    {
        m_column = value;
    }
}