// C_YWYGroup.cpp : implementation file
//

#include "stdafx.h"
#include "smsmanager.h"
#include "C_YWYGroup.h"

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

/////////////////////////////////////////////////////////////////////////////
// CC_YWYGroup dialog
#include "MainFrm.h"
#include "ProcessSocket.h"
#include "DLG_C_YWYGroup_Modify.h"

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

	m_bInit = false;
	m_bRefresh = false;
}


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


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

	ON_COMMAND( MENU_YWY_ADD    , On_User_Add)
	ON_COMMAND( MENU_YWY_MODIFY , On_User_Modify)
	ON_COMMAND( MENU_YWY_DEL    , On_User_Del)
	ON_COMMAND( MENU_YWY_REFRESH, On_User_Refresh)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CC_YWYGroup message handlers

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

void CC_YWYGroup::Close()
{
	Close_YWYGroup();
}

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

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

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

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

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

BOOL CC_YWYGroup::ProcessSocket(Socket_Head *pHead)
{
	//ȡ����Ա��Ϣ
	if (pHead->lFuncType == SMSFUNC_GETYWYGROUP)
	{
		m_bRefresh = true;  //�Ѿ�ˢ�¹�
		ANS_GetYWYGroup * pYWYGroup = (ANS_GetYWYGroup *)pHead->pFrame;
		ANS_GetYWYGroupData * pData = (ANS_GetYWYGroupData *)(pHead->pFrame+sizeof(ANS_GetYWYGroup));
		m_wndList.DeleteAllItems(); //ɾ��ԭ�е�����
		this->Close_YWYGroup();              //�ر�ԭ����
		TCHAR Buf[32];
		for ( int i=0;i<pYWYGroup->lCount;i++ )
		{
			ANS_GetYWYGroupData * pNewData = new ANS_GetYWYGroupData;
			*pNewData = *pData;
			POSITION pos = m_YWYGroup.AddTail(pNewData);
			m_wndList.SetHeadings(_T("���,50; ��������,120; ��ע,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->szBZ);
			pData ++;
		}
		return true;
	}
	//�޸Ĺ���Ա��Ϣ
	if (pHead->lFuncType == SMSFUNC_YWYGROUP_MODIFY)
	{
		ANS_YWYGroup_Modify * pModify = (ANS_YWYGroup_Modify *)pHead->pFrame;
		ANS_GetYWYGroupData * pData = (ANS_GetYWYGroupData *)(pHead->pFrame+sizeof(ANS_YWYGroup_Modify));
		SetLockItem( pModify->lItem , false );  //����
		if ( pModify->lCount == 1 )  //����1ʱ��ʾ�޸ijɹ�
		{
			POSITION pos = (POSITION)m_wndList.GetItemData(pModify->lItem);
			ANS_GetYWYGroupData * pData2 = m_YWYGroup.GetNext( pos );
			if ( pData2 )
			{
				*pData2 = *pData;    //ȡ���µ�����
				//�����µ�����
				m_wndList.SetItemText( pModify->lItem , 1 , pData->szName );
				m_wndList.SetItemText( pModify->lItem , 2 , pData->szBZ );
			}
		}
		return true;
	}
	//���ӹ���Ա
	if (pHead->lFuncType == SMSFUNC_YWYGROUP_ADD)
	{
		ANS_YWYGroup_Add * pAdd = (ANS_YWYGroup_Add *)pHead->pFrame;
		ANS_GetYWYGroupData * pData = (ANS_GetYWYGroupData *)(pHead->pFrame+sizeof(ANS_YWYGroup_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->szBZ );

			ANS_GetYWYGroupData * pData2 = new ANS_GetYWYGroupData;
			*pData2 = *pData;
			POSITION pos = m_YWYGroup.AddTail( pData2 );
			m_wndList.SetItemData( lCount, (DWORD_PTR)pos );
			//������ص��û�ID����������ˢ��
			if ( pData->lGroupID <= 0 )
			{
				RefreshInfo();
			}
		}
		return true;
	}
	//ɾ������Ա
	if (pHead->lFuncType == SMSFUNC_YWYGROUP_DEL)
	{
		ANS_YWYGroup_Del     * pDel     = (ANS_YWYGroup_Del     *)pHead->pFrame;
		ANS_YWYGroup_DelData * pDelData = (ANS_YWYGroup_DelData *)(pHead->pFrame+sizeof(ANS_YWYGroup_Del));
		POSITION pos,pos2;
		ANS_GetYWYGroupData  * pYWYGroupData;
		for ( int i = pDel->lCount-1 ; i>=0 ; i-- )
		{
			if ( pDelData[i].lGroupID )  //ɾ���ɹ�
			{
				pos = (POSITION)m_wndList.GetItemData( pDelData[i].lItem );
				pos2 = pos;
				pYWYGroupData = m_YWYGroup.GetNext( pos );
				if ( pYWYGroupData->lGroupID == pDelData[i].lGroupID )  //ID��ͬ�IJſ�ɾ��
				{
					delete pYWYGroupData;       //��ɾ������
					m_YWYGroup.RemoveAt(pos2);   //���б���ɾ��
					m_wndList.DeleteItem(pDelData[i].lItem); //��ListCtrl��ɾ��
				}
			}
		}
		return true;
	}
	return false;
}

void CC_YWYGroup::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_YWY_ADD, _T(" ���Ӳ��� ") );
	}
	else
	{
		menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_YWY_ADD , _T(" ���Ӳ��� ") );
	}
	//�޸�
	if ( m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_MODIFY,false) && lItem >=0 && !bLock)
	{
		menu.AppendMenu(MF_STRING     , MENU_YWY_MODIFY, _T(" �� �� ") );
	}
	else
	{
		menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_YWY_MODIFY , _T(" �� �� ") );
	}
	//ɾ��
	if ( m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_DEL,false) && lItem >=0 && !bLock )
	{
		menu.AppendMenu(MF_STRING     , MENU_YWY_DEL, _T(" ɾ �� ") );
	}
	else
	{
		menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_YWY_DEL , _T(" ɾ �� ") );
	}

	menu.AppendMenu(MF_SEPARATOR );
	//ˢ��
	menu.AppendMenu(MF_STRING     , MENU_YWY_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_YWYGroup::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; ��������,120; ��ע,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 CC_YWYGroup::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	if ( m_bInit )
	{
		m_wndList.MoveWindow( 0 , 0 , cx,cy);
	}
}

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

	On_User_Modify();
}

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

	ShowRMenu();
}

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

void CC_YWYGroup::On_User_Add()
{
	if ( !m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_ADD) )
	{
		return ;
	}
	ANS_GetYWYGroupData YWYGroupData={0};
	DLG_C_YWYGroup_Modify dlg(this);
	dlg.SetParam( YWYGroupData,0,true);
	if ( dlg.DoModal() == IDOK )
	{
		long lSize = sizeof(REQ_YWYGroup_Add)+sizeof(ANS_GetYWYGroupData);
		BYTE * pAddData = new BYTE[lSize];memset(pAddData,0,lSize);
		REQ_YWYGroup_Add * pAdd = (REQ_YWYGroup_Add *)pAddData;   //ͷ
		ANS_GetYWYGroupData * pYWYGroupData = (ANS_GetYWYGroupData *)(pAddData+sizeof(REQ_YWYGroup_Add));
		*pYWYGroupData = dlg.GetParam();
		pAdd->lCount = 1;
		m_pMainFrame->SendFrame( SMSFUNC_YWYGROUP_ADD , pAddData , lSize );
	}
}
void CC_YWYGroup::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_GetYWYGroupData * pData = m_YWYGroup.GetNext( pos );
	if (pData)
	{
		DLG_C_YWYGroup_Modify dlg(this);
		dlg.SetParam( *pData,pos2,false);
		if ( dlg.DoModal() == IDOK )
		{
			SetLockItem( lItem ,true);
			long lSize = sizeof(REQ_YWYGroup_Modify)+sizeof(ANS_GetYWYGroupData);
			BYTE * pModifyData = new BYTE[lSize];memset(pModifyData,0,lSize);
			REQ_YWYGroup_Modify * pModify = (REQ_YWYGroup_Modify *)pModifyData;   //ͷ
			ANS_GetYWYGroupData * pYWYGroupData = (ANS_GetYWYGroupData *)(pModifyData+sizeof(REQ_YWYGroup_Modify));
			*pYWYGroupData = dlg.GetParam();
			pModify->lItem  = lItem;
			pModify->lCount = 1;
			m_pMainFrame->SendFrame( SMSFUNC_YWYGROUP_MODIFY , pModifyData , lSize );
		}
	}

}
void CC_YWYGroup::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_YWYGroup_Del)+sizeof(ANS_YWYGroup_DelData)*lCount;
	BYTE * pDelSend = new BYTE[lSize];memset(pDelSend,0,lSize);
	REQ_YWYGroup_Del     * pDel = (REQ_YWYGroup_Del *)pDelSend;   //ͷ
	ANS_YWYGroup_DelData * pDelData = (ANS_YWYGroup_DelData *)(pDelSend+sizeof(REQ_YWYGroup_Del));
	pDel->lCount = lCount;
	POSITION pos = m_wndList.GetFirstSelectedItemPosition();
	ANS_GetYWYGroupData * pYWYGroupData;
	POSITION pos2;
	while(pos)
	{
		pDelData->lItem   = m_wndList.GetNextSelectedItem(pos);
		pos2              = (POSITION)m_wndList.GetItemData(pDelData->lItem);
		pYWYGroupData          = m_YWYGroup.GetNext(pos2);  //ȡ���б��е�pos
		pDelData->lGroupID = pYWYGroupData->lGroupID;
		pDelData ++;
	}
	m_pMainFrame->SendFrame( SMSFUNC_YWYGROUP_DEL , pDelSend , lSize );

}
void CC_YWYGroup::On_User_Refresh()
{
	RefreshInfo();
}

BOOL CC_YWYGroup::FindYWYLoginName(const TCHAR *pName, POSITION exPos)
{
	POSITION pos = m_YWYGroup.GetHeadPosition();
	POSITION pos2;
	while (pos)
	{
		pos2 = pos;
		ANS_GetYWYGroupData * pData = m_YWYGroup.GetNext( pos );
		if ( pos2 != exPos )
		{
			if ( !_tcscmp( pData->szName , pName ) )
				return true;
		}
	}
	return false;
}

BOOL CC_YWYGroup::FindYWYName(const TCHAR *pName, POSITION exPos)
{
	POSITION pos = m_YWYGroup.GetHeadPosition();
	POSITION pos2;
	while (pos)
	{
		pos2 = pos;
		ANS_GetYWYGroupData * pData = m_YWYGroup.GetNext( pos );
		if ( pos2 != exPos )
		{
			if ( !_tcscmp( pData->szName , pName ) )
				return true;
		}
	}
	return false;
}

void CC_YWYGroup::Close_YWYGroup()
{
	//������������
	while (!m_YWYGroup.IsEmpty())
	{
		ANS_GetYWYGroupData * pYWYGroup = m_YWYGroup.GetHead();
		m_YWYGroup.RemoveHead();
		delete pYWYGroup;
	}
}