//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1998.
//
//  File:       CacheSet.h
//
//  Contents:   CCacheSettingsDlg implementation.  Allows the setting of file sharing 
//					caching options.
//
//----------------------------------------------------------------------------

#include "stdafx.h"
#include "CacheSet.h"
#include "filesvc.h"
#include <htmlhelp.h>

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

/////////////////////////////////////////////////////////////////////////////
// CCacheSettingsDlg dialog

CCacheSettingsDlg::CCacheSettingsDlg(
		CWnd*					pParent, 
		DWORD&					dwFlags)
	: CDialog(CCacheSettingsDlg::IDD, pParent),
	m_dwFlags (dwFlags)
{
	//{{AFX_DATA_INIT(CCacheSettingsDlg)
	m_bAllowCaching = FALSE;
	m_hintStr = _T("");
	//}}AFX_DATA_INIT

	m_bAllowCaching = !GetCachedFlag (m_dwFlags, CSC_CACHE_NONE);
}


void CCacheSettingsDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCacheSettingsDlg)
	DDX_Control(pDX, IDC_CACHE_OPTIONS, m_cacheOptionsCombo);
	DDX_Check(pDX, IDC_ALLOW_CACHING, m_bAllowCaching);
	DDX_Text(pDX, IDC_HINT, m_hintStr);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCacheSettingsDlg, CDialog)
	//{{AFX_MSG_MAP(CCacheSettingsDlg)
	ON_CBN_SELCHANGE(IDC_CACHE_OPTIONS, OnSelchangeCacheOptions)
	ON_BN_CLICKED(IDC_ALLOW_CACHING, OnAllowCaching)
	ON_MESSAGE(WM_HELP, OnHelp)
	ON_MESSAGE(WM_CONTEXTMENU, OnContextHelp)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCacheSettingsDlg message handlers

void CCacheSettingsDlg::OnSelchangeCacheOptions() 
{
	int	nIndex = m_cacheOptionsCombo.GetCurSel ();
	ASSERT (CB_ERR != nIndex);
	if ( CB_ERR != nIndex )
	{
		DWORD	dwData = (DWORD)m_cacheOptionsCombo.GetItemData (nIndex);

		switch (dwData)
		{
		case IDS_MANUAL_WORKGROUP_SHARE:
			VERIFY (m_hintStr.LoadString (IDS_MANUAL_WORKGROUP_SHARE_HINT));
			break;

		case IDS_AUTOMATIC_WORKGROUP_SHARE:
			VERIFY (m_hintStr.LoadString (IDS_AUTOMATIC_WORKGROUP_SHARE_HINT));
			break;

		case IDS_AUTOMATIC_APPLICATION_SHARE:
			VERIFY (m_hintStr.LoadString (IDS_AUTOMATIC_APPLICATION_SHARE_HINT));
			break;

		default:
			ASSERT (0);
			break;
		}
		UpdateData (FALSE);
	}
}

void CCacheSettingsDlg::OnAllowCaching() 
{
	UpdateData (TRUE);
	if ( m_bAllowCaching )
	{
		GetDlgItem(IDC_CACHE_SETTINGS_LABEL)->EnableWindow(TRUE);
		m_cacheOptionsCombo.EnableWindow (TRUE);
		CString	text;
		VERIFY (text.LoadString (IDS_MANUAL_WORKGROUP_SHARE));
		int	nIndex = m_cacheOptionsCombo.SelectString (-1, text);
		ASSERT (CB_ERR != nIndex);
		if ( CB_ERR != nIndex )
		{
			VERIFY (m_hintStr.LoadString (IDS_MANUAL_WORKGROUP_SHARE_HINT));
			UpdateData (FALSE);
		}
	}
	else
	{
		GetDlgItem(IDC_CACHE_SETTINGS_LABEL)->EnableWindow(FALSE);
		m_cacheOptionsCombo.SetCurSel (-1);
		m_cacheOptionsCombo.EnableWindow (FALSE);
		m_hintStr = L"";
		UpdateData (FALSE);
	}
}


BOOL CCacheSettingsDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	CString	text;

	// Add the various caching options to the combo box.
	// Save the string ID in the item data for easy recognition of the
	// contents of the selected item.
	// If the given cache value is set, select the item and put its hint in the
	// hint field.
	VERIFY (text.LoadString (IDS_MANUAL_WORKGROUP_SHARE));
	int	nIndex = m_cacheOptionsCombo.AddString (text);
	ASSERT (CB_ERR != nIndex && CB_ERRSPACE != nIndex);
	if (CB_ERR == nIndex || CB_ERRSPACE == nIndex)
		return TRUE;
	VERIFY (CB_ERR != m_cacheOptionsCombo.SetItemData (nIndex, IDS_MANUAL_WORKGROUP_SHARE));
	if ( GetCachedFlag (m_dwFlags, CSC_CACHE_MANUAL_REINT) )
	{
		VERIFY (CB_ERR != m_cacheOptionsCombo.SetCurSel (nIndex));
		VERIFY (m_hintStr.LoadString (IDS_MANUAL_WORKGROUP_SHARE_HINT));
		UpdateData (FALSE);
	}

	VERIFY (text.LoadString (IDS_AUTOMATIC_WORKGROUP_SHARE));
	nIndex = m_cacheOptionsCombo.AddString (text);
	ASSERT (CB_ERR != nIndex && CB_ERRSPACE != nIndex);
	if (CB_ERR == nIndex || CB_ERRSPACE == nIndex)
		return TRUE;
	VERIFY (CB_ERR != m_cacheOptionsCombo.SetItemData (nIndex, IDS_AUTOMATIC_WORKGROUP_SHARE));
	if ( GetCachedFlag (m_dwFlags, CSC_CACHE_AUTO_REINT) )
	{
		VERIFY (CB_ERR != m_cacheOptionsCombo.SetCurSel (nIndex));
		VERIFY (m_hintStr.LoadString (IDS_AUTOMATIC_WORKGROUP_SHARE_HINT));
		UpdateData (FALSE);
	}
	
	VERIFY (text.LoadString (IDS_AUTOMATIC_APPLICATION_SHARE));
	nIndex = m_cacheOptionsCombo.AddString (text);
	ASSERT (CB_ERR != nIndex && CB_ERRSPACE != nIndex);
	if (CB_ERR == nIndex || CB_ERRSPACE == nIndex)
		return TRUE;
	VERIFY (CB_ERR != m_cacheOptionsCombo.SetItemData (nIndex, IDS_AUTOMATIC_APPLICATION_SHARE));
	if ( GetCachedFlag (m_dwFlags, CSC_CACHE_VDO) )
	{
		VERIFY (CB_ERR != m_cacheOptionsCombo.SetCurSel (nIndex));
		VERIFY (m_hintStr.LoadString (IDS_AUTOMATIC_APPLICATION_SHARE_HINT));
		UpdateData (FALSE);
	}

	// Disable able the caching options combo box if caching is not allowed
	if ( !m_bAllowCaching )
	{
		m_cacheOptionsCombo.EnableWindow (FALSE);
		m_hintStr = L"";
		UpdateData (FALSE);
	}
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CCacheSettingsDlg::OnOK() 
{
	DWORD	dwNewFlag = 0;

	if ( !m_bAllowCaching )
		dwNewFlag = CSC_CACHE_NONE;
	else 
	{
		int	nIndex = m_cacheOptionsCombo.GetCurSel ();
		ASSERT (CB_ERR != nIndex);
		if ( CB_ERR != nIndex )
		{
			DWORD	dwData = (DWORD)m_cacheOptionsCombo.GetItemData (nIndex);

			switch (dwData)
			{
			case IDS_MANUAL_WORKGROUP_SHARE:
				dwNewFlag = CSC_CACHE_MANUAL_REINT;
				break;

			case IDS_AUTOMATIC_WORKGROUP_SHARE:
				dwNewFlag = CSC_CACHE_AUTO_REINT;
				break;

			case IDS_AUTOMATIC_APPLICATION_SHARE:
				dwNewFlag = CSC_CACHE_VDO;
				break;

			default:
				ASSERT (0);
				break;
			}
		}
	}

	SetCachedFlag (&m_dwFlags, dwNewFlag);
	
	CDialog::OnOK();
}

BOOL CCacheSettingsDlg::GetCachedFlag( DWORD dwFlags, DWORD dwFlagToCheck )
{
    return (dwFlags & CSC_MASK) == dwFlagToCheck;
}

VOID CCacheSettingsDlg::SetCachedFlag( DWORD* pdwFlags, DWORD dwNewFlag )
{
    *pdwFlags &= ~CSC_MASK;

	*pdwFlags |= dwNewFlag;
}

/////////////////////////////////////////////////////////////////////
//	Help
BOOL CCacheSettingsDlg::OnHelp(WPARAM /*wParam*/, LPARAM lParam)
{
	return DoHelp(lParam, HELP_DIALOG_TOPIC(IDD_SMB_CACHE_SETTINGS));
}

BOOL CCacheSettingsDlg::OnContextHelp(WPARAM wParam, LPARAM /*lParam*/)
{
	return DoContextHelp(wParam, HELP_DIALOG_TOPIC(IDD_SMB_CACHE_SETTINGS));
}

///////////////////////////////////////////////////////////////////////////////
//	CacheSettingsDlg ()
//
//	Invoke a dialog to set/modify cache settings for a share
//
//	RETURNS
//	Return S_OK if the user clicked on the OK button.
//	Return S_FALSE if the user clicked on the Cancel button.
//	Return E_OUTOFMEMORY if there is not enough memory.
//	Return E_UNEXPECTED if an expected error occured (eg: bad parameter)
//
///////////////////////////////////////////////////////////////////////////////

HRESULT
CacheSettingsDlg(
	HWND hwndParent,	// IN: Parent's window handle
	DWORD& dwFlags)		// IN & OUT: share flags
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	ASSERT(::IsWindow(hwndParent));

	HRESULT					hResult = S_OK;
	CWnd					parentWnd;

	parentWnd.Attach (hwndParent);
	CCacheSettingsDlg dlg (&parentWnd, dwFlags);
	CThemeContextActivator activator;
	if (IDOK != dlg.DoModal())
		hResult = S_FALSE;

	parentWnd.Detach ();

	return hResult;
} // CacheSettingsDlg()