📄 ircwnd.cpp
字号:
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either
//version 2 of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
// IrcWnd.cpp : implementation file
//
#include "stdafx.h"
#include "IrcWnd.h"
#include "emule.h"
#include "otherfunctions.h"
#include "opcodes.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
// CIrcWnd dialog
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CIrcWnd, CDialog)
CIrcWnd::CIrcWnd(CWnd* pParent /*=NULL*/)
: CResizableDialog(CIrcWnd::IDD, pParent)
{
m_pIrcMain = 0; // i_a: bugfix: crash prevention
m_bConnected = false; // i_a
m_bLoggedIn = false; // i_a
m_pCurrentChannel = 0; // i_a
memset(&asc_sort, 0, sizeof(asc_sort)); // i_a
}
CIrcWnd::~CIrcWnd()
{
if( m_bConnected )
m_pIrcMain->Disconnect(true);
POSITION pos1, pos2;
for (pos1 = channelLPtrList.GetHeadPosition();( pos2 = pos1 ) != NULL;){
channelLPtrList.GetNext(pos1);
ChannelList* cur_channel = (ChannelList*)channelLPtrList.GetAt(pos2);
channelLPtrList.RemoveAt(pos2);
delete cur_channel;
}
DeleteAllChannel();
delete m_pIrcMain;
delete m_pIRCFont;
}
void CIrcWnd::UpdateNickCount(){
CHeaderCtrl* pHeaderCtrl;
HDITEM hdi;
hdi.mask = HDI_TEXT;
CString strRes;
pHeaderCtrl = nickList.GetHeaderCtrl();
if( nickList.GetItemCount() )
strRes.Format( "%s[%i]", GetResString(IDS_IRC_NICK), nickList.GetItemCount());
else
strRes.Format( "%s", GetResString(IDS_IRC_NICK));
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(0, &hdi);
strRes.ReleaseBuffer();
}
void CIrcWnd::Localize(){
if( m_bConnected )
GetDlgItem(IDC_BN_IRCCONNECT)->SetWindowText(GetResString(IDS_IRC_DISCONNECT));
else
GetDlgItem(IDC_BN_IRCCONNECT)->SetWindowText(GetResString(IDS_IRC_CONNECT));
GetDlgItem(IDC_CHATSEND)->SetWindowText(GetResString(IDS_IRC_SEND));
GetDlgItem(IDC_CLOSECHAT)->SetWindowText(GetResString(IDS_FD_CLOSE));
CHeaderCtrl* pHeaderCtrl;
HDITEM hdi;
hdi.mask = HDI_TEXT;
CString strRes;
UpdateNickCount();
pHeaderCtrl = serverChannelList.GetHeaderCtrl();
strRes = GetResString(IDS_UUSERS);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(1, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_DESCRIPTION);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(2, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_IRC_NAME);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(0, &hdi);
strRes.ReleaseBuffer();
}
BOOL CIrcWnd::OnInitDialog(){
CResizableDialog::OnInitDialog();
imagelist.Create(16,16,ILC_COLOR32 ,0,10);
imagelist.SetBkColor(::GetSysColor(COLOR_BTNFACE));
imagelist.Add(theApp.LoadIcon(IDI_CHAT));
imagelist.Add(theApp.LoadIcon(IDI_MESSAGE));
imagelist.Add(theApp.LoadIcon(IDI_MPENDING));
channelselect.SetImageList(&imagelist);
m_bConnected = false;
m_bLoggedIn = false;
Localize();
m_pIrcMain = new CIrcMain();
m_pIrcMain->SetIRCWnd(this);
nickList.InsertColumn(0,GetResString(IDS_IRC_NICK),LVCFMT_LEFT,113);
nickList.InsertColumn(1,"",LVCFMT_LEFT,32);
serverChannelList.InsertColumn(0, GetResString(IDS_IRC_NAME), LVCFMT_LEFT, 203 );
serverChannelList.InsertColumn(1, GetResString(IDS_UUSERS), LVCFMT_LEFT, 50 );
serverChannelList.InsertColumn(2, GetResString(IDS_DESCRIPTION), LVCFMT_LEFT, 350 );
CRect rect;
GetDlgItem(IDC_STATUSWINDOW)->GetWindowRect(rect);
::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rect, 2);
statusWindow.CreateEx(WS_EX_STATICEDGE,0,"MsgWnd",WS_CHILD | HTC_WORDWRAP |HTC_AUTO_SCROLL_BARS | HTC_UNDERLINE_HOVER,rect.left,rect.top,rect.Width(),rect.Height(),m_hWnd,0);
NewChannel( GetResString(IDS_STATUS), 1 );
NewChannel( GetResString(IDS_IRC_CHANNELLIST), 2);
m_pIRCFont = new CFont();
m_pIRCFont->CreatePointFont(110,_T("Times New Roman"));
statusWindow.SetFont(m_pIRCFont);
titleWindow.SetFont(m_pIRCFont);
inputWindow.SetFont(m_pIRCFont);
m_pCurrentChannel = (Channel*)channelPtrList.GetTail();
AddStatus( GetResString(IDS_IRC_STATUSLOG ));
titleWindow.SetWindowText(GetResString(IDS_IRC_CHANNELLIST));
channelselect.SetCurSel(1);
AddAnchor(IDC_BN_IRCCONNECT,BOTTOM_LEFT);
AddAnchor(IDC_CLOSECHAT,BOTTOM_LEFT);
AddAnchor(IDC_CHATSEND,BOTTOM_RIGHT);
AddAnchor(IDC_INPUTWINDOW,BOTTOM_LEFT,BOTTOM_RIGHT);
AddAnchor(IDC_NICKLIST,TOP_LEFT,BOTTOM_LEFT);
AddAnchor(IDC_TITLEWINDOW,TOP_LEFT,TOP_RIGHT);
AddAnchor(IDC_SERVERCHANNELLIST,TOP_LEFT,BOTTOM_RIGHT);
AddAnchor(statusWindow,TOP_LEFT,BOTTOM_RIGHT);
AddAnchor(IDC_TAB2,TOP_LEFT, TOP_RIGHT);
serverChannelList.SortItems(SortProcChanL, 11);
serverChannelList.SetSortArrow(1, false);
nickList.SortItems(SortProcNick, 0);
return true;
}
void CIrcWnd::OnSize(UINT nType, int cx, int cy)
{
CResizableDialog::OnSize(nType, cx, cy);
}
int CIrcWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) {
return CResizableDialog::OnCreate(lpCreateStruct);
}
void CIrcWnd::DoDataExchange(CDataExchange* pDX)
{
CResizableDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_NICKLIST, nickList);
DDX_Control(pDX, IDC_INPUTWINDOW, inputWindow);
DDX_Control(pDX, IDC_TITLEWINDOW, titleWindow);
DDX_Control(pDX, IDC_SERVERCHANNELLIST, serverChannelList);
DDX_Control(pDX, IDC_TAB2, channelselect);
}
BOOL CIrcWnd::OnCommand(WPARAM wParam,LPARAM lParam ){
int nickItem= nickList.GetSelectionMark();
int chanItem= channelselect.GetCurSel();
int chanLItem= serverChannelList.GetSelectionMark();
switch( wParam ){
case IDC_BN_IRCCONNECT: {
OnBnClickedBnIrcconnect();
return true;
}
case IDC_CHATSEND: {
OnBnClickedChatsend();
return true;
}
case IDC_CLOSECHAT: {
OnBnClickedClosechat();
return true;
}
case Irc_Priv: {
Nick* nick = (Nick*)nickList.GetItemData(nickItem);
if(nick)
AddInfoMessage( nick->nick, GetResString(IDS_IRC_PRIVATECHANSTART));
return true;
}
case Irc_Op: {
Nick* nick = (Nick*)nickList.GetItemData(nickItem);
TCITEM item;
item.mask = TCIF_PARAM;
channelselect.GetItem(chanItem,&item);
Channel* chan = (Channel*)item.lParam;
if( nick && chan ){
CString send;
send.Format( "MODE %s +o %s", chan->name, nick->nick );
m_pIrcMain->SendString(send);
}
return true;
}
case Irc_DeOp: {
Nick* nick = (Nick*)nickList.GetItemData(nickItem);
TCITEM item;
item.mask = TCIF_PARAM;
channelselect.GetItem(chanItem,&item);
Channel* chan = (Channel*)item.lParam;
if( nick && chan ){
CString send;
send.Format( "MODE %s -o %s", chan->name, nick->nick );
m_pIrcMain->SendString(send);
}
return true;
}
case Irc_HalfOp: {
Nick* nick = (Nick*)nickList.GetItemData(nickItem);
TCITEM item;
item.mask = TCIF_PARAM;
channelselect.GetItem(chanItem,&item);
Channel* chan = (Channel*)item.lParam;
if( nick && chan ){
CString send;
send.Format( "MODE %s +h %s", chan->name, nick->nick );
m_pIrcMain->SendString(send);
}
return true;
}
case Irc_DeHalfOp: {
Nick* nick = (Nick*)nickList.GetItemData(nickItem);
TCITEM item;
item.mask = TCIF_PARAM;
channelselect.GetItem(chanItem,&item);
Channel* chan = (Channel*)item.lParam;
if( nick && chan ){
CString send;
send.Format( "MODE %s -h %s", chan->name, nick->nick );
m_pIrcMain->SendString(send);
}
return true;
}
case Irc_Voice: {
Nick* nick = (Nick*)nickList.GetItemData(nickItem);
TCITEM item;
item.mask = TCIF_PARAM;
channelselect.GetItem(chanItem,&item);
Channel* chan = (Channel*)item.lParam;
if( nick && chan ){
CString send;
send.Format( "MODE %s +v %s", chan->name, nick->nick );
m_pIrcMain->SendString(send);
}
return true;
}
case Irc_DeVoice: {
Nick* nick = (Nick*)nickList.GetItemData(nickItem);
TCITEM item;
item.mask = TCIF_PARAM;
channelselect.GetItem(chanItem,&item);
Channel* chan = (Channel*)item.lParam;
if( nick && chan ){
CString send;
send.Format( "MODE %s -v %s", chan->name, nick->nick );
m_pIrcMain->SendString(send);
}
return true;
}
case Irc_Kick: {
Nick* nick = (Nick*)nickList.GetItemData(nickItem);
TCITEM item;
item.mask = TCIF_PARAM;
channelselect.GetItem(chanItem,&item);
Channel* chan = (Channel*)item.lParam;
if( nick && chan ){
CString send;
send.Format( "KICK %s %s", chan->name, nick->nick );
m_pIrcMain->SendString(send);
}
return true;
}
case Irc_Slap: {
Nick* nick = (Nick*)nickList.GetItemData(nickItem);
TCITEM item;
item.mask = TCIF_PARAM;
channelselect.GetItem(chanItem,&item);
Channel* chan = (Channel*)item.lParam;
if( nick && chan ){
CString send;
send.Format( IDS_IRC_SLAPMSGSEND, chan->name, nick->nick );
AddInfoMessage( chan->name, GetResString(IDS_IRC_SLAPMSG), m_pIrcMain->GetNick(), nick->nick);
m_pIrcMain->SendString(send);
}
return true;
}
case Irc_AddFriend: {
Nick* nick = (Nick*)nickList.GetItemData(nickItem);
TCITEM item;
item.mask = TCIF_PARAM;
channelselect.GetItem(chanItem,&item);
Channel* chan = (Channel*)item.lParam;
if( nick && chan ){
CString send;
send.Format( "PRIVMSG %s :\001RSQFRIEND |%i|\001", nick->nick, m_pIrcMain->SetVerify() );
m_pIrcMain->SendString(send);
}
return true;
}
case Irc_SendLink: {
Nick* nick = (Nick*)nickList.GetItemData(nickItem);
TCITEM item;
item.mask = TCIF_PARAM;
channelselect.GetItem(chanItem,&item);
Channel* chan = (Channel*)item.lParam;
if( nick && chan ){
CString send;
send.Format( "PRIVMSG %s :\001SENDLINK !|%s\001", nick->nick, GetSendFileString() );
m_pIrcMain->SendString(send);
}
return true;
}
case Irc_Close: {
OnBnClickedClosechat();
return true;
}
case Irc_Join: {
JoinChannels();
return true;
}
}
return true;
}
BOOL CIrcWnd::PreTranslateMessage(MSG* pMsg) {
if((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == 13)){
if (pMsg->hwnd == GetDlgItem(IDC_INPUTWINDOW)->m_hWnd)
OnBnClickedChatsend();
}
return CResizableDialog::PreTranslateMessage(pMsg);
}
void CIrcWnd::OnBnClickedBnIrcconnect()
{
if(!m_bConnected){
m_pIrcMain->Connect();
}
else{
m_pIrcMain->Disconnect();
}
}
void CIrcWnd::OnBnClickedClosechat()
{
TCITEM item;
item.mask = TCIF_PARAM;
int cur_sel = channelselect.GetCurSel();
if (cur_sel == (-1))
return;
channelselect.GetItem(cur_sel,&item);
Channel* partChannel = (Channel*)item.lParam;
if( partChannel ){
if( partChannel->type == 4 && m_bConnected){
CString part;
part = "PART " + partChannel->name;
m_pIrcMain->SendString( part );
return;
}
else if (partChannel->type == 5 || partChannel->type == 4){
RemoveChannel(partChannel->name);
return;
}
}
}
void CIrcWnd::OnTcnSelchangeTab2(NMHDR *pNMHDR, LRESULT *pResult)
{
// int index = -1;
// LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
nickList.DeleteAllItems();
TCITEM item;
item.mask = TCIF_PARAM;
int cur_sel = channelselect.GetCurSel();
if (cur_sel == (-1))
return;
channelselect.GetItem(cur_sel,&item);
Channel* update = (Channel*)item.lParam;
m_pCurrentChannel = update;
UpdateNickCount();
if( m_pCurrentChannel->type == 1 ){
titleWindow.SetWindowText(GetResString(IDS_STATUS));
statusWindow.ShowWindow(SW_SHOW);
serverChannelList.ShowWindow(SW_HIDE);
}
if( m_pCurrentChannel->type == 2 ){
titleWindow.SetWindowText(GetResString(IDS_IRC_CHANNELLIST));
statusWindow.ShowWindow(SW_HIDE);
serverChannelList.ShowWindow(SW_SHOW);
return;
}
SetActivity( m_pCurrentChannel->name, false );
statusWindow.SetHyperText(&m_pCurrentChannel->log);
statusWindow.ShowWindow(SW_SHOW);
serverChannelList.ShowWindow(SW_HIDE);
RefreshNickList( update->name );
SetTitle( update->name, update->title );
if( pResult )
*pResult = 0;
}
BEGIN_MESSAGE_MAP(CIrcWnd, CDialog)
ON_NOTIFY(NM_CLICK, IDC_NICKLIST, OnNMClickNicklist)
ON_NOTIFY(NM_DBLCLK, IDC_SERVERCHANNELLIST, OnNMDblclkserverChannelList)
ON_NOTIFY(NM_DBLCLK, IDC_NICKLIST, OnNMDblclkNickList)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_NICKLIST, OnColumnClickNick)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_SERVERCHANNELLIST, OnColumnClickChanL)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -