// ManagerDlg.cpp : implementation file
//

#include "stdafx.h"
#include "smsmanager.h"
#include "ManagerDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CManagerDlg dialog
#include "MainFrm.h"
#include "ProcessSocket.h"
#include "DLG_Manager_Modify.h"

CManagerDlg::CManagerDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CManagerDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CManagerDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_bInit = false;
	m_bRefresh = false;
}


void CManagerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CManagerDlg)
	DDX_Control(pDX, IDC_MANAGER_LIST, m_wndList);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CManagerDlg, CDialog)
	//{{AFX_MSG_MAP(CManagerDlg)
	ON_WM_SIZE()
	ON_NOTIFY(NM_DBLCLK, IDC_MANAGER_LIST, OnDblclkManagerList)
	ON_NOTIFY(NM_RCLICK, IDC_MANAGER_LIST, OnRclickManagerList)
	//}}AFX_MSG_MAP
	ON_COMMAND( MENU_MANAGER_ADD    , On_User_Add)
	ON_COMMAND( MENU_MANAGER_MODIFY , On_User_Modify)
	ON_COMMAND( MENU_MANAGER_DEL    , On_User_Del)
	ON_COMMAND( MENU_MANAGER_REFRESH, On_User_Refresh)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CManagerDlg message handlers

void CManagerDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	if ( m_bInit )
	{
		m_wndList.MoveWindow( 0 , 0 , cx,cy);
	}
}

BOOL CManagerDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	//ȡ�ù��ò���
	//CMainFrame * pFrame = static_cast <CMainFrame *>((CMainFrame *)AfxGetMainWnd());
	this->GetParent()->GetParentFrame();
	m_pMainFrame = (CMainFrame *)this->GetParent()->GetParentFrame();
	m_pSocket    = &m_pMainFrame->m_Socket;

	//��ʼ��List
	m_Image.Create(16,16,ILC_COLOR16|ILC_MASK,5,5);
	m_Image.Add(AfxGetApp()->LoadIcon(IDI_L_MANAGER) );
	m_Image.Add(AfxGetApp()->LoadIcon(IDI_L_LOCK) );
	m_wndList.SubClassWindow2();
	m_wndList.SetHeadings(_T("���,50;��¼��,80;�û���,80;��¼����,75;����ʱ��,75;����,80;ְ��,80;�绰,80;�ֻ�,80;Email,80;"));
	m_wndList.SetGridLines(true);
	m_wndList.SetImageList(&m_Image,LVSIL_SMALL);



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

BOOL CManagerDlg::ReShow(BOOL bRefresh)
{
	ShowWindow( SW_SHOW );
	if ( bRefresh || !m_bRefresh )
	{
		RefreshInfo();
	}
	return true;
}

BOOL CManagerDlg::ReHide()
{
	ShowWindow( SW_HIDE );
	return true;
}

BOOL CManagerDlg::RefreshInfo()
{
	if ( !m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_SEE) )
	{
		return false;
	}
	m_pMainFrame->SendFrame(SMSFUNC_GETMANAGER,NULL,0);
	return true;
}

BOOL CManagerDlg::ProcessSocket(Socket_Head *pHead)
{
	//ȡ����Ա��Ϣ
	if (pHead->lFuncType == SMSFUNC_GETMANAGER)
	{
		m_bRefresh = true;  //�Ѿ�ˢ�¹�
		ANS_GetManager * pManager = (ANS_GetManager *)pHead->pFrame;
		ANS_GetManagerData * pData = (ANS_GetManagerData *)(pHead->pFrame+sizeof(ANS_GetManager));
		m_wndList.DeleteAllItems(); //ɾ��ԭ�е�����
		this->Close();              //�ر�ԭ����
		TCHAR Buf[32];
		for ( int i=0;i<pManager->lCount;i++ )
		{
			ANS_GetManagerData * pNewData = new ANS_GetManagerData;
			*pNewData = *pData;
			POSITION pos = m_Manager.AddTail(pNewData);
			//���,50;��¼��,80;�û���,80;��¼����,75;����ʱ��,75;����,80;ְ��,80;�绰,80;�ֻ�,80;Email,80;"));
			_stprintf(Buf , _T("%d") , i+1 );
			m_wndList.InsertItem( i , Buf , 0 );
			m_wndList.SetItemData( i , (DWORD)pos );    //��Pos
			m_wndList.SetItemText(i,1,pData->szLoginName);
			m_wndList.SetItemText(i,2,pData->szName);
			m_wndList.SetItemText(i,3,_itot(pData->lLoginCount,Buf,10));
			_stprintf( Buf , _T("%02d:%02d:%02d") , pData->tLoginTime.wHour,pData->tLoginTime.wMinute,pData->tLoginTime.wSecond);
			m_wndList.SetItemText(i,4,Buf);
			m_wndList.SetItemText(i,5,pData->szBranch);
			m_wndList.SetItemText(i,6,pData->szJob);
			m_wndList.SetItemText(i,7,pData->szTel);
			m_wndList.SetItemText(i,8,pData->szMobile);
			m_wndList.SetItemText(i,9,pData->szEmail);
			pData ++;
		}
		return true;
	}
	//�޸Ĺ���Ա��Ϣ
	if (pHead->lFuncType == SMSFUNC_MANAGER_MODIFY)
	{
		ANS_Manager_Modify * pModify = (ANS_Manager_Modify *)pHead->pFrame;
		ANS_GetManagerData * pData = (ANS_GetManagerData *)(pHead->pFrame+sizeof(ANS_Manager_Modify));
		SetLockItem( pModify->lItem , false );  //����
		if ( pModify->lCount == 1 )  //����1ʱ��ʾ�޸ijɹ�
		{
			POSITION pos = (POSITION)m_wndList.GetItemData(pModify->lItem);
			ANS_GetManagerData * pData2 = m_Manager.GetNext( pos );
			if ( pData2 )
			{
				*pData2 = *pData;    //ȡ���µ�����
				//�����µ�����
				m_wndList.SetItemText( pModify->lItem , 1 , pData->szLoginName );
				m_wndList.SetItemText( pModify->lItem , 2 , pData->szName );
				m_wndList.SetItemText( pModify->lItem , 5 , pData->szBranch );
				m_wndList.SetItemText( pModify->lItem , 6 , pData->szJob );
				m_wndList.SetItemText( pModify->lItem , 7 , pData->szTel );
				m_wndList.SetItemText( pModify->lItem , 8 , pData->szMobile );
				m_wndList.SetItemText( pModify->lItem , 9 , pData->szEmail );
			}
		}
		return true;
	}
	//���ӹ���Ա
	if (pHead->lFuncType == SMSFUNC_MANAGER_ADD)
	{
		ANS_Manager_Add * pAdd = (ANS_Manager_Add *)pHead->pFrame;
		ANS_GetManagerData * pData = (ANS_GetManagerData *)(pHead->pFrame+sizeof(ANS_Manager_Add));
		if ( pAdd->lCount == 1 )  //����1ʱ��ʾ�޸ijɹ�
		{
			long lCount = m_wndList.GetItemCount();
			TCHAR Buf[32];
			_stprintf( Buf, _T("%d") , lCount +1 );
			//�����µ�����
			m_wndList.InsertItem( lCount , Buf , 0 );
			m_wndList.SetItemText( lCount , 1 , pData->szLoginName );
			m_wndList.SetItemText( lCount , 2 , pData->szName );
			m_wndList.SetItemText( lCount , 3 , _T("0") );   //�´�������¼������Ȼ��0
			m_wndList.SetItemText( lCount , 4 , _T("")  );   //�´���������ʱ����Ȼ��00:00:00
			m_wndList.SetItemText( lCount , 5 , pData->szBranch );
			m_wndList.SetItemText( lCount , 6 , pData->szJob );
			m_wndList.SetItemText( lCount , 7 , pData->szTel );
			m_wndList.SetItemText( lCount , 8 , pData->szMobile );
			m_wndList.SetItemText( lCount , 9 , pData->szEmail );
			ANS_GetManagerData * pData2 = new ANS_GetManagerData;
			*pData2 = *pData;
			POSITION pos = m_Manager.AddTail( pData2 );
			m_wndList.SetItemData( lCount, (DWORD)pos );
			//������ص��û�ID����������ˢ��
			if ( pData->lManagerID <= 0 )
			{
				RefreshInfo();
			}
		}
		return true;
	}
	//ɾ������Ա
	if (pHead->lFuncType == SMSFUNC_MANAGER_DEL)
	{
		ANS_Manager_Del     * pDel     = (ANS_Manager_Del     *)pHead->pFrame;
		ANS_Manager_DelData * pDelData = (ANS_Manager_DelData *)(pHead->pFrame+sizeof(ANS_Manager_Del));
		POSITION pos,pos2;
		ANS_GetManagerData  * pManagerData;
		for ( int i = pDel->lCount-1 ; i>=0 ; i-- )
		{
			if ( pDelData[i].lUserID )  //ɾ���ɹ�
			{
				pos = (POSITION)m_wndList.GetItemData( pDelData[i].lItem );
				pos2 = pos;
				pManagerData = m_Manager.GetNext( pos );
				if ( pManagerData->lManagerID == pDelData[i].lUserID )  //ID��ͬ�IJſ�ɾ��
				{
					delete pManagerData;       //��ɾ������
					m_Manager.RemoveAt(pos2);   //���б���ɾ��
					m_wndList.DeleteItem(pDelData[i].lItem); //��ListCtrl��ɾ��
				}
			}
		}
		return true;
	}
	return false;
}

void CManagerDlg::Close()
{
	//������������
	while (!m_Manager.IsEmpty())
	{
		ANS_GetManagerData * pManager = m_Manager.GetHead();
		m_Manager.RemoveHead();
		delete pManager;
	}
}


void CManagerDlg::OnDblclkManagerList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	On_User_Modify();
	
	*pResult = 0;
}
void CManagerDlg::On_User_Add()
{
	if ( !m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_ADD) )
	{
		return ;
	}

	ANS_GetManagerData managerData={0};
	managerData.ulPurview = m_pMainFrame->m_ulPurview;   //Ȩ�����Լ�����ͬ
	DLG_Manager_Modify dlg(this);
	dlg.SetParam( managerData,0,managerData.ulPurview,true,true,true);
	if ( dlg.DoModal() == IDOK )
	{
		long lSize = sizeof(REQ_Manager_Add)+sizeof(ANS_GetManagerData);
		BYTE * pAddData = new BYTE[lSize];memset(pAddData,0,lSize);
		REQ_Manager_Add * pAdd = (REQ_Manager_Add *)pAddData;   //ͷ
		ANS_GetManagerData * pManagerData = (ANS_GetManagerData *)(pAddData+sizeof(REQ_Manager_Add));
		*pManagerData = dlg.GetParam();
		pAdd->lCount = 1;
		m_pMainFrame->SendFrame( SMSFUNC_MANAGER_ADD , pAddData , lSize );
	}
}
void CManagerDlg::On_User_Modify()
{
	if ( !m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_MODIFY) )
	{
		return ;
	}
	long lItem = GetCurrentSelected();
	if ( lItem < 0 )
		return ;

	if (isLockItem(lItem))
	{
		return ;
	}

	POSITION pos = (POSITION)m_wndList.GetItemData(lItem);
	POSITION pos2 = pos;
	ANS_GetManagerData * pData = m_Manager.GetNext( pos );
	if (pData)
	{
		DLG_Manager_Modify dlg(this);
		dlg.SetParam( *pData,pos2,m_pMainFrame->m_ulPurview,m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_MODIFYPURVIEW,false),m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_RESETPASSWD,false),false);
		if ( dlg.DoModal() == IDOK )
		{

			SetLockItem( lItem ,true);
			long lSize = sizeof(REQ_Manager_Modify)+sizeof(ANS_GetManagerData);
			BYTE * pModifyData = new BYTE[lSize];memset(pModifyData,0,lSize);
			REQ_Manager_Modify * pModify = (REQ_Manager_Modify *)pModifyData;   //ͷ
			ANS_GetManagerData * pManagerData = (ANS_GetManagerData *)(pModifyData+sizeof(REQ_Manager_Modify));
			*pManagerData = dlg.GetParam();
			pModify->lItem  = lItem;
			pModify->lCount = 1;
			m_pMainFrame->SendFrame( SMSFUNC_MANAGER_MODIFY , pModifyData , lSize );

		}
	}
}
void CManagerDlg::On_User_Del()
{
	if ( !m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_DEL) )
	{
		return ;
	}
	long lRet = MessageBox( _T("�˲�������ɾ������Ա���Ƿ������") , _T("����") , MB_ICONQUESTION|MB_YESNOCANCEL|MB_DEFBUTTON2);
	if ( lRet != IDYES )
		return;

	long lCount = m_wndList.GetSelectedCount();
	long lSize = sizeof(REQ_Manager_Del)+sizeof(ANS_Manager_DelData)*lCount;
	BYTE * pDelSend = new BYTE[lSize];memset(pDelSend,0,lSize);
	REQ_Manager_Del     * pDel = (REQ_Manager_Del *)pDelSend;   //ͷ
	ANS_Manager_DelData * pDelData = (ANS_Manager_DelData *)(pDelSend+sizeof(REQ_Manager_Del));
	pDel->lCount = lCount;
	POSITION pos = m_wndList.GetFirstSelectedItemPosition();
	ANS_GetManagerData * pManagerData;
	POSITION pos2;
	while(pos)
	{
		pDelData->lItem   = m_wndList.GetNextSelectedItem(pos);
		pos2              = (POSITION)m_wndList.GetItemData(pDelData->lItem);
		pManagerData      = m_Manager.GetNext(pos2);  //ȡ���б��е�pos
		pDelData->lUserID = pManagerData->lManagerID;
		pDelData ++;
	}
	m_pMainFrame->SendFrame( SMSFUNC_MANAGER_DEL , pDelSend , lSize );
}
void CManagerDlg::On_User_Refresh()
{
	RefreshInfo();
}


long CManagerDlg::GetCurrentSelected()
{
	POSITION pos = m_wndList.GetFirstSelectedItemPosition();
	if ( pos )
	{
		return m_wndList.GetNextSelectedItem(pos);
	}
	return -1;
}

BOOL CManagerDlg::isLockItem(long lItem , BOOL bShowWarning)
{
	BOOL b = (m_wndList.GetIconIndex(lItem) == 1);
	if ( b && bShowWarning )
	{
		MessageBox( _T("��¼����������ȴ����������غ��ٲ���!") , _T("������") , MB_ICONINFORMATION );
	}
	return b;
}

void CManagerDlg::SetLockItem(long lItem,BOOL bLock)
{
	if ( bLock )
		m_wndList.SetIconIndex( lItem , 1 );
	else
		m_wndList.SetIconIndex( lItem , 0 );
}

void CManagerDlg::OnRclickManagerList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	ShowRMenu();

	*pResult = 0;
}

void CManagerDlg::ShowRMenu()
{
	if (!m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_SEE,false))  //û�в鿴Ȩ��
		return ;

	CMenu menu;
	menu.CreatePopupMenu();
	BOOL bLock = false;
	long lItem = this->GetCurrentSelected();
	if ( lItem >= 0 )
		bLock = isLockItem( lItem , false );   //ȡ���Ƿ���������

	//����
	if ( m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_ADD,false) )
	{
		menu.AppendMenu(MF_STRING     , MENU_MANAGER_ADD, _T(" ���ӹ���Ա ") );
	}
	else
	{
		menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_MANAGER_ADD , _T(" ���ӹ���Ա ") );
	}
	//�޸�
	if ( m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_MODIFY,false) && lItem >=0 && !bLock)
	{
		menu.AppendMenu(MF_STRING     , MENU_MANAGER_MODIFY, _T(" �� �� ") );
	}
	else
	{
		menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_MANAGER_MODIFY , _T(" �� �� ") );
	}
	//ɾ��
	if ( m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_DEL,false) && lItem >=0 && !bLock )
	{
		menu.AppendMenu(MF_STRING     , MENU_MANAGER_DEL, _T(" ɾ �� ") );
	}
	else
	{
		menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_MANAGER_DEL , _T(" ɾ �� ") );
	}

	menu.AppendMenu(MF_SEPARATOR );
	//ˢ��
	menu.AppendMenu(MF_STRING     , MENU_MANAGER_REFRESH, _T(" ˢ �� ") );

	//��ʾ�˵�
	POINT pt ;
	::GetCursorPos( &pt );
	//this->ClientToScreen( &pt);
	menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON,pt.x,pt.y, this, NULL);
	menu.DestroyMenu();
}

BOOL CManagerDlg::FindManagerLoginName(const TCHAR *pLoginName, POSITION exPos)
{
	POSITION pos = m_Manager.GetHeadPosition();
	POSITION pos2;
	while (pos)
	{
		pos2 = pos;
		ANS_GetManagerData * pData = m_Manager.GetNext( pos );
		if ( pos2 != exPos )
		{
			if ( !_tcscmp( pData->szLoginName , pLoginName ) )
				return true;
		}
	}
	return false;
}