// SPDlg.cpp : implementation file
//

#include "stdafx.h"
#include "smsmanager.h"
#include "SPDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CSPDlg dialog

#include "MainFrm.h"
#include "ProcessSocket.h"
#include "DLG_SP_Modify.h"

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


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


BEGIN_MESSAGE_MAP(CSPDlg, CDialog)
	//{{AFX_MSG_MAP(CSPDlg)
	ON_WM_SIZE()
	ON_NOTIFY(NM_DBLCLK, IDC_SP_LIST, OnDblclkSpList)
	ON_NOTIFY(NM_RCLICK, IDC_SP_LIST, OnRclickSpList)
	ON_NOTIFY(LVN_KEYDOWN, IDC_SP_LIST, OnKeydownSpList)
	//}}AFX_MSG_MAP
	ON_COMMAND( MENU_SP_ADD    , On_SP_Add )
	ON_COMMAND( MENU_SP_MODIFY , On_SP_Modify )
	ON_COMMAND( MENU_SP_DEL    , On_SP_Del )
	ON_COMMAND( MENU_SP_REFRESH, On_SP_Refresh )
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSPDlg message handlers

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

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

BOOL CSPDlg::RefreshInfo()
{
	if ( !m_pMainFrame->GetUserPurview(PURVIEW_SP) )
	{
		return false;
	}
	m_pMainFrame->SendFrame(SMSFUNC_SP_SEE,NULL,0);
	return true;
}

BOOL CSPDlg::ProcessSocket(Socket_Head *pHead)
{
	//ȡ������Ϣ
	if (pHead->lFuncType == SMSFUNC_SP_SEE)
	{
		m_bRefresh = true;  //�Ѿ�ˢ�¹�
		ANS_SP_See     * pSee = (ANS_SP_See *)pHead->pFrame;
		ANS_SP_SeeData * pData = (ANS_SP_SeeData *)(pHead->pFrame+sizeof(ANS_SP_See));
		m_wndList.DeleteAllItems(); //ɾ��ԭ�е�����
		this->Close();              //�ر�ԭ����
		TCHAR Buf[32];
		for ( int i=0;i<pSee->lCount;i++ )
		{
			ANS_SP_SeeData * pNewData = new ANS_SP_SeeData;
			*pNewData = *pData;
			POSITION pos = m_SP.AddTail(pNewData);
			//m_wndList.SetHeadings(_T("���,50; ָ������,80;ָ��,50;����,50;��������,60;����ʱ��,80;"));
			_stprintf(Buf , _T("%d") , i+1 );
			m_wndList.InsertItem( i , Buf , 0 );
			m_wndList.SetItemData( i , (DWORD_PTR)pos );    //��Pos

			m_wndList.SetItemText(i,1,pData->szName);
			m_wndList.SetItemText(i,2,pData->szOperCmd);
			_stprintf(Buf,_T("%2d") , pData->lPrice );
			m_wndList.SetItemText(i,3,Buf);
			_stprintf(Buf,_T("%2d") , pData->lSendNum );
			m_wndList.SetItemText(i,4,Buf);
			_stprintf(Buf,_T("%02d:%02d:%02d") , pData->tDZSendTime1.wHour,pData->tDZSendTime1.wMinute,pData->tDZSendTime1.wSecond );
			m_wndList.SetItemText(i,5,Buf);
			if ( pData->bWeek )
			{
				m_wndList.SetItemText(i,6,_T("  ��"));
				memset(Buf,0,sizeof(Buf));
				if ( pData->szWeekDay[0] == '1' )
					_tcscat(Buf,_T("����"));
				if ( pData->szWeekDay[1] == '1' )
					_tcscat(Buf,_T("��һ"));
				if ( pData->szWeekDay[2] == '1' )
					_tcscat(Buf,_T("����"));
				if ( pData->szWeekDay[3] == '1' )
					_tcscat(Buf,_T("����"));
				if ( pData->szWeekDay[4] == '1' )
					_tcscat(Buf,_T("����"));
				if ( pData->szWeekDay[5] == '1' )
					_tcscat(Buf,_T("����"));
				if ( pData->szWeekDay[6] == '1' )
					_tcscat(Buf,_T("����"));
				m_wndList.SetItemText(i,7,Buf+2);
			}
			else
			{
				m_wndList.SetItemText(i,6,_T("  ��"));
				m_wndList.SetItemText(i,7,_T(""));
			}

			pData ++;
		}
		return true;
	}
	//���ӹ��˴���
	if (pHead->lFuncType == SMSFUNC_SP_ADD)
	{
		ANS_SP_Add * pAdd = (ANS_SP_Add *)pHead->pFrame;
		ANS_SP_SeeData * pData = (ANS_SP_SeeData *)(pHead->pFrame+sizeof(ANS_SP_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->szName);
			m_wndList.SetItemText(lCount,2,pData->szOperCmd);
			_stprintf(Buf,_T("%2d") , pData->lPrice );
			m_wndList.SetItemText(lCount,3,Buf);
			_stprintf(Buf,_T("%2d") , pData->lSendNum );
			m_wndList.SetItemText(lCount,4,Buf);
			_stprintf(Buf,_T("%02d:%02d:%02d") , pData->tDZSendTime1.wHour,pData->tDZSendTime1.wMinute,pData->tDZSendTime1.wSecond );
			m_wndList.SetItemText(lCount,5,Buf);
			if ( pData->bWeek )
			{
				m_wndList.SetItemText(lCount,6,_T("  ��"));
				memset(Buf,0,sizeof(Buf));
				if ( pData->szWeekDay[0] == '1' )
					_tcscat(Buf,_T("����"));
				if ( pData->szWeekDay[1] == '1' )
					_tcscat(Buf,_T("��һ"));
				if ( pData->szWeekDay[2] == '1' )
					_tcscat(Buf,_T("����"));
				if ( pData->szWeekDay[3] == '1' )
					_tcscat(Buf,_T("����"));
				if ( pData->szWeekDay[4] == '1' )
					_tcscat(Buf,_T("����"));
				if ( pData->szWeekDay[5] == '1' )
					_tcscat(Buf,_T("����"));
				if ( pData->szWeekDay[6] == '1' )
					_tcscat(Buf,_T("����"));
				m_wndList.SetItemText(lCount,7,Buf+2);
			}
			else
			{
				m_wndList.SetItemText(lCount,6,_T("  ��"));
				m_wndList.SetItemText(lCount,7,_T(""));
			}


			ANS_SP_SeeData * pData2 = new ANS_SP_SeeData;
			*pData2 = *pData;
			POSITION pos = m_SP.AddTail( pData2 );
			m_wndList.SetItemData( lCount, (DWORD_PTR)pos );

			//������ص��û�ID����������ˢ��
			if ( pData->lSPID <= 0 )
			{
				RefreshInfo();
			}
		}
		return true;
	}
	//�޸Ĺ�����Ϣ
	if (pHead->lFuncType == SMSFUNC_SP_MODIFY)
	{
		ANS_SP_Modify * pModify = (ANS_SP_Modify *)pHead->pFrame;
		ANS_SP_SeeData * pData = (ANS_SP_SeeData *)(pHead->pFrame+sizeof(ANS_SP_Modify));
		SetLockItem( pModify->lItem , false );  //����
		if ( pModify->lCount == 1 )  //����1ʱ��ʾ�޸ijɹ�
		{
			POSITION pos = (POSITION)m_wndList.GetItemData(pModify->lItem);
			ANS_SP_SeeData * pData2 = m_SP.GetNext( pos );
			if ( pData2 )
			{
				*pData2 = *pData;    //ȡ���µ�����
				//�����µ�����
				TCHAR Buf[32]={0};
				int i = pModify->lItem;
				m_wndList.SetItemText(i,1,pData->szName);
				m_wndList.SetItemText(i,2,pData->szOperCmd);
				_stprintf(Buf,_T("%2d") , pData->lPrice );
				m_wndList.SetItemText(i,3,Buf);
				_stprintf(Buf,_T("%2d") , pData->lSendNum );
				m_wndList.SetItemText(i,4,Buf);
				_stprintf(Buf,_T("%02d:%02d:%02d") , pData->tDZSendTime1.wHour,pData->tDZSendTime1.wMinute,pData->tDZSendTime1.wSecond );
				m_wndList.SetItemText(i,5,Buf);
				if ( pData->bWeek )
				{
					m_wndList.SetItemText(i,6,_T("  ��"));
					memset(Buf,0,sizeof(Buf));
					if ( pData->szWeekDay[0] == '1' )
						_tcscat(Buf,_T("����"));
					if ( pData->szWeekDay[1] == '1' )
						_tcscat(Buf,_T("��һ"));
					if ( pData->szWeekDay[2] == '1' )
						_tcscat(Buf,_T("����"));
					if ( pData->szWeekDay[3] == '1' )
						_tcscat(Buf,_T("����"));
					if ( pData->szWeekDay[4] == '1' )
						_tcscat(Buf,_T("����"));
					if ( pData->szWeekDay[5] == '1' )
						_tcscat(Buf,_T("����"));
					if ( pData->szWeekDay[6] == '1' )
						_tcscat(Buf,_T("����"));
					m_wndList.SetItemText(i,7,Buf+2);
				}
				else
				{
					m_wndList.SetItemText(i,6,_T("  ��"));
					m_wndList.SetItemText(i,7,_T(""));
				}

			}
		}
		return true;
	}
	//ɾ�����˴���
	if (pHead->lFuncType == SMSFUNC_SP_DEL)
	{
		ANS_SP_Del     * pDel     = (ANS_SP_Del     *)pHead->pFrame;
		ANS_SP_DelData * pDelData = (ANS_SP_DelData *)(pHead->pFrame+sizeof(ANS_SP_Del));
		POSITION pos,pos2;
		ANS_SP_SeeData  * pSPData;
		for ( int i = pDel->lCount-1 ; i>=0 ; i-- )
		{
			if ( pDelData[i].lSPID )  //ɾ���ɹ�
			{
				pos = (POSITION)m_wndList.GetItemData( pDelData[i].lItem );
				pos2 = pos;
				pSPData = m_SP.GetNext( pos );
				if ( pSPData->lSPID == pDelData[i].lSPID )  //ID��ͬ�IJſ�ɾ��
				{
					delete pSPData;       //��ɾ������
					m_SP.RemoveAt(pos2);   //���б���ɾ��
					m_wndList.DeleteItem(pDelData[i].lItem); //��ListCtrl��ɾ��
				}
			}
		}
		return true;
	}
	return false;
}

void CSPDlg::Close()
{
	//������������
	while (!m_SP.IsEmpty())
	{
		ANS_SP_SeeData * pData = m_SP.GetHead();
		m_SP.RemoveHead();
		delete pData;
	}
}

void CSPDlg::ShowRMenu()
{
	if (!m_pMainFrame->GetUserPurview(PURVIEW_SP,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_SP_ADD, _T(" �� �� ") );
	//�޸�
	if ( lItem >=0 && !bLock)
	{
		menu.AppendMenu(MF_STRING     , MENU_SP_MODIFY, _T(" �� �� ") );
	}
	else
	{
		menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_SP_MODIFY , _T(" �� �� ") );
	}
	//ɾ��
	if ( lItem >=0 && !bLock )
	{
		menu.AppendMenu(MF_STRING     , MENU_SP_DEL, _T(" ɾ �� ") );
	}
	else
	{
		menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_SP_DEL , _T(" ɾ �� ") );
	}

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

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

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

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

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

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

BOOL CSPDlg::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_SP) );
	m_Image.Add(AfxGetApp()->LoadIcon(IDI_L_LOCK) );
	m_wndList.SubClassWindow2();
	m_wndList.SetHeadings(_T("���,50;  ҵ������,120;  ָ ��,80;����,55;��������,70;����ʱ��,75;ÿ�췢��,70;   �� ��,200;"));
	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 CSPDlg::OnDblclkSpList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	*pResult = 0;
	On_SP_Modify();
}

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

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

void CSPDlg::On_SP_Add()
{
	if ( !m_pMainFrame->GetUserPurview(PURVIEW_SP) )
	{
		return ;
	}

	ANS_SP_SeeData SPData={0};
	DLG_SP_Modify dlg(this);
	dlg.SetParam( SPData,0,true );
	if ( dlg.DoModal() == IDOK )
	{
		long lSize = sizeof(REQ_SP_Add)+sizeof(ANS_SP_SeeData);
		BYTE * pAddData = new BYTE[lSize];memset(pAddData,0,lSize);
		REQ_SP_Add     * pAdd     = (REQ_SP_Add *)pAddData;   //ͷ
		ANS_SP_SeeData * pSPData = (ANS_SP_SeeData *)(pAddData+sizeof(REQ_SP_Add));
		*pSPData = dlg.GetParam();
		pAdd->lCount = 1;
		m_pMainFrame->SendFrame( SMSFUNC_SP_ADD , pAddData , lSize );
	}
}
void CSPDlg::On_SP_Modify()
{
	if ( !m_pMainFrame->GetUserPurview(PURVIEW_SP) )
	{
		return ;
	}
	long lItem = GetCurrentSelected();
	if ( lItem < 0 )
		return ;

	if (isLockItem(lItem))
	{
		return ;
	}

	POSITION pos = (POSITION)m_wndList.GetItemData(lItem);
	POSITION pos2 = pos;
	ANS_SP_SeeData * pData = m_SP.GetNext( pos );
	if (pData)
	{
		DLG_SP_Modify dlg(this);
		dlg.SetParam( *pData,pos2,false);
		if ( dlg.DoModal() == IDOK )
		{
			SetLockItem( lItem ,true);
			long lSize = sizeof(REQ_SP_Modify)+sizeof(ANS_SP_SeeData);
			BYTE * pModifyData = new BYTE[lSize];memset(pModifyData,0,lSize);
			REQ_SP_Modify * pModify = (REQ_SP_Modify *)pModifyData;   //ͷ
			ANS_SP_SeeData * pSPData = (ANS_SP_SeeData *)(pModifyData+sizeof(REQ_SP_Modify));
			*pSPData = dlg.GetParam();
			pModify->lItem  = lItem;
			pModify->lCount = 1;
			m_pMainFrame->SendFrame( SMSFUNC_SP_MODIFY , pModifyData , lSize );
		}
	}
}
void CSPDlg::On_SP_Del()
{
	if ( !m_pMainFrame->GetUserPurview(PURVIEW_SP) )
	{
		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_SP_Del)+sizeof(ANS_SP_DelData)*lCount;
	BYTE * pDelSend = new BYTE[lSize];memset(pDelSend,0,lSize);
	REQ_SP_Del     * pDel = (REQ_SP_Del *)pDelSend;   //ͷ
	ANS_SP_DelData * pDelData = (ANS_SP_DelData *)(pDelSend+sizeof(REQ_SP_Del));
	pDel->lCount = lCount;
	POSITION pos = m_wndList.GetFirstSelectedItemPosition();
	ANS_SP_SeeData * pSPData;
	POSITION pos2;
	while(pos)
	{
		pDelData->lItem   = m_wndList.GetNextSelectedItem(pos);
		pos2              = (POSITION)m_wndList.GetItemData(pDelData->lItem);
		pSPData         = m_SP.GetNext(pos2);  //ȡ���б��е�pos
		pDelData->lSPID   = pSPData->lSPID;
		pDelData ++;
	}
	m_pMainFrame->SendFrame( SMSFUNC_SP_DEL , pDelSend , lSize );
}
void CSPDlg::On_SP_Refresh()
{
	RefreshInfo();
}

BOOL CSPDlg::FindSPName(const TCHAR *pSPName, POSITION exPos)
{
	POSITION pos = m_SP.GetHeadPosition();
	POSITION pos2;
	while (pos)
	{
		pos2 = pos;
		ANS_SP_SeeData * pData = m_SP.GetNext( pos );
		if ( pos2 != exPos )
		{
			if ( !_tcscmp( pData->szName , pSPName ) )
				return true;
		}
	}
	return false;
}

BOOL CSPDlg::FindOperCmd(const TCHAR *pOperCmd, POSITION exPos)
{
	POSITION pos = m_SP.GetHeadPosition();
	POSITION pos2;
	while (pos)
	{
		pos2 = pos;
		ANS_SP_SeeData * pData = m_SP.GetNext( pos );
		if ( pos2 != exPos )
		{
			if ( !_tcscmp( pData->szOperCmd , pOperCmd ) )
				return true;
		}
	}
	return false;
}