// C_Partner.cpp : implementation file
//

#include "stdafx.h"
#include "smsmanager.h"
#include "C_Partner.h"

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

/////////////////////////////////////////////////////////////////////////////
// CC_Partner dialog
#include "MainFrm.h"
#include "ProcessSocket.h"
#include "DLG_C_Partner_Modify.h"

CC_Partner::CC_Partner(CWnd* pParent /*=NULL*/)
	: CDialog(CC_Partner::IDD, pParent)
{
	//{{AFX_DATA_INIT(CC_Partner)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT

	m_bInit = false;
	m_bRefresh = false;
}


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


BEGIN_MESSAGE_MAP(CC_Partner, CDialog)
	//{{AFX_MSG_MAP(CC_Partner)
	ON_WM_SIZE()
	ON_NOTIFY(NM_DBLCLK, IDC_PARTNER_LIST, OnDblclkYwyList)
	ON_NOTIFY(NM_RCLICK, IDC_PARTNER_LIST, OnRclickYwyList)
	ON_NOTIFY(LVN_KEYDOWN, IDC_PARTNER_LIST, OnKeydownYwyList)
	//}}AFX_MSG_MAP

	ON_COMMAND( MENU_PARTNER_ADD    , On_User_Add)
	ON_COMMAND( MENU_PARTNER_MODIFY , On_User_Modify)
	ON_COMMAND( MENU_PARTNER_DEL    , On_User_Del)
	ON_COMMAND( MENU_PARTNER_REFRESH, On_User_Refresh)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CC_Partner message handlers

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

void CC_Partner::Close()
{
	Close_Partner();
}

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

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

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

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

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

BOOL CC_Partner::ProcessSocket(Socket_Head_Add *pHead,BYTE* pFrame)
{

	//ȡ����Ա��Ϣ
	if (pHead->lFuncType == SMSFUNC_GETPARTNER)
	{
		m_bRefresh = true;  //�Ѿ�ˢ�¹�
		ANS_GetPartner * pPartner = (ANS_GetPartner *)pFrame;
		ANS_GetPartnerData * pData = (ANS_GetPartnerData *)(pFrame+sizeof(ANS_GetPartner));


		m_wndList.DeleteAllItems(); //ɾ��ԭ�е�����
		this->Close_Partner();              //�ر�ԭ����
		TCHAR Buf[32];
		for ( int i=0;i<pPartner->lCount;i++ )
		{
			ANS_GetPartnerData * pNewData = new ANS_GetPartnerData;
			*pNewData = *pData;
			POSITION pos = m_Partner.AddTail(pNewData);
			//m_wndList.SetHeadings(_T("���,50;����,70;  �� ��,80; ��˾,100; �� ��,80;�绰,80;�ֻ�,80;"));
			_stprintf(Buf , _T("%d") , i+1 );
			m_wndList.InsertItem( i , Buf , 0 );
			m_wndList.SetItemData( i , (DWORD)pos );    //��Pos
			long lTemp11=1;
			switch(pData->lPartnerType)
			{
			case 0:
				 m_wndList.SetItemText(i,lTemp11++,_T("�ƶ��ͻ�����"));
				 break;
			case 1:
				 m_wndList.SetItemText(i,lTemp11++,_T("���ſͻ�����"));
				 break;
			case 2:
				 m_wndList.SetItemText(i,lTemp11++,_T("��ͨ�ͻ�����"));
				 break;
			case 3:
				 m_wndList.SetItemText(i,lTemp11++,_T("�豸��Ӧ��"));
				 break;
			case 4:
				 m_wndList.SetItemText(i,lTemp11++,_T("�����׿ͻ�"));
				 break;
			case 5:
			default:
				 m_wndList.SetItemText(i,lTemp11++,_T("�����������"));
				 break;
			}
			m_wndList.SetItemText(i,lTemp11++,pData->szName);
			m_wndList.SetItemText(i,lTemp11++,pData->szLTD);
			m_wndList.SetItemText(i,lTemp11++,pData->szBranch);
			m_wndList.SetItemText(i,lTemp11++,pData->szTel);
			m_wndList.SetItemText(i,lTemp11++,pData->szMobile);
			pData ++;
		}
		return true;
	}

	//�޸Ĺ���Ա��Ϣ
	if (pHead->lFuncType == SMSFUNC_PARTNER_MODIFY)
	{
		ANS_Partner_Modify * pModify = (ANS_Partner_Modify *)pFrame;
		ANS_GetPartnerData * pData = (ANS_GetPartnerData *)(pFrame+sizeof(ANS_Partner_Modify));
		SetLockItem( pModify->lItem , false );  //����
		if ( pModify->lCount == 1 )  //����1ʱ��ʾ�޸ijɹ�
		{
			POSITION pos = (POSITION)m_wndList.GetItemData(pModify->lItem);
			ANS_GetPartnerData * pData2 = m_Partner.GetNext( pos );
			if ( pData2 )
			{
				*pData2 = *pData;    //ȡ���µ�����

				long lTemp11=1;
				switch(pData->lPartnerType)
				{
				case 0:
					m_wndList.SetItemText(pModify->lItem,lTemp11++,_T("�ƶ��ͻ�����"));
					break;
				case 1:
					m_wndList.SetItemText(pModify->lItem,lTemp11++,_T("���ſͻ�����"));
					break;
				case 2:
					m_wndList.SetItemText(pModify->lItem,lTemp11++,_T("��ͨ�ͻ�����"));
					break;
				case 3:
					m_wndList.SetItemText(pModify->lItem,lTemp11++,_T("�豸��Ӧ��"));
					break;
				case 4:
					m_wndList.SetItemText(pModify->lItem,lTemp11++,_T("�����׿ͻ�"));
					break;
				case 5:
				default:
					m_wndList.SetItemText(pModify->lItem,lTemp11++,_T("�����������"));
					break;
				}
				m_wndList.SetItemText(pModify->lItem,lTemp11++,pData->szName);
				m_wndList.SetItemText(pModify->lItem,lTemp11++,pData->szLTD);
				m_wndList.SetItemText(pModify->lItem,lTemp11++,pData->szBranch);
				m_wndList.SetItemText(pModify->lItem,lTemp11++,pData->szTel);
				m_wndList.SetItemText(pModify->lItem,lTemp11++,pData->szMobile);
			}
		}
		return true;
	}
	//���ӹ���Ա
	if (pHead->lFuncType == SMSFUNC_PARTNER_ADD)
	{
		ANS_Partner_Add * pAdd = (ANS_Partner_Add *)pFrame;
		ANS_GetPartnerData * pData = (ANS_GetPartnerData *)(pFrame+sizeof(ANS_Partner_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 );
			
			long lTemp11=1;
			switch(pData->lPartnerType)
			{
			case 0:
				m_wndList.SetItemText(lCount,lTemp11++,_T("�ƶ��ͻ�����"));
				break;
			case 1:
				m_wndList.SetItemText(lCount,lTemp11++,_T("���ſͻ�����"));
				break;
			case 2:
				m_wndList.SetItemText(lCount,lTemp11++,_T("��ͨ�ͻ�����"));
				break;
			case 3:
				m_wndList.SetItemText(lCount,lTemp11++,_T("�豸��Ӧ��"));
				break;
			case 4:
				m_wndList.SetItemText(lCount,lTemp11++,_T("�����׿ͻ�"));
				break;
			case 5:
			default:
				m_wndList.SetItemText(lCount,lTemp11++,_T("�����������"));
				break;
			}
			m_wndList.SetItemText(lCount,lTemp11++,pData->szName);
			m_wndList.SetItemText(lCount,lTemp11++,pData->szLTD);
			m_wndList.SetItemText(lCount,lTemp11++,pData->szBranch);
			m_wndList.SetItemText(lCount,lTemp11++,pData->szTel);
			m_wndList.SetItemText(lCount,lTemp11++,pData->szMobile);

			ANS_GetPartnerData * pData2 = new ANS_GetPartnerData;
			*pData2 = *pData;
			POSITION pos = m_Partner.AddTail( pData2 );
			m_wndList.SetItemData( lCount, (DWORD)pos );
			//������ص��û�ID����������ˢ��
			if ( pData->lPartnerID <= 0 )
			{
				RefreshInfo();
			}
		}
		return true;
	}
	//ɾ������Ա
	if (pHead->lFuncType == SMSFUNC_PARTNER_DEL)
	{
		ANS_Partner_Del     * pDel     = (ANS_Partner_Del     *)pFrame;
		ANS_Partner_DelData * pDelData = (ANS_Partner_DelData *)(pFrame+sizeof(ANS_Partner_Del));
		POSITION pos,pos2;
		ANS_GetPartnerData  * pPartnerData;
		for ( int i = pDel->lCount-1 ; i>=0 ; i-- )
		{
			if ( pDelData[i].lUserID )  //ɾ���ɹ�
			{
				pos = (POSITION)m_wndList.GetItemData( pDelData[i].lItem );
				pos2 = pos;
				pPartnerData = m_Partner.GetNext( pos );
				if ( pPartnerData->lPartnerID == pDelData[i].lUserID )  //ID��ͬ�IJſ�ɾ��
				{
					delete pPartnerData;       //��ɾ������
					m_Partner.RemoveAt(pos2);   //���б���ɾ��
					m_wndList.DeleteItem(pDelData[i].lItem); //��ListCtrl��ɾ��
				}
			}
		}
		return true;
	}

	return false;
}

void CC_Partner::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_PARTNER_ADD, _T(" ���Ӻ������ ") );
	}
	else
	{
		menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_PARTNER_ADD , _T(" ���Ӻ������ ") );
	}
	//�޸�
	if ( m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_MODIFY,false) && lItem >=0 && !bLock)
	{
		menu.AppendMenu(MF_STRING     , MENU_PARTNER_MODIFY, _T(" �� �� ") );
	}
	else
	{
		menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_PARTNER_MODIFY , _T(" �� �� ") );
	}
	//ɾ��
	if ( m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_DEL,false) && lItem >=0 && !bLock )
	{
		menu.AppendMenu(MF_STRING     , MENU_PARTNER_DEL, _T(" ɾ �� ") );
	}
	else
	{
		menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_PARTNER_DEL , _T(" ɾ �� ") );
	}

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

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

BOOL CC_Partner::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;����,90;  �� ��,80; ��˾,100; �� ��,80;�绰,80;�ֻ�,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
}

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

void CC_Partner::OnDblclkYwyList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	*pResult = 0;

	On_User_Modify();
}

void CC_Partner::OnRclickYwyList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	*pResult = 0;

	ShowRMenu();
}

void CC_Partner::OnKeydownYwyList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
	// TODO: Add your control notification handler code here
	
	*pResult = 0;
}

void CC_Partner::On_User_Add()
{
	if ( !m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_ADD) )
	{
		return ;
	}

	ANS_GetPartnerData PartnerData={0};
	DLG_C_Partner_Modify dlg(this);
	dlg.SetParam( PartnerData,0,true);
	if ( dlg.DoModal() == IDOK )
	{
		long lSize = sizeof(REQ_Partner_Add)+sizeof(ANS_GetPartnerData);
		BYTE * pAddData = new BYTE[lSize];memset(pAddData,0,lSize);
		REQ_Partner_Add * pAdd = (REQ_Partner_Add *)pAddData;   //ͷ
		ANS_GetPartnerData * pPartnerData = (ANS_GetPartnerData *)(pAddData+sizeof(REQ_Partner_Add));
		*pPartnerData = dlg.GetParam();
		pAdd->lCount = 1;
		m_pMainFrame->SendFrame( SMSFUNC_PARTNER_ADD , pAddData , lSize );
	}
}
void CC_Partner::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_GetPartnerData * pData = m_Partner.GetNext( pos );
	if (pData)
	{
		DLG_C_Partner_Modify dlg(this);
		dlg.SetParam( *pData,pos2,false);
		if ( dlg.DoModal() == IDOK )
		{
			SetLockItem( lItem ,true);
			long lSize = sizeof(REQ_Partner_Modify)+sizeof(ANS_GetPartnerData);
			BYTE * pModifyData = new BYTE[lSize];memset(pModifyData,0,lSize);
			REQ_Partner_Modify * pModify = (REQ_Partner_Modify *)pModifyData;   //ͷ
			ANS_GetPartnerData * pPartnerData = (ANS_GetPartnerData *)(pModifyData+sizeof(REQ_Partner_Modify));
			*pPartnerData = dlg.GetParam();
			pModify->lItem  = lItem;
			pModify->lCount = 1;
			m_pMainFrame->SendFrame( SMSFUNC_PARTNER_MODIFY , pModifyData , lSize );
		}
	}

}
void CC_Partner::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_Partner_Del)+sizeof(ANS_Partner_DelData)*lCount;
	BYTE * pDelSend = new BYTE[lSize];memset(pDelSend,0,lSize);
	REQ_Partner_Del     * pDel = (REQ_Partner_Del *)pDelSend;   //ͷ
	ANS_Partner_DelData * pDelData = (ANS_Partner_DelData *)(pDelSend+sizeof(REQ_Partner_Del));
	pDel->lCount = lCount;
	POSITION pos = m_wndList.GetFirstSelectedItemPosition();
	ANS_GetPartnerData * pPartnerData;
	POSITION pos2;
	while(pos)
	{
		pDelData->lItem   = m_wndList.GetNextSelectedItem(pos);
		pos2              = (POSITION)m_wndList.GetItemData(pDelData->lItem);
		pPartnerData          = m_Partner.GetNext(pos2);  //ȡ���б��е�pos
		pDelData->lUserID = pPartnerData->lPartnerID;
		pDelData ++;
	}
	m_pMainFrame->SendFrame( SMSFUNC_PARTNER_DEL , pDelSend , lSize );
}
void CC_Partner::On_User_Refresh()
{
	RefreshInfo();
}

BOOL CC_Partner::FindPartnerName(const TCHAR *pName, POSITION exPos)
{
	POSITION pos = m_Partner.GetHeadPosition();
	POSITION pos2;
	while (pos)
	{
		pos2 = pos;
		ANS_GetPartnerData * pData = m_Partner.GetNext( pos );
		if ( pos2 != exPos )
		{
			if ( !_tcscmp( pData->szName , pName ) )
				return true;
		}
	}
	return false;
}

void CC_Partner::Close_Partner()
{
	//������������
	while (!m_Partner.IsEmpty())
	{
		ANS_GetPartnerData * pPartner = m_Partner.GetHead();
		m_Partner.RemoveHead();
		delete pPartner;
	}
}