SmsManager/FiltDlg.cpp
2025-01-14 10:46:18 +08:00

464 lines
12 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// FiltDlg.cpp : implementation file
//
#include "stdafx.h"
#include "smsmanager.h"
#include "FiltDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFiltDlg dialog
#include "MainFrm.h"
#include "ProcessSocket.h"
#include "DLG_Filt_Modify.h"
CFiltDlg::CFiltDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFiltDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFiltDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_bInit = false;
m_bRefresh = false;
}
void CFiltDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFiltDlg)
DDX_Control(pDX, IDC_FILT_LIST, m_wndList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFiltDlg, CDialog)
//{{AFX_MSG_MAP(CFiltDlg)
ON_WM_SIZE()
ON_NOTIFY(NM_DBLCLK, IDC_FILT_LIST, OnDblclkFiltList)
ON_NOTIFY(NM_RCLICK, IDC_FILT_LIST, OnRclickFiltList)
//}}AFX_MSG_MAP
ON_COMMAND( MENU_FILT_ADD , On_Filt_Add )
ON_COMMAND( MENU_FILT_MODIFY , On_Filt_Modify )
ON_COMMAND( MENU_FILT_DEL , On_Filt_Del )
ON_COMMAND( MENU_FILT_REFRESH, On_Filt_Refresh )
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFiltDlg message handlers
BOOL CFiltDlg::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_FILT) );
m_Image.Add(AfxGetApp()->LoadIcon(IDI_L_LOCK) );
m_wndList.SubClassWindow2();
m_wndList.SetHeadings(_T("序号,50; 过滤词语,200;过滤方式,80;过滤起点,100;发即死,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 CFiltDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if ( m_bInit )
{
m_wndList.MoveWindow( 0 , 0 , cx,cy);
}
}
BOOL CFiltDlg::ReShow(BOOL bRefresh)
{
ShowWindow( SW_SHOW );
if ( bRefresh || !m_bRefresh )
{
RefreshInfo();
}
return true;
}
BOOL CFiltDlg::RefreshInfo()
{
if ( !m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_SEE) )
{
return false;
}
if ( !m_pMainFrame->GetUserPurview(PURVIEW_FILT) )
{
return false;
}
m_pMainFrame->SendFrame(SMSFUNC_FILT2_SEE,NULL,0);
return true;
}
BOOL CFiltDlg::ReHide()
{
ShowWindow( SW_HIDE );
return true;
}
BOOL CFiltDlg::ProcessSocket(Socket_Head *pHead)
{
if ( !m_pMainFrame->GetUserPurview(PURVIEW_MANAGER_SEE) )
{
return false;
}
//取过滤信息
if (pHead->lFuncType == SMSFUNC_FILT2_SEE)
{
m_bRefresh = true; //已经刷新过
ANS_Filt2_See * pSee = (ANS_Filt2_See *)pHead->pFrame;
ANS_Filt2_SeeData * pData = (ANS_Filt2_SeeData *)(pHead->pFrame+sizeof(ANS_Filt2_See));
m_wndList.ShowWindow(SW_HIDE);
m_wndList.DeleteAllItems(); //删除原有的内容
this->Close(); //关闭原队列
TCHAR Buf[32];
for ( int i=0;i<pSee->lCount;i++ )
{
ANS_Filt2_SeeData * pNewData = new ANS_Filt2_SeeData;
*pNewData = *pData;
POSITION pos = m_Filt.AddTail(pNewData);
//m_wndList.SetHeadings(_T("序号,50; 过滤词语,300;过滤方式,80;"));
_stprintf(Buf , _T("%d") , i+1 );
m_wndList.InsertItem( i , Buf , 0 );
m_wndList.SetItemData( i , (DWORD)pos ); //存Pos
m_wndList.SetItemText(i,1,pData->szWord);
_tcscpy( Buf , _T("精确") );
if ( pData->szFilt[0] == '1' )
_tcscpy( Buf , _T("模糊") );
m_wndList.SetItemText(i,2,Buf);
_stprintf( Buf , _T("%8d") , pData->lFiltBegin );
m_wndList.SetItemText(i,3,Buf);
if ( pData->bSDisable )
m_wndList.SetItemText(i,4, _T("") );
else
m_wndList.SetItemText(i,4, _T("") );
_stprintf(Buf, _T(" %d") , pData->lFStep );
m_wndList.SetItemText(i,5,Buf);
pData ++;
}
m_wndList.ShowWindow(SW_SHOW);
return true;
}
//添加过滤词语
if (pHead->lFuncType == SMSFUNC_FILT2_ADD)
{
ANS_Filt2_Add * pAdd = (ANS_Filt2_Add *)pHead->pFrame;
ANS_Filt2_SeeData * pData = (ANS_Filt2_SeeData *)(pHead->pFrame+sizeof(ANS_Filt2_Add));
if ( pAdd->lCount == 1 ) //等于1时表示修改成功
{
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->szWord);
_tcscpy( Buf , _T("精确") );
if ( pData->szFilt[0] == '1' )
_tcscpy( Buf , _T("模糊") );
m_wndList.SetItemText(lCount ,2,Buf);
_stprintf( Buf , _T("%8d") , pData->lFiltBegin );
m_wndList.SetItemText(lCount,3,Buf);
if ( pData->bSDisable )
m_wndList.SetItemText(lCount,4, _T("") );
else
m_wndList.SetItemText(lCount,4, _T("") );
_stprintf(Buf, _T(" %d") , pData->lFStep );
m_wndList.SetItemText(lCount,5,Buf);
ANS_Filt2_SeeData * pData2 = new ANS_Filt2_SeeData;
*pData2 = *pData;
POSITION pos = m_Filt.AddTail( pData2 );
m_wndList.SetItemData( lCount, (DWORD)pos );
//如果返回的用户ID错误则重新刷新
if ( pData->lFiltID <= 0 )
{
RefreshInfo();
}
}
return true;
}
//修改过滤信息
if (pHead->lFuncType == SMSFUNC_FILT2_MODIFY)
{
ANS_Filt2_Modify * pModify = (ANS_Filt2_Modify *)pHead->pFrame;
ANS_Filt2_SeeData * pData = (ANS_Filt2_SeeData *)(pHead->pFrame+sizeof(ANS_Filt2_Modify));
SetLockItem( pModify->lItem , false ); //解锁
if ( pModify->lCount == 1 ) //等于1时表示修改成功
{
POSITION pos = (POSITION)m_wndList.GetItemData(pModify->lItem);
ANS_Filt2_SeeData * pData2 = m_Filt.GetNext( pos );
if ( pData2 )
{
*pData2 = *pData; //取到新的数据
//设置新的数据
TCHAR Buf[32]={0};
m_wndList.SetItemText( pModify->lItem , 1 , pData->szWord );
_tcscpy( Buf , _T("精确") );
if ( pData->szFilt[0] == '1' )
_tcscpy( Buf , _T("模糊") );
m_wndList.SetItemText( pModify->lItem , 2 , Buf );
_stprintf( Buf , _T("%8d") , pData->lFiltBegin );
m_wndList.SetItemText(pModify->lItem,3,Buf);
if ( pData->bSDisable )
m_wndList.SetItemText(pModify->lItem,4, _T("") );
else
m_wndList.SetItemText(pModify->lItem,4, _T("") );
_stprintf(Buf, _T(" %d") , pData->lFStep );
m_wndList.SetItemText(pModify->lItem,5,Buf);
}
}
return true;
}
//删除过滤词语
if (pHead->lFuncType == SMSFUNC_FILT_DEL)
{
ANS_Filt_Del * pDel = (ANS_Filt_Del *)pHead->pFrame;
ANS_Filt_DelData * pDelData = (ANS_Filt_DelData *)(pHead->pFrame+sizeof(ANS_Filt_Del));
POSITION pos,pos2;
ANS_Filt2_SeeData * pFiltData;
for ( int i = pDel->lCount-1 ; i>=0 ; i-- )
{
if ( pDelData[i].lFiltID ) //删除成功
{
pos = (POSITION)m_wndList.GetItemData( pDelData[i].lItem );
pos2 = pos;
pFiltData = m_Filt.GetNext( pos );
if ( pFiltData->lFiltID == pDelData[i].lFiltID ) //ID相同的才可删除
{
delete pFiltData; //先删除数据
m_Filt.RemoveAt(pos2); //从列表中删除
m_wndList.DeleteItem(pDelData[i].lItem); //从ListCtrl中删除
}
}
}
return true;
}
return false;
}
void CFiltDlg::Close()
{
//清除队列中的内容
while (!m_Filt.IsEmpty())
{
ANS_Filt2_SeeData * pData = m_Filt.GetHead();
m_Filt.RemoveHead();
delete pData;
}
}
void CFiltDlg::OnDblclkFiltList(NMHDR* pNMHDR, LRESULT* pResult)
{
On_Filt_Modify();
*pResult = 0;
}
void CFiltDlg::OnRclickFiltList(NMHDR* pNMHDR, LRESULT* pResult)
{
ShowRMenu();
*pResult = 0;
}
void CFiltDlg::ShowRMenu()
{
if (!m_pMainFrame->GetUserPurview(PURVIEW_FILT,false)) //没有查看权限
return ;
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 ); //取得是否正在锁定
//添加
menu.AppendMenu(MF_STRING , MENU_FILT_ADD, _T(" 添加过滤语 ") );
//修改
if ( lItem >=0 && !bLock)
{
menu.AppendMenu(MF_STRING , MENU_FILT_MODIFY, _T(" 修 改 ") );
}
else
{
menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_FILT_MODIFY , _T(" 修 改 ") );
}
//删除
if ( lItem >=0 && !bLock )
{
menu.AppendMenu(MF_STRING , MENU_FILT_DEL, _T(" 删 除 ") );
}
else
{
menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_FILT_DEL , _T(" 删 除 ") );
}
menu.AppendMenu(MF_SEPARATOR );
//刷新
menu.AppendMenu(MF_STRING , MENU_FILT_REFRESH, _T(" 刷 新 ") );
//显示菜单
POINT pt ;
::GetCursorPos( &pt );
//this->ClientToScreen( &pt);
menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON,pt.x,pt.y, this, NULL);
menu.DestroyMenu();
}
long CFiltDlg::GetCurrentSelected()
{
POSITION pos = m_wndList.GetFirstSelectedItemPosition();
if ( pos )
{
return m_wndList.GetNextSelectedItem(pos);
}
return -1;
}
BOOL CFiltDlg::isLockItem(long lItem, BOOL bShowWarning)
{
BOOL b = (m_wndList.GetIconIndex(lItem) == 1);
if ( b && bShowWarning )
{
MessageBox( _T("正录被锁定,请等待服务器返回后再操作!") , _T("锁定中") , MB_ICONINFORMATION );
}
return b;
}
void CFiltDlg::SetLockItem(long lItem, BOOL bLock)
{
if ( bLock )
m_wndList.SetIconIndex( lItem , 1 );
else
m_wndList.SetIconIndex( lItem , 0 );
}
void CFiltDlg::On_Filt_Add()
{
if ( !m_pMainFrame->GetUserPurview(PURVIEW_FILT) )
{
return ;
}
ANS_Filt2_SeeData FiltData={0};
FiltData.lFStep = 3;
DLG_Filt_Modify dlg(this);
dlg.SetParam( FiltData );
if ( dlg.DoModal() == IDOK )
{
long lSize = sizeof(REQ_Filt2_Add)+sizeof(ANS_Filt2_SeeData);
BYTE * pAddData = new BYTE[lSize];memset(pAddData,0,lSize);
REQ_Filt2_Add * pAdd = (REQ_Filt2_Add *)pAddData; //头
ANS_Filt2_SeeData * pFiltData = (ANS_Filt2_SeeData *)(pAddData+sizeof(REQ_Filt2_Add));
*pFiltData = dlg.GetParam();
pAdd->lCount = 1;
m_pMainFrame->SendFrame( SMSFUNC_FILT2_ADD , pAddData , lSize );
}
}
void CFiltDlg::On_Filt_Modify()
{
if ( !m_pMainFrame->GetUserPurview(PURVIEW_FILT) )
{
return ;
}
long lItem = GetCurrentSelected();
if ( lItem < 0 )
return ;
if (isLockItem(lItem))
{
return ;
}
POSITION pos = (POSITION)m_wndList.GetItemData(lItem);
POSITION pos2 = pos;
ANS_Filt2_SeeData * pData = m_Filt.GetNext( pos );
if (pData)
{
DLG_Filt_Modify dlg(this);
dlg.SetParam( *pData);
if ( dlg.DoModal() == IDOK )
{
SetLockItem( lItem ,true);
long lSize = sizeof(REQ_Filt2_Modify)+sizeof(ANS_Filt2_SeeData);
BYTE * pModifyData = new BYTE[lSize];memset(pModifyData,0,lSize);
REQ_Filt2_Modify * pModify = (REQ_Filt2_Modify *)pModifyData; //头
ANS_Filt2_SeeData * pFiltData = (ANS_Filt2_SeeData *)(pModifyData+sizeof(REQ_Filt2_Modify));
*pFiltData = dlg.GetParam();
pModify->lItem = lItem;
pModify->lCount = 1;
m_pMainFrame->SendFrame( SMSFUNC_FILT2_MODIFY , pModifyData , lSize );
}
}
}
void CFiltDlg::On_Filt_Del()
{
if ( !m_pMainFrame->GetUserPurview(PURVIEW_FILT) )
{
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_Filt_Del)+sizeof(ANS_Filt_DelData)*lCount;
BYTE * pDelSend = new BYTE[lSize];memset(pDelSend,0,lSize);
REQ_Filt_Del * pDel = (REQ_Filt_Del *)pDelSend; //头
ANS_Filt_DelData * pDelData = (ANS_Filt_DelData *)(pDelSend+sizeof(REQ_Filt_Del));
pDel->lCount = lCount;
POSITION pos = m_wndList.GetFirstSelectedItemPosition();
ANS_Filt2_SeeData * pFiltData;
POSITION pos2;
while(pos)
{
pDelData->lItem = m_wndList.GetNextSelectedItem(pos);
pos2 = (POSITION)m_wndList.GetItemData(pDelData->lItem);
pFiltData = m_Filt.GetNext(pos2); //取得列表中的pos
pDelData->lFiltID = pFiltData->lFiltID;
pDelData ++;
}
m_pMainFrame->SendFrame( SMSFUNC_FILT_DEL , pDelSend , lSize );
}
void CFiltDlg::On_Filt_Refresh()
{
RefreshInfo();
}