//	**************************************************************************************
//	File:			LeashDebugWindow.cpp  
//	By:				Arthur David Leather
//	Created:		12/02/98
//	Copyright		@1998 Massachusetts Institute of Technology - All rights reserved.
//	Description:	CPP file for LeashDebugWindow.h. Contains variables and functions 
//					for the Leash Debug Window
//
//	History:
//
//	MM/DD/YY	Inits	Description of Change
//	12/02/98	ADL		Original
//	**************************************************************************************



#include "stdafx.h"
#include "leash.h"
#include "LeashDebugWindow.h"
#include "lglobals.h"

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

/////////////////////////////////////////////////////////////////////////////
// CLeashDebugWindow dialog


CLeashDebugWindow::CLeashDebugWindow(CWnd* pParent /*=NULL*/)
	: CDialog(CLeashDebugWindow::IDD, pParent)
{
	//{{AFX_DATA_INIT(CLeashDebugWindow)
	//}}AFX_DATA_INIT

	m_pView = NULL;
}

CLeashDebugWindow::CLeashDebugWindow(CFormView* pView)
{
	m_pView = pView;
}

void CLeashDebugWindow::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CLeashDebugWindow)
	DDX_Control(pDX, IDC_DEBUG_LISTBOX, m_debugListBox);
	DDX_Control(pDX, IDC_LOG_FILE_LOCATION_TEXT, m_debugFile);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CLeashDebugWindow, CDialog)
	//{{AFX_MSG_MAP(CLeashDebugWindow)
	ON_WM_SHOWWINDOW()
	ON_BN_CLICKED(IDC_COPY_TO_CLIPBOARD, OnCopyToClipboard)
	ON_WM_DESTROY()
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLeashDebugWindow message handlers


BOOL CLeashDebugWindow::Create(const LPCSTR debugFilePath) 
{
	m_debugFilePath = debugFilePath;
	return CDialog::Create(CLeashDebugWindow::IDD);	
}


void CLeashDebugWindow::OnCancel()  
{
	if (m_pView != NULL) 
	{
		CWinApp* pApp; 
		pApp = AfxGetApp();
		pApp->WriteProfileInt("Settings", "DebugWindow", FALSE_FLAG); 
		m_pView->PostMessage(WM_GOODBYE, IDCANCEL);	// modeless case 
        pset_krb_debug(OFF);
	    pset_krb_ap_req_debug(OFF);
    }
	else 
	{
		CDialog::OnCancel(); // modal case
	}
}

void CLeashDebugWindow::OnOK() 
{
	if (m_pView != NULL) 
	{
		// modeless case 
		UpdateData(TRUE);
		m_pView->PostMessage(WM_GOODBYE, IDOK);
	}
	else 
	{
		CDialog::OnOK(); // modal case
	}
}

BOOL CLeashDebugWindow::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// Set Debug flags 
	pset_krb_debug(ON); //(int)m_debugListBox.GetSafeHwnd()
    pset_krb_ap_req_debug(ON);	
	
	if (*m_debugFilePath != 0) 
	  SetDlgItemText(IDC_LOG_FILE_LOCATION_TEXT, m_debugFilePath);
    else
	  SetDlgItemText(IDC_LOG_FILE_LOCATION_TEXT, "Not Available");

	if (!m_debugListBox.GetCount())
	  GetDlgItem(IDC_COPY_TO_CLIPBOARD)->EnableWindow(FALSE);
	
	m_CopyButton = FALSE;
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CLeashDebugWindow::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CDialog::OnShowWindow(bShow, nStatus);
}

void CLeashDebugWindow::OnCopyToClipboard() 
{
    if (!OpenClipboard())
	{
        MessageBox("Unable to open Clipboard!", "Error", MB_OK);
		return; 
	}
    
	EmptyClipboard(); 
 
    int maxItems = m_debugListBox.GetCount();
	const int MAX_MEM = maxItems * 90; // 90 chars per line seems safe like a safe bet	

	HGLOBAL hDebugText = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, MAX_MEM); 
    if (NULL != hDebugText) 
    { 
		CString listboxItem;
		LPSTR pDebugText = (LPSTR) GlobalLock(hDebugText); 
		if (!pDebugText)
		{
		    MessageBox("Unable to write to Clipboard!", "Error", MB_OK);
			ASSERT(pDebugText);
			return; 
		}
    
		*pDebugText = 0;
		for (int xItem = 0; xItem < maxItems; xItem++)
		{
			m_debugListBox.GetText(xItem, listboxItem);
			strcat(pDebugText, listboxItem); 
			strcat(pDebugText, "\r\n");
		}
	
		GlobalUnlock(hDebugText); 
    } 

    if (NULL != hDebugText) 
        SetClipboardData(CF_TEXT, hDebugText); 
   
	CloseClipboard(); 
	MessageBox("Copy to Clipboard was Successful!\r\n Paste it in your favorite editor.", 
                "Note", MB_OK);
}

BOOL CLeashDebugWindow::PreTranslateMessage(MSG* pMsg) 
{
	if (!m_CopyButton && m_debugListBox.GetCount())
	{  
		m_CopyButton = TRUE; 
		GetDlgItem(IDC_COPY_TO_CLIPBOARD)->EnableWindow(TRUE);
	}
	
	return CDialog::PreTranslateMessage(pMsg);
}
