// HMResultsPaneItem.cpp: implementation of the CHMResultsPaneItem class.
//
//////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000 Microsoft Corporation
//
// 04/06/00 v-marfin 62935 : Show "OK" Instead of "Reset" in the upper pane only
//
//
//
//
#include "stdafx.h"
#include "snapin.h"
#include "HMResultsPaneItem.h"
#include "HealthmonResultsPane.h"
#include "..\HMListView\HMList.h"

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

IMPLEMENT_DYNCREATE(CHMResultsPaneItem,CResultsPaneItem)

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CHMResultsPaneItem::CHMResultsPaneItem()
{

}

CHMResultsPaneItem::~CHMResultsPaneItem()
{
	Destroy();
}

/////////////////////////////////////////////////////////////////////////////
// MMC-Related Members

bool CHMResultsPaneItem::InsertItem(CResultsPane* pPane, int nIndex, bool bResizeColumns /*= false*/)
{
	TRACEX(_T("CHMResultsPaneItem::InsertItem\n"));
	TRACEARGn(pPane);
	TRACEARGn(nIndex);
	TRACEARGn(bResizeColumns);

	if( ! GfxCheckObjPtr(pPane,CHealthmonResultsPane) )
	{
		TRACE(_T("FAILED : pPane is not a valid pointer.\n"));
		return false;
	}

	CHealthmonResultsPane* pHMRP = (CHealthmonResultsPane*)pPane;

	_DHMListView* pList = NULL;
	
	if( IsUpperPane() )
	{
		pList = pHMRP->GetUpperListCtrl();
	}
	else if( IsLowerPane() )
	{
		pList = pHMRP->GetLowerListCtrl();
	}
	else if( IsStatsPane() )
	{
		pList = pHMRP->GetStatsListCtrl();
	}
	else
	{
		TRACE(_T("WARNING : Column has not been assigned to a results pane in the split view.\n"));
		ASSERT(FALSE);
	}

	if( ! pList )
	{
		TRACE(_T("FAILED : Results Pane's list control has not been intialized.\n"));
		return false;		
	}

#ifndef IA64
	if( pList->FindItemByLParam((long)this) >= 0 ) // needs ptr fixing
	{
		return true;
	}
#endif // IA64

  if( IsLowerPane() )
  {
    // check filters
    CStringArray saFilters;
    CDWordArray dwaFilterTypes;
    CString sFilter;
    BSTR bsFilter = NULL;
    long lType = -1L;

    long lColumnCount = pList->GetColumnCount();

    for( long l = 0L; l < lColumnCount; l++ )
    {
      pList->GetColumnFilter(l,&bsFilter,&lType);
      sFilter = bsFilter;
      saFilters.Add(sFilter);
      dwaFilterTypes.Add(lType);
      SysFreeString(bsFilter);
    }

    bool bItemPassed = true;

    for( l = 0L; l < lColumnCount; l++ )
    {
      if( dwaFilterTypes[l] == HDFS_CONTAINS )
      {
        if( saFilters[l] != _T("") && GetDisplayName(l).Find(saFilters[l]) == -1 )
        {
          bItemPassed = false;
          break;
        }
      }
      else if( dwaFilterTypes[l] == HDFS_DOES_NOT_CONTAIN )
      {
        if( saFilters[l] != _T("") && GetDisplayName(l).Find(saFilters[l]) != -1 )
        {
          bItemPassed = false;
          break;
        }
      }
      else if( dwaFilterTypes[l] == HDFS_STARTS_WITH )
      {
        if( saFilters[l] != _T("") && GetDisplayName(l).Find(saFilters[l]) != 0 )
        {
          bItemPassed = false;
          break;
        }
      }
      else if( dwaFilterTypes[l] == HDFS_ENDS_WITH )
      {
        if( saFilters[l] != _T("") && GetDisplayName(l).Find(saFilters[l]) != GetDisplayName(l).GetLength() - saFilters[l].GetLength() )
        {
          bItemPassed = false;
          break;
        }
      }
      else if( dwaFilterTypes[l] == HDFS_IS )
      {
        if( saFilters[l] != _T("") && GetDisplayName(l) != saFilters[l] )
        {
          bItemPassed = false;
          break;
        }
      }      
      else if( dwaFilterTypes[l] == HDFS_IS_NOT )
      {
        if( saFilters[l] != _T("") && GetDisplayName(l) == saFilters[l] )
        {
          bItemPassed = false;
          break;
        }
      }      

    }

    if( ! bItemPassed )
    {
      return true;
    }
  }

	// insert the item	
	DWORD dwlvif = LVIF_TEXT|LVIF_PARAM;
	int iIconIndex = -1;
	if( m_IconResIds.GetSize() > 0 )
	{
		dwlvif |= LVIF_IMAGE;
		iIconIndex = pHMRP->GetIconIndex(GetIconId(),m_Pane);
	}

	int iResult=0;

#ifndef IA64
	iResult = pList->InsertItem(dwlvif,
																	IsUpperPane() ? nIndex : 0,
																	(LPCTSTR)GetDisplayName(),
																	-1L,
																	-1L,
																	iIconIndex,
																	(long)this);
#endif // IA64


	// insert the subitems
	for(int i = 1; i < m_saDisplayNames.GetSize(); i++ )
	{
#ifndef IA64
		iResult = pList->SetItem(IsUpperPane() ? nIndex : 0,
														 i,
														 LVIF_TEXT,
														 (LPCTSTR)GetDisplayName(i),
														 -1L,
														 -1L,
														 -1L,
														 (long)this);
#endif // IA64

		if( iResult == -1 )
		{
			TRACE(_T("FAILED : CHMListCtrl::InsertItem failed.\n"));
		}

		if( GetDisplayName(i).IsEmpty() && bResizeColumns )
		{
			pList->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER);
		}
	}

	if( iResult == -1 )
	{
		TRACE(_T("FAILED : CHMListCtrl::InsertItem failed.\n"));
		return false;
	}

	if( bResizeColumns )
	{
		/*
		int iColWidth = 0;
		int iStrWidth = 0;

		// set the widths of the columns for this item
		for( int  i = 0; i < m_saDisplayNames.GetSize(); i++ )
		{
			// get the width in pixels of the item
			iStrWidth = pList->GetStringWidth((LPCTSTR)m_saDisplayNames[i]) + 16;
			iColWidth = pList->GetColumnWidth(i);
			if( iStrWidth > iColWidth && iStrWidth > 10 )
				pList->SetColumnWidth(i,iStrWidth);
		}
		*/
	}


  return true;
}

bool CHMResultsPaneItem::SetItem(CResultsPane* pPane)
{
	TRACEX(_T("CHMResultsPaneItem::SetItem\n"));
	TRACEARGn(pPane);

	if( ! GfxCheckObjPtr(pPane,CHealthmonResultsPane) )
	{
		TRACE(_T("FAILED : pPane is not a valid pointer.\n"));
		return false;
	}

	CHealthmonResultsPane* pHMRP = (CHealthmonResultsPane*)pPane;

	_DHMListView* pList = NULL;
    BOOL bUpperPane = FALSE;  // 62935 : Show "OK" Instead of "Reset" in the upper pane only

	int iIndex = -1;	
	if( IsUpperPane() )
	{
		pList = pHMRP->GetUpperListCtrl();
        bUpperPane=TRUE; // 62935 : Show "OK" Instead of "Reset" in the upper pane only
	}
	else if( IsLowerPane() )
	{
		pList = pHMRP->GetLowerListCtrl();
	}
	else if( IsStatsPane() )
	{
		pList = pHMRP->GetStatsListCtrl();
	}
	else
	{
		TRACE(_T("WARNING : Column has not been assigned to a results pane in the split view.\n"));
		ASSERT(FALSE);
	}

	if( ! pList )
	{
		TRACE(_T("FAILED : Results Pane's list control has not been intialized.\n"));
		return false;		
	}

#ifndef IA64
	iIndex = pList->FindItemByLParam((long)this);
#endif // IA64


	// set the item

	DWORD dwlvif = LVIF_TEXT;
	int iIconIndex = -1;
	if( m_IconResIds.GetSize() > 0 )
	{
		dwlvif |= LVIF_IMAGE;
		iIconIndex = pHMRP->GetIconIndex(GetIconId(),m_Pane);
	}

	int iResult=0;

#ifndef IA64
	iResult = pList->SetItem(iIndex,
															 0,
															 dwlvif,
															 (LPCTSTR)GetDisplayName(),
															 iIconIndex,
															 -1L,
															 -1L,
															 (long)this);
#endif // IA64
															 																
    // 62935 : Show "OK" Instead of "Reset" in the upper pane only
    CString sOK;
    sOK.LoadString(IDS_STRING_OK);
    CString sReset;
    sReset.LoadString(IDS_STRING_RESET);

	// insert the subitems
	for(int i = 1; i < m_saDisplayNames.GetSize(); i++ )
	{
        CString sTest = GetDisplayName(i);

#ifndef IA64
		iResult = pList->SetItem(iIndex,
														 i,
														 LVIF_TEXT,
					                                     //(LPCTSTR)GetDisplayName(i),  // 62935
             (i==1 && bUpperPane && GetDisplayName(i) == sReset) ? (LPCTSTR)sOK : (LPCTSTR)GetDisplayName(i), // 62935														 -1L,
														 -1L,
														 -1L,
														 -1L,
														 (long)this);
#endif // IA64

		if( iResult == -1 )
		{
			TRACE(_T("FAILED : CHMListCtrl::InsertItem failed.\n"));
		}
	}

	if( iResult == -1 )
	{
		TRACE(_T("FAILED : CHMListCtrl::InsertItem failed.\n"));
		return false;
	}

	return true;
}

bool CHMResultsPaneItem::RemoveItem(CResultsPane* pPane)
{
	TRACEX(_T("CHMResultsPaneItem::RemoveItem\n"));
	TRACEARGn(pPane);

	if( ! GfxCheckObjPtr(pPane,CHealthmonResultsPane) )
	{
		TRACE(_T("FAILED : pPane is an invalid pointer.\n"));
		return false;
	}

	if( ! GfxCheckObjPtr(pPane,CHealthmonResultsPane) )
	{
		TRACE(_T("FAILED : pPane is not a valid pointer.\n"));
		return false;
	}

	CHealthmonResultsPane* pHMRP = (CHealthmonResultsPane*)pPane;

	_DHMListView* pList = NULL;

	int iIndex = -1;	
	if( IsUpperPane() )
	{
		pList = pHMRP->GetUpperListCtrl();
	}
	else if( IsLowerPane() )
	{
		pList = pHMRP->GetLowerListCtrl();
	}
	else if( IsStatsPane() )
	{
		pList = pHMRP->GetStatsListCtrl();
	}
	else
	{
		TRACE(_T("WARNING : Column has not been assigned to a results pane in the split view.\n"));
		ASSERT(FALSE);
	}

	if( ! pList )
	{
		TRACE(_T("FAILED : Results Pane's list control has not been intialized.\n"));
		return false;		
	}

#ifndef IA64
	iIndex = pList->FindItemByLParam((long)this);
#endif // IA64

	if( iIndex == -1 )
	{
		return false;
	}

	return pList->DeleteItem(iIndex) ? TRUE : FALSE;
}

/////////////////////////////////////////////////////////////////////////////
// MMC Notify Handlers
/////////////////////////////////////////////////////////////////////////////

HRESULT CHMResultsPaneItem::OnAddMenuItems(LPCONTEXTMENUCALLBACK piCallback,long __RPC_FAR *pInsertionAllowed)
{
	TRACEX(_T("CHMResultsPaneItem::OnAddMenuItems\n"));
	TRACEARGn(piCallback);
	TRACEARGn(pInsertionAllowed);

	HRESULT hr = S_OK;

  // Add New Menu Items
  if( CCM_INSERTIONALLOWED_NEW & *pInsertionAllowed )
  {
    // TODO: Add any context menu items for the New Menu here
  }

  // Add Task Menu Items
  if( CCM_INSERTIONALLOWED_TASK & *pInsertionAllowed )
  {
	  // TODO: Add any context menu items for the Task Menu here
  }

	  // Add Top Menu Items
  if( CCM_INSERTIONALLOWED_TOP & *pInsertionAllowed )
  {
		CONTEXTMENUITEM cmi;
    CString sResString;
    CString sResString2;

		// Cut
    sResString.LoadString(IDS_STRING_CUT);
		cmi.strName           = LPTSTR(LPCTSTR(sResString));    
		cmi.strStatusBarText  = NULL;
		cmi.lCommandID        = IDM_CUT;
		cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP;
		cmi.fFlags            = 0;
		cmi.fSpecialFlags     = 0;

		hr = piCallback->AddItem(&cmi);
    if( !SUCCEEDED(hr) )
    {
      TRACE(_T("FAILED : IContextMenuCallback::AddItem failed.\n"));
      return hr;
    }	  

		// Copy
    sResString.LoadString(IDS_STRING_COPY);
		cmi.strName           = LPTSTR(LPCTSTR(sResString));    
		cmi.strStatusBarText  = NULL;
		cmi.lCommandID        = IDM_COPY;
		cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP;
		cmi.fFlags            = 0;
		cmi.fSpecialFlags     = 0;

		hr = piCallback->AddItem(&cmi);
    if( !SUCCEEDED(hr) )
    {
      TRACE(_T("FAILED : IContextMenuCallback::AddItem failed.\n"));
      return hr;
    }	  

  }


	return S_OK;
}

HRESULT CHMResultsPaneItem::OnCommand(CResultsPane* pPane, long lCommandID)
{
	TRACEX(_T("CHMResultsPaneItem::OnCommand\n"));
	TRACEARGn(lCommandID);

	return S_OK;
}