// Back.cpp : implementation file
//

#include "stdafx.h"
#include "smsmanager.h"
#include "Back.h"

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

/////////////////////////////////////////////////////////////////////////////
// CBack dialog
// CTabDlg dialog
#include "MainFrm.h"
#include "ProcessSocket.h"
#include "DLG_Back_Add.h"

CBack::CBack(CWnd* pParent /*=NULL*/)
	: CDialog(CBack::IDD, pParent)
{
	//{{AFX_DATA_INIT(CBack)
	m_lUserID = 0;
	m_lCorp = -1;
	//}}AFX_DATA_INIT
	m_bInit = false;
	m_bRefresh = false;
}


void CBack::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CBack)
	DDX_Control(pDX, IDC_BACK_S1, m_S_S1);
	DDX_Control(pDX, IDC_BACK_CORP, m_L_Corp);
	DDX_Control(pDX, IDC_BACK_LIST, m_wndList);
	DDX_Text(pDX, IDC_BACK_USERID, m_lUserID);
	DDX_CBIndex(pDX, IDC_BACK_CORP, m_lCorp);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CBack, CDialog)
	//{{AFX_MSG_MAP(CBack)
	ON_WM_SIZE()
	ON_BN_CLICKED(IDC_BACK_QUERY, OnBackQuery)
	ON_NOTIFY(NM_DBLCLK, IDC_BACK_LIST, OnDblclkBackList)
	ON_NOTIFY(LVN_KEYDOWN, IDC_BACK_LIST, OnKeydownBackList)
	ON_NOTIFY(NM_RCLICK, IDC_BACK_LIST, OnRclickBackList)
	//}}AFX_MSG_MAP
	ON_COMMAND( MENU_BACK_ADD , On_Back_Add )
	ON_COMMAND( MENU_BACK_DEL , On_Back_Del )
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBack message handlers

void CBack::Close()
{
	//������������
	while (!m_Corp.IsEmpty())
	{
		ANS_Corp_NameData * pData = m_Corp.GetHead();
		m_Corp.RemoveHead();
		delete pData;
	}
}

BOOL CBack::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_BACK) );
	m_Image.Add(AfxGetApp()->LoadIcon(IDI_L_LOCK) );
	m_wndList.SubClassWindow2();
	m_wndList.SetHeadings(_T("���,50; ��ҵID,100; �û�ID,100;�ֻ�����,100;����ԭ��,200;"));
	m_wndList.SetGridLines(true);
	m_wndList.SetImageList(&m_Image,LVSIL_SMALL);

	m_bInit = true;

	m_lUserID = 0;  //Ĭ�ϲ鿴�����ֻ�����

	UpdateData(false);	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

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

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

BOOL CBack::RefreshInfo()
{
	if ( !m_pMainFrame->GetUserPurview(PURVIEW_TAB) )
	{
		return false;
	}
	m_pMainFrame->SendFrame(SMSFUNC_CORP_NAME,NULL,0);

	return true;
}

BOOL CBack::ProcessSocket(Socket_Head *pHead)
{
	//ȡ������Ϣ
	if (pHead->lFuncType == SMSFUNC_CORP_NAME)
	{
		m_bRefresh = true;  //�Ѿ�ˢ�¹�
		ANS_Corp_Name     * pCorp = (ANS_Corp_Name *)pHead->pFrame;
		ANS_Corp_NameData * pData = (ANS_Corp_NameData *)(pHead->pFrame+sizeof(ANS_Corp_Name));
		m_L_Corp.ResetContent();  //ɾ��ԭ���е���ҵ
		m_L_Corp.AddString( _T("������ҵ") );
		this->Close();              //�ر�ԭ����
		for ( int i=0;i<pCorp->lCount;i++ )
		{
			ANS_Corp_NameData * pNewData = new ANS_Corp_NameData;
			*pNewData = *pData;
			POSITION pos = m_Corp.AddTail(pNewData);
			long lItem = m_L_Corp.AddString( pData->szCorpName );
			m_L_Corp.SetItemData( lItem , (DWORD)pos);
			pData ++;
		}
		m_L_Corp.SetCurSel(0);
		return true;
	}
	//ȡ�嵥
	if (pHead->lFuncType == SMSFUNC_BACK)
	{
		ANS_Back * pList = (ANS_Back *)pHead->pFrame;
		ANS_BackData * pData = (ANS_BackData *)(pHead->pFrame+sizeof(ANS_Back));
		//���ӵ�List
		m_wndList.ShowWindow( SW_HIDE );
		m_wndList.DeleteAllItems();
		long lCount = m_wndList.GetItemCount();
		TCHAR szBuf[32];
		for ( int i = 0 ; i< pList->lCount;i++)
		{
			//m_wndList.SetHeadings(_T("���,50; ��ҵID,100; �û�ID,100;�ֻ�����,100;����ԭ��,200;"));
			m_wndList.InsertItem( i,_itot(i+1,szBuf,10),0);
			m_wndList.SetItemData( i,pData->lBackID );

			_stprintf(szBuf , _T("%d") , pData->lCorpID );
			m_wndList.SetItemText(i,1,szBuf);
			_stprintf(szBuf , _T("%d") , pData->lUserID );
			m_wndList.SetItemText(i,2,szBuf);
			m_wndList.SetItemText(i,3,pData->szMobile);
			m_wndList.SetItemText(i,4,pData->szBZ);
			pData++;
		}
		m_wndList.ShowWindow( SW_SHOW );
		return true;
	}
	//������ҵ�û�
	if (pHead->lFuncType == SMSFUNC_BACK_ADD)
	{
		ANS_Back_Add  * pAdd      = (ANS_Back_Add *)pHead->pFrame;
		if ( pAdd->bOK == 1 )  //����1ʱ��ʾ�޸ijɹ�
		{
			long lCount = m_wndList.GetItemCount();
			TCHAR szBuf[32];
			_stprintf( szBuf, _T("%d") , lCount +1 );
			//�����µ�����
			m_wndList.InsertItem( lCount , szBuf);
			m_wndList.SetItemData( lCount, (DWORD)pAdd->lBackID );

			_stprintf(szBuf , _T("%d") , pAdd->lCorpID );
			m_wndList.SetItemText(lCount,1,szBuf);
			_stprintf(szBuf , _T("%d") , pAdd->lUserID );
			m_wndList.SetItemText(lCount,2,szBuf);
			m_wndList.SetItemText(lCount,3,pAdd->szMobile);
			m_wndList.SetItemText(lCount,4,pAdd->szBZ);
		}
		return true;
	}
	//ɾ����ҵ�û�
	if (pHead->lFuncType == SMSFUNC_BACK_DEL)
	{
		ANS_Back_Del     * pDel     = (ANS_Back_Del     *)pHead->pFrame;
		ANS_Back_DelData * pDelData = (ANS_Back_DelData *)(pHead->pFrame+sizeof(ANS_Back_Del));
		for ( int i = pDel->lCount-1 ; i>=0 ; i-- )
		{
			if ( pDelData[i].lBackID )  //ɾ���ɹ�
			{
				m_wndList.DeleteItem(pDelData[i].lItem); //��ListCtrl��ɾ��
			}
		}
	}

	return false;
}

void CBack::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
	if ( m_bInit )
	{
		CRect rect;
		m_S_S1.GetWindowRect(&rect);
		m_wndList.MoveWindow( 0 , 0+rect.Height()+5 , cx,cy-rect.Height()-5);
	}
}

void CBack::OnBackQuery() 
{
	UpdateData(true);
	REQ_Back * pBack = new REQ_Back;memset(pBack,0,sizeof(REQ_Back));

	if ( m_lCorp == 0 )  //ѡ��������ҵ
	{
		pBack->lCorpID = -1;
	}
	else
	{
		POSITION pos = (POSITION)m_L_Corp.GetItemData(m_lCorp);
		POSITION pos2 = pos;
		ANS_Corp_NameData * pData = m_Corp.GetNext( pos );
		if (pData)
		{
			pBack->lCorpID = pData->lCorpID;
		}
		else
		{
			return;
		}
	}
	m_pMainFrame->SendFrame(SMSFUNC_BACK,(BYTE*)pBack,sizeof(REQ_Back));
	return ;	
}

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

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

void CBack::OnRclickBackList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	*pResult = 0;
	ShowRMenu();
}

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

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

	//����
	menu.AppendMenu(MF_STRING     , MENU_BACK_ADD, _T(" �� �� ") );
	//ɾ��
	if (  lItem >=0 && !bLock )
	{
		menu.AppendMenu(MF_STRING     , MENU_BACK_DEL, _T(" ɾ �� ") );
	}
	else
	{
		menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_BACK_DEL , _T(" ɾ �� ") );
	}
	//��ʾ�˵�
	POINT pt ;
	::GetCursorPos( &pt );
	//this->ClientToScreen( &pt);
	menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON,pt.x,pt.y, this, NULL);
	menu.DestroyMenu();
}

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

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

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

void CBack::On_Back_Add()
{
	DLG_Back_Add dlg(this);
	if ( dlg.DoModal() == IDOK )
	{
		REQ_Back_Add * pAdd = new REQ_Back_Add;
		memset(pAdd,0,sizeof(REQ_Back_Add));
		pAdd->lCorpID = dlg.m_lCorpID;
		pAdd->lUserID = dlg.m_lUserID;
		_tcscpy( pAdd->szMobile , dlg.m_strMobile );
		_tcscpy( pAdd->szBZ , dlg.m_strBZ );
		m_pMainFrame->SendFrame(SMSFUNC_BACK_ADD,(BYTE*)pAdd,sizeof(REQ_Back_Add));
	}
}

void CBack::On_Back_Del()
{
	long lRet = MessageBox( _T("�˲�������������û����Ƿ������") , _T("����") , MB_ICONQUESTION|MB_YESNOCANCEL|MB_DEFBUTTON2);
	if ( lRet != IDYES )
		return;
	long lCount = m_wndList.GetSelectedCount();
	long lSize = sizeof(REQ_Back_Del)+sizeof(ANS_Back_DelData)*lCount;
	BYTE * pDelSend = new BYTE[lSize];memset(pDelSend,0,lSize);
	REQ_Back_Del     * pDel = (REQ_Back_Del *)pDelSend;   //ͷ
	ANS_Back_DelData * pDelData = (ANS_Back_DelData *)(pDelSend+sizeof(REQ_Back_Del));
	pDel->lCount = lCount;
	POSITION pos = m_wndList.GetFirstSelectedItemPosition();
	while(pos)
	{
		pDelData->lItem   = m_wndList.GetNextSelectedItem(pos);
		pDelData->lBackID = m_wndList.GetItemData(pDelData->lItem);
		pDelData ++;
	}
	m_pMainFrame->SendFrame( SMSFUNC_BACK_DEL , pDelSend , lSize );
}