//                                          
// Driver Verifier UI
// Copyright (c) Microsoft Corporation, 1999
//

//
// module: CDLPage.cpp
// author: DMihai
// created: 11/1/00
//

#include "stdafx.h"
#include "verifier.h"

#include "CDLPage.h"
#include "VrfUtil.h"
#include "VGlobal.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//
// Help IDs
//

static DWORD MyHelpIds[] =
{
    IDC_CONFDRV_LIST,               IDH_DV_UnsignedDriversList,
    0,                              0
};

/////////////////////////////////////////////////////////////////////////////
// CConfirmDriverListPage property page

IMPLEMENT_DYNCREATE(CConfirmDriverListPage, CVerifierPropertyPage)

CConfirmDriverListPage::CConfirmDriverListPage() 
    : CVerifierPropertyPage(CConfirmDriverListPage::IDD)
{
	//{{AFX_DATA_INIT(CConfirmDriverListPage)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT

    m_pParentSheet = NULL;

    m_nSortColumnIndex = 0;
    m_bAscendSortDrvName = FALSE;
    m_bAscendSortProvName = FALSE;
}

CConfirmDriverListPage::~CConfirmDriverListPage()
{
}

void CConfirmDriverListPage::DoDataExchange(CDataExchange* pDX)
{
    CVerifierPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CConfirmDriverListPage)
	DDX_Control(pDX, IDC_CONFDRV_NEXT_DESCR_STATIC, m_NextDescription);
	DDX_Control(pDX, IDC_CONFDRV_TITLE_STATIC, m_TitleStatic);
	DDX_Control(pDX, IDC_CONFDRV_LIST, m_DriversList);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CConfirmDriverListPage, CVerifierPropertyPage)
	//{{AFX_MSG_MAP(CConfirmDriverListPage)
    ON_NOTIFY(LVN_COLUMNCLICK, IDC_CONFDRV_LIST, OnColumnclickConfdrvList)
    ON_WM_CONTEXTMENU()
    ON_MESSAGE( WM_HELP, OnHelp )
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
VOID CConfirmDriverListPage::SetupListHeader()
{
    LVCOLUMN lvColumn;
    CString strName;
    CString strDescription;
    CRect rectWnd;
    
    VERIFY( strName.LoadString( IDS_NAME ) );
    VERIFY( strDescription.LoadString( IDS_DESCRIPTION ) );

    //
    // list's regtangle
    //

    m_DriversList.GetClientRect( &rectWnd );
  
    //
    // Column 0
    //

    memset( &lvColumn, 0, sizeof( lvColumn ) );
    lvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
    lvColumn.fmt = LVCFMT_LEFT;
    
    lvColumn.iSubItem = 0;
    lvColumn.pszText = strName.GetBuffer( strName.GetLength() + 1 );
    lvColumn.cx = (int)( rectWnd.Width() * 0.30 );
    VERIFY( m_DriversList.InsertColumn( 0, &lvColumn ) != -1 );
    strName.ReleaseBuffer();

    //
    // Column 1
    //

    lvColumn.iSubItem = 1;
    lvColumn.pszText = strDescription.GetBuffer( strDescription.GetLength() + 1 );
    lvColumn.cx = (int)( rectWnd.Width() * 0.65 );
    VERIFY( m_DriversList.InsertColumn( 1, &lvColumn ) != -1 );
    strDescription.ReleaseBuffer();
}

/////////////////////////////////////////////////////////////////////////////
VOID CConfirmDriverListPage::FillTheList()
{
    INT_PTR nDriversNo;
    INT_PTR nCrtDriverIndex;
    CDriverData *pCrtDrvData;
    const CDriverDataArray &DrvDataArray = g_NewVerifierSettings.m_DriversSet.m_aDriverData;

    m_DriversList.DeleteAllItems();

    //
    // Parse the driver data array
    //

    nDriversNo = DrvDataArray.GetSize();

    for( nCrtDriverIndex = 0; nCrtDriverIndex < nDriversNo; nCrtDriverIndex += 1)
    {
        pCrtDrvData = DrvDataArray.GetAt( nCrtDriverIndex );

        ASSERT_VALID( pCrtDrvData );

        if( g_NewVerifierSettings.m_DriversSet.ShouldDriverBeVerified( pCrtDrvData ) )
        {
            AddListItem( nCrtDriverIndex, 
                         pCrtDrvData );
        }
    }
}


/////////////////////////////////////////////////////////////////////////////
VOID CConfirmDriverListPage::AddListItem( INT_PTR nIndexInArray, CDriverData *pCrtDrvData )
{
    INT nActualIndex;
    LVITEM lvItem;

    ASSERT_VALID( pCrtDrvData );

    ZeroMemory( &lvItem, sizeof( lvItem ) );

    //
    // LVITEM's member pszText is not a const pointer 
    // so we need to GetBuffer here :-(
    //

    //
    // Sub-item 0
    //

    lvItem.pszText = pCrtDrvData->m_strName.GetBuffer( pCrtDrvData->m_strName.GetLength() + 1 );
    
    if( NULL == lvItem.pszText )
    {
        goto Done;
    }

    lvItem.mask = LVIF_TEXT | LVIF_PARAM;
    lvItem.lParam = nIndexInArray;
    lvItem.iItem = m_DriversList.GetItemCount();
    lvItem.iSubItem = 0;
    
    nActualIndex = m_DriversList.InsertItem( &lvItem );
    
    pCrtDrvData->m_strName.ReleaseBuffer();

    if( nActualIndex < 0 )
    {
        //
        // Could not add an item in the list - give up
        //

        goto Done;
    }

    //
    // Sub-item 1
    //

    lvItem.pszText = pCrtDrvData->m_strFileDescription.GetBuffer( 
        pCrtDrvData->m_strFileDescription.GetLength() + 1 );
    
    if( NULL == lvItem.pszText )
    {
        goto Done;
    }

    lvItem.mask = LVIF_TEXT;
    lvItem.iItem = nActualIndex;
    lvItem.iSubItem = 1;

    m_DriversList.SetItem( &lvItem );

    pCrtDrvData->m_strFileDescription.ReleaseBuffer();

Done:
    //
    // All done
    //

    NOTHING;
}

/////////////////////////////////////////////////////////////////////////////
BOOL CConfirmDriverListPage::SetContextStrings( ULONG uTitleResId )
{
    return m_strTitle.LoadString( uTitleResId );
}

/////////////////////////////////////////////////////////////
VOID CConfirmDriverListPage::SortTheList()
{
    m_DriversList.SortItems( StringCmpFunc, (LPARAM)this );
}

/////////////////////////////////////////////////////////////
int CALLBACK CConfirmDriverListPage::StringCmpFunc( LPARAM lParam1,
                                                    LPARAM lParam2,
                                                    LPARAM lParamSort)
{
    int nCmpRez = 0;
    BOOL bSuccess;
    CString strName1;
    CString strName2;

    CConfirmDriverListPage *pThis = (CConfirmDriverListPage *)lParamSort;
    ASSERT_VALID( pThis );

    //
    // Get the first name
    //

    bSuccess = pThis->GetColumnStrValue( lParam1, 
                                         strName1 );

    if( FALSE == bSuccess )
    {
        goto Done;
    }

    //
    // Get the second name
    //

    bSuccess = pThis->GetColumnStrValue( lParam2, 
                                         strName2 );

    if( FALSE == bSuccess )
    {
        goto Done;
    }

    //
    // Compare the names
    //

    nCmpRez = strName1.CompareNoCase( strName2 );
    
    if( 0 == pThis->m_nSortColumnIndex )
    {
        //
        // Sort by driver name
        //

        if( FALSE != pThis->m_bAscendSortDrvName )
        {
            nCmpRez *= -1;
        }
    }
    else
    {
        //
        // Sort by provider name
        //

        if( FALSE != pThis->m_bAscendSortProvName )
        {
            nCmpRez *= -1;
        }
    }

Done:

    return nCmpRez;

}
/////////////////////////////////////////////////////////////
BOOL CConfirmDriverListPage::GetColumnStrValue( LPARAM lItemData, 
                                                CString &strName )
{
    CDriverData *pCrtDrvData;

    pCrtDrvData = g_NewVerifierSettings.m_DriversSet.m_aDriverData.GetAt( (INT_PTR) lItemData );

    ASSERT_VALID( pCrtDrvData );
    
    if( 0 == m_nSortColumnIndex )
    {
        //
        // Sort by driver name
        //

        strName = pCrtDrvData->m_strName;
    }
    else
    {
        //
        // Sort by provider name
        //

        strName = pCrtDrvData->m_strCompanyName;
    }

    return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
BOOL CConfirmDriverListPage::OnSetActive() 
{
    INT nItemsInList;
    BOOL bResult;

    m_TitleStatic.SetWindowText( m_strTitle );

    FillTheList();
    SortTheList();
    
    nItemsInList = m_DriversList.GetItemCount();

    if( nItemsInList < 1 )
    {
        //
        // No drivers have been selected to be verified
        //

        bResult = FALSE;
    }
    else
    {
        //
        // This is the last step of the wizard
        //

        m_pParentSheet->SetWizardButtons(   PSWIZB_BACK |
                                            PSWIZB_FINISH );

        bResult = CVerifierPropertyPage::OnSetActive();
    }

    return bResult;
}

/////////////////////////////////////////////////////////////////////////////
// CConfirmDriverListPage message handlers

BOOL CConfirmDriverListPage::OnInitDialog() 
{
	CVerifierPropertyPage::OnInitDialog();
	
    //
    // Setup the list
    //

    m_DriversList.SetExtendedStyle( 
        LVS_EX_FULLROWSELECT | m_DriversList.GetExtendedStyle() );

    SetupListHeader();

    VrfSetWindowText( m_NextDescription, IDS_CONFDRV_PAGE_NEXT_DESCR_FINISH );

    return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


/////////////////////////////////////////////////////////////////////////////
BOOL CConfirmDriverListPage::OnWizardFinish() 
{
	CVerifierPropertyPage::OnWizardFinish();

    return g_NewVerifierSettings.SaveToRegistry();
}

/////////////////////////////////////////////////////////////////////////////
void CConfirmDriverListPage::OnColumnclickConfdrvList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	
    if( 0 != pNMListView->iSubItem )
    {
        //
        // Clicked on the provider name column
        //

        if( m_nSortColumnIndex == pNMListView->iSubItem )
        {
            //
            // Change the current ascend/descend order for this column
            //

            m_bAscendSortProvName = !m_bAscendSortProvName;
        }
    }
    else
    {
        //
        // Clicked on the driver name column
        //

        if( m_nSortColumnIndex == pNMListView->iSubItem )
        {
            //
            // Change the current ascend/descend order for this column
            //

            m_bAscendSortDrvName = !m_bAscendSortDrvName;
        }
    }

    m_nSortColumnIndex = pNMListView->iSubItem;

    SortTheList();

    *pResult = 0;
}

/////////////////////////////////////////////////////////////
LONG CConfirmDriverListPage::OnHelp( WPARAM wParam, LPARAM lParam )
{
    LONG lResult = 0;
    LPHELPINFO lpHelpInfo = (LPHELPINFO)lParam;

    ::WinHelp( 
        (HWND) lpHelpInfo->hItemHandle,
        g_szVerifierHelpFile,
        HELP_WM_HELP,
        (DWORD_PTR) MyHelpIds );

    return lResult;
}

/////////////////////////////////////////////////////////////////////////////
void CConfirmDriverListPage::OnContextMenu(CWnd* pWnd, CPoint point) 
{
    ::WinHelp( 
        pWnd->m_hWnd,
        g_szVerifierHelpFile,
        HELP_CONTEXTMENU,
        (DWORD_PTR) MyHelpIds );
}