// TSCmdDlg.cpp : implementation file
//

#include "stdafx.h"
#include "smsmanager.h"
#include "TSCmdDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CTSCmdDlg dialog

#include "MainFrm.h"
#include "ProcessSocket.h"
#include "DLG_TSCmd_Modify.h"

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

	m_bInit = false;
	m_bRefresh = false;
}


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


BEGIN_MESSAGE_MAP(CTSCmdDlg, CDialog)
	//{{AFX_MSG_MAP(CTSCmdDlg)
	ON_WM_SIZE()
	ON_NOTIFY(NM_DBLCLK, IDC_TSCMD_LIST, OnDblclkTscmdList)
	ON_NOTIFY(NM_RCLICK, IDC_TSCMD_LIST, OnRclickTscmdList)
	ON_NOTIFY(LVN_KEYDOWN, IDC_TSCMD_LIST, OnKeydownTscmdList)
	//}}AFX_MSG_MAP
	ON_COMMAND( MENU_TSCMD_ADD    , On_TSCmd_Add )
	ON_COMMAND( MENU_TSCMD_MODIFY , On_TSCmd_Modify )
	ON_COMMAND( MENU_TSCMD_DEL    , On_TSCmd_Del )
	ON_COMMAND( MENU_TSCMD_REFRESH, On_TSCmd_Refresh )

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTSCmdDlg message handlers

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

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

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

BOOL CTSCmdDlg::ProcessSocket(Socket_Head *pHead)
{
	//ȡ������Ϣ
	if (pHead->lFuncType == SMSFUNC_TSCMD_SEE)
	{
		m_bRefresh = true;  //�Ѿ�ˢ�¹�
		ANS_TSCmd_See     * pSee = (ANS_TSCmd_See *)pHead->pFrame;
		ANS_TSCmd_SeeData * pData = (ANS_TSCmd_SeeData *)(pHead->pFrame+sizeof(ANS_TSCmd_See));
		m_wndList.DeleteAllItems(); //ɾ��ԭ�е�����
		this->Close();              //�ر�ԭ����
		TCHAR Buf[32];
		for ( int i=0;i<pSee->lCount;i++ )
		{
			ANS_TSCmd_SeeData * pNewData = new ANS_TSCmd_SeeData;
			*pNewData = *pData;
			POSITION pos = m_TSCmd.AddTail(pNewData);
			//m_wndList.SetHeadings(_T("���,50; ָ������,80;ָ��,50;����,50;��������,60;����ʱ��,80;"));
			//m_wndList.SetHeadings(_T("���,50;  ����,120;  ָ ��,60; ����,80;����,55;��������,70;����ʱ��,75;ÿ�췢��,70;   �� ��,200;"));
			_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);
			if ( pData->lType == 0 )
				m_wndList.SetItemText(i,3,_T(" �㲥"));
			else
				m_wndList.SetItemText(i,3,_T(" ����"));
			_stprintf(Buf,_T("%2d") , pData->lPrice );
			m_wndList.SetItemText(i,4,Buf);
			_stprintf(Buf,_T("%2d") , pData->lSendNum );
			m_wndList.SetItemText(i,5,Buf);
			_stprintf(Buf,_T("%02d:%02d:%02d") , pData->tDZSendTime.wHour,pData->tDZSendTime.wMinute,pData->tDZSendTime.wSecond );
			m_wndList.SetItemText(i,6,Buf);
			if ( pData->bWeek )
			{
				m_wndList.SetItemText(i,7,_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,8,Buf+2);
			}
			else
			{
				m_wndList.SetItemText(i,7,_T("  ��"));
				m_wndList.SetItemText(i,8,_T(""));
			}

			pData ++;
		}
		return true;
	}
	//���ӹ��˴���
	if (pHead->lFuncType == SMSFUNC_TSCMD_ADD)
	{
		ANS_TSCmd_Add * pAdd = (ANS_TSCmd_Add *)pHead->pFrame;
		ANS_TSCmd_SeeData * pData = (ANS_TSCmd_SeeData *)(pHead->pFrame+sizeof(ANS_TSCmd_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);
			if ( pData->lType == 0 )
				m_wndList.SetItemText(lCount,3,_T(" �㲥"));
			else
				m_wndList.SetItemText(lCount,3,_T(" ����"));
			_stprintf(Buf,_T("%2d") , pData->lPrice );
			m_wndList.SetItemText(lCount,4,Buf);
			_stprintf(Buf,_T("%2d") , pData->lSendNum );
			m_wndList.SetItemText(lCount,5,Buf);
			_stprintf(Buf,_T("%02d:%02d:%02d") , pData->tDZSendTime.wHour,pData->tDZSendTime.wMinute,pData->tDZSendTime.wSecond );
			m_wndList.SetItemText(lCount,6,Buf);
			if ( pData->bWeek )
			{
				m_wndList.SetItemText(lCount,7,_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,8,Buf+2);
			}
			else
			{
				m_wndList.SetItemText(lCount,7,_T("  ��"));
				m_wndList.SetItemText(lCount,8,_T(""));
			}


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

			//������ص��û�ID����������ˢ��
			if ( pData->lTSCmdID <= 0 )
			{
				RefreshInfo();
			}
		}
		return true;
	}
	//�޸Ĺ�����Ϣ
	if (pHead->lFuncType == SMSFUNC_TSCMD_MODIFY)
	{
		ANS_TSCmd_Modify * pModify = (ANS_TSCmd_Modify *)pHead->pFrame;
		ANS_TSCmd_SeeData * pData = (ANS_TSCmd_SeeData *)(pHead->pFrame+sizeof(ANS_TSCmd_Modify));
		SetLockItem( pModify->lItem , false );  //����
		if ( pModify->lCount == 1 )  //����1ʱ��ʾ�޸ijɹ�
		{
			POSITION pos = (POSITION)m_wndList.GetItemData(pModify->lItem);
			ANS_TSCmd_SeeData * pData2 = m_TSCmd.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);
				if ( pData->lType == 0 )
					m_wndList.SetItemText(i,3,_T(" �㲥"));
				else
					m_wndList.SetItemText(i,3,_T(" ����"));
				_stprintf(Buf,_T("%2d") , pData->lPrice );
				m_wndList.SetItemText(i,4,Buf);
				_stprintf(Buf,_T("%2d") , pData->lSendNum );
				m_wndList.SetItemText(i,5,Buf);
				_stprintf(Buf,_T("%02d:%02d:%02d") , pData->tDZSendTime.wHour,pData->tDZSendTime.wMinute,pData->tDZSendTime.wSecond );
				m_wndList.SetItemText(i,6,Buf);
				if ( pData->bWeek )
				{
					m_wndList.SetItemText(i,7,_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,8,Buf+2);
				}
				else
				{
					m_wndList.SetItemText(i,7,_T("  ��"));
					m_wndList.SetItemText(i,8,_T(""));
				}

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


BOOL CTSCmdDlg::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;  ָ ��,60; ����,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 CTSCmdDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
	if ( m_bInit )
	{
		m_wndList.MoveWindow( 0 , 0 , cx,cy);
	}	
}

void CTSCmdDlg::Close()
{
	//������������
	while (!m_TSCmd.IsEmpty())
	{
		ANS_TSCmd_SeeData * pData = m_TSCmd.GetHead();
		m_TSCmd.RemoveHead();
		delete pData;
	}
}

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

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

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

void CTSCmdDlg::OnDblclkTscmdList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	*pResult = 0;
	On_TSCmd_Modify();
}

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

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

void CTSCmdDlg::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_TSCMD_ADD, _T(" �� �� ") );
	//�޸�
	if ( lItem >=0 && !bLock)
	{
		menu.AppendMenu(MF_STRING     , MENU_TSCMD_MODIFY, _T(" �� �� ") );
	}
	else
	{
		menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_TSCMD_MODIFY , _T(" �� �� ") );
	}
	//ɾ��
	if ( lItem >=0 && !bLock )
	{
		menu.AppendMenu(MF_STRING     , MENU_TSCMD_DEL, _T(" ɾ �� ") );
	}
	else
	{
		menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_TSCMD_DEL , _T(" ɾ �� ") );
	}

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

	//��ʾ�˵�
	POINT pt ;
	::GetCursorPos( &pt );
	//this->ClientToScreen( &pt);
	menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON,pt.x,pt.y, this, NULL);
	menu.DestroyMenu();
}
void CTSCmdDlg::On_TSCmd_Add()
{
	if ( !m_pMainFrame->GetUserPurview(PURVIEW_SP) )
	{
		return ;
	}

	ANS_TSCmd_SeeData SPData={0};
	DLG_TSCmd_Modify dlg(this);
	dlg.SetParam( SPData,0,true );
	if ( dlg.DoModal() == IDOK )
	{
		long lSize = sizeof(REQ_TSCmd_Add)+sizeof(ANS_TSCmd_SeeData);
		BYTE * pAddData = new BYTE[lSize];memset(pAddData,0,lSize);
		REQ_TSCmd_Add     * pAdd     = (REQ_TSCmd_Add *)pAddData;   //ͷ
		ANS_TSCmd_SeeData * pSPData = (ANS_TSCmd_SeeData *)(pAddData+sizeof(REQ_TSCmd_Add));
		*pSPData = dlg.GetParam();
		pAdd->lCount = 1;
		m_pMainFrame->SendFrame( SMSFUNC_TSCMD_ADD , pAddData , lSize );
	}
}
void CTSCmdDlg::On_TSCmd_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_TSCmd_SeeData * pData = m_TSCmd.GetNext( pos );
	if (pData)
	{
		DLG_TSCmd_Modify dlg(this);
		dlg.SetParam( *pData,pos2,false);
		if ( dlg.DoModal() == IDOK )
		{
			SetLockItem( lItem ,true);
			long lSize = sizeof(REQ_TSCmd_Modify)+sizeof(ANS_TSCmd_SeeData);
			BYTE * pModifyData = new BYTE[lSize];memset(pModifyData,0,lSize);
			REQ_TSCmd_Modify * pModify = (REQ_TSCmd_Modify *)pModifyData;   //ͷ
			ANS_TSCmd_SeeData * pSPData = (ANS_TSCmd_SeeData *)(pModifyData+sizeof(REQ_TSCmd_Modify));
			*pSPData = dlg.GetParam();
			pModify->lItem  = lItem;
			pModify->lCount = 1;
			m_pMainFrame->SendFrame( SMSFUNC_TSCMD_MODIFY , pModifyData , lSize );
		}
	}
}
void CTSCmdDlg::On_TSCmd_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_TSCmd_Del)+sizeof(ANS_TSCmd_DelData)*lCount;
	BYTE * pDelSend = new BYTE[lSize];memset(pDelSend,0,lSize);
	REQ_TSCmd_Del     * pDel = (REQ_TSCmd_Del *)pDelSend;   //ͷ
	ANS_TSCmd_DelData * pDelData = (ANS_TSCmd_DelData *)(pDelSend+sizeof(REQ_TSCmd_Del));
	pDel->lCount = lCount;
	POSITION pos = m_wndList.GetFirstSelectedItemPosition();
	ANS_TSCmd_SeeData * pSPData;
	POSITION pos2;
	while(pos)
	{
		pDelData->lItem   = m_wndList.GetNextSelectedItem(pos);
		pos2              = (POSITION)m_wndList.GetItemData(pDelData->lItem);
		pSPData         = m_TSCmd.GetNext(pos2);  //ȡ���б��е�pos
		pDelData->lTSCmdID   = pSPData->lTSCmdID;
		pDelData ++;
	}
	m_pMainFrame->SendFrame( SMSFUNC_TSCMD_DEL , pDelSend , lSize );
}
void CTSCmdDlg::On_TSCmd_Refresh()
{
	RefreshInfo();
}


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

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