📄 serverlistctrl.cpp
字号:
//this file is part of eMule
//Copyright (C)2002 Merkur ( devs@emule-project.net / http://www.emule-project.net )
//
//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.
#include "stdafx.h"
#include <share.h>
#include "emule.h"
#include "ServerListCtrl.h"
#include "OtherFunctions.h"
#include "emuledlg.h"
#include "DownloadQueue.h"
#include "ServerList.h"
#include "Server.h"
#include "Sockets.h"
#include "MenuCmds.h"
#include "ServerWnd.h"
#include "IrcWnd.h"
#include "Opcodes.h"
#include "IP2Country.h" //EastShare - added by AndCycle, IP to Country
#include "MemDC.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
IMPLEMENT_DYNAMIC(CServerListCtrl, CMuleListCtrl)
BEGIN_MESSAGE_MAP(CServerListCtrl, CMuleListCtrl)
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnNMLdblclk)
ON_NOTIFY_REFLECT(LVN_GETINFOTIP, OnLvnGetInfoTip)
ON_WM_CONTEXTMENU()
ON_WM_SYSCOLORCHANGE()
END_MESSAGE_MAP()
CServerListCtrl::CServerListCtrl()
{
server_list = NULL;
SetGeneralPurposeFind(true);
}
bool CServerListCtrl::Init(CServerList* in_list)
{
server_list = in_list;
ModifyStyle(0,LVS_SINGLESEL|LVS_REPORT);
ModifyStyle(LVS_SINGLESEL|LVS_LIST|LVS_ICON|LVS_SMALLICON,LVS_REPORT); //here the CListCtrl is set to report-style
SetExtendedStyle(GetExtendedStyle() | LVS_EX_INFOTIP);
InsertColumn(0, GetResString(IDS_SL_SERVERNAME),LVCFMT_LEFT, 150);
InsertColumn(1, GetResString(IDS_IP), LVCFMT_LEFT, 140);
InsertColumn(2, GetResString(IDS_DESCRIPTION), LVCFMT_LEFT, 150);
InsertColumn(3, GetResString(IDS_PING), LVCFMT_RIGHT, 50);
InsertColumn(4, GetResString(IDS_UUSERS), LVCFMT_RIGHT, 50);
InsertColumn(5, GetResString(IDS_MAXCLIENT), LVCFMT_RIGHT, 50);
InsertColumn(6, GetResString(IDS_PW_FILES) , LVCFMT_RIGHT, 50);
InsertColumn(7, GetResString(IDS_PREFERENCE), LVCFMT_LEFT, 60);
InsertColumn(8, GetResString(IDS_UFAILED), LVCFMT_RIGHT, 50);
InsertColumn(9, GetResString(IDS_STATICSERVER), LVCFMT_LEFT, 50);
InsertColumn(10,GetResString(IDS_SOFTFILES), LVCFMT_RIGHT, 50);
InsertColumn(11,GetResString(IDS_HARDFILES), LVCFMT_RIGHT, 50);
InsertColumn(12,GetResString(IDS_VERSION), LVCFMT_LEFT, 50);
InsertColumn(13,GetResString(IDS_IDLOW), LVCFMT_RIGHT, 50);
SetAllIcons();
Localize();
LoadSettings(CPreferences::tableServer);
// Barry - Use preferred sort order from preferences
int iSortItem = thePrefs.GetColumnSortItem(CPreferences::tableServer);
bool bSortAscending = thePrefs.GetColumnSortAscending(CPreferences::tableServer);
SetSortArrow(iSortItem, bSortAscending);
SortItems(SortProc, MAKELONG(iSortItem, (bSortAscending ? 0 : 0x0001)));
ShowServerCount();
return true;
}
CServerListCtrl::~CServerListCtrl() {
}
void CServerListCtrl::OnSysColorChange()
{
CMuleListCtrl::OnSysColorChange();
SetAllIcons();
}
void CServerListCtrl::SetAllIcons()
{
CImageList iml;
iml.Create(16,16,theApp.m_iDfltImageListColorFlags|ILC_MASK,0,1);
iml.SetBkColor(CLR_NONE);
iml.Add(CTempIconLoader(_T("Server")));
HIMAGELIST himl = ApplyImageList(iml.Detach());
if (himl)
ImageList_Destroy(himl);
}
void CServerListCtrl::Localize()
{
CHeaderCtrl* pHeaderCtrl = GetHeaderCtrl();
HDITEM hdi;
hdi.mask = HDI_TEXT;
CString strRes;
strRes = GetResString(IDS_SL_SERVERNAME);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(0, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_IP);
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_PING);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(3, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_UUSERS);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(4, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_MAXCLIENT);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(5, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_PW_FILES);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(6, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_PREFERENCE);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(7, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_UFAILED);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(8, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_STATICSERVER);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(9, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_SOFTFILES);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(10, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_HARDFILES);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(11, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_VERSION);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(12, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_IDLOW);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(13, &hdi);
strRes.ReleaseBuffer();
int iItems = GetItemCount();
for (int i = 0; i < iItems; i++)
RefreshServer((CServer*)GetItemData(i));
}
void CServerListCtrl::RemoveServer(CServer* todel)
{
LVFINDINFO find;
find.flags = LVFI_PARAM;
find.lParam = (LPARAM)todel;
sint32 result = FindItem(&find);
if (result != (-1) ){
server_list->RemoveServer((CServer*)GetItemData(result));
DeleteItem(result);
ShowServerCount();
}
return;
}
void CServerListCtrl::RemoveAllDeadServers()
{
ShowWindow(SW_HIDE);
for(POSITION pos = server_list->list.GetHeadPosition(); pos != NULL;server_list->list.GetNext(pos)) {
CServer* cur_server = server_list->list.GetAt(pos);
if (cur_server->GetFailedCount() >= thePrefs.GetDeadserverRetries()){
RemoveServer(cur_server);
pos = server_list->list.GetHeadPosition();
}
}
ShowWindow(SW_SHOW);
}
bool CServerListCtrl::AddServer(CServer* toadd, bool bAddToList)
{
if (!server_list->AddServer(toadd))
return false;
if (bAddToList)
{
uint32 itemnr = GetItemCount();
InsertItem(LVIF_TEXT|LVIF_PARAM,itemnr,toadd->GetListName(),0,0,1,(LPARAM)toadd);
RefreshServer( toadd );
}
ShowServerCount();
return true;
}
void CServerListCtrl::RefreshServer(const CServer* server)
{
if (!server || !theApp.emuledlg->IsRunning())
return;
LVFINDINFO find;
find.flags = LVFI_PARAM;
find.lParam = (LPARAM)server;
int itemnr = FindItem(&find);
if (itemnr == -1)
return;
const CServer* cur_srv;
if (theApp.serverconnect->IsConnected()
&& (cur_srv = theApp.serverconnect->GetCurrentServer()) != NULL
&& cur_srv->GetPort() == server->GetPort()
&& _tcsicmp(cur_srv->GetAddress(), server->GetAddress()) == 0)
SetItemState(itemnr,LVIS_GLOW,LVIS_GLOW);
else
SetItemState(itemnr, 0, LVIS_GLOW);
CString temp;
temp.Format(_T("%s : %i"), server->GetAddress(), server->GetPort());
SetItemText(itemnr, 1, temp);
//EastShare Start - added by AndCycle, IP to Country
CString tempServerName;
tempServerName = server->GetCountryName();
tempServerName.Append(server->GetListName()?(LPCTSTR)server->GetListName():_T(""));
SetItemText(itemnr,0,tempServerName);
/*
//original
SetItemText(itemnr,0,server->GetListName()?(LPCTSTR)server->GetListName():_T(""));
*/
//EastShare End - added by AndCycle, IP to Country
SetItemText(itemnr,0,server->GetListName());
SetItemText(itemnr,2,server->GetDescription());
// Ping
if(server->GetPing()){
temp.Format(_T("%i"), server->GetPing());
SetItemText(itemnr, 3, temp);
}
else
SetItemText(itemnr,3,_T(""));
// Users
if (server->GetUsers())
SetItemText(itemnr, 4, CastItoIShort(server->GetUsers()));
else
SetItemText(itemnr,4,_T(""));
// Max Users
if (server->GetMaxUsers())
SetItemText(itemnr, 5, CastItoIShort(server->GetMaxUsers()));
else
SetItemText(itemnr,5,_T(""));
// Files
if (server->GetFiles())
SetItemText(itemnr, 6, CastItoIShort(server->GetFiles()));
else
SetItemText(itemnr,6,_T(""));
switch(server->GetPreferences()){
case SRV_PR_LOW:
SetItemText(itemnr, 7, GetResString(IDS_PRIOLOW));
break;
case SRV_PR_NORMAL:
SetItemText(itemnr, 7, GetResString(IDS_PRIONORMAL));
break;
case SRV_PR_HIGH:
SetItemText(itemnr, 7, GetResString(IDS_PRIOHIGH));
break;
default:
SetItemText(itemnr, 7, GetResString(IDS_PRIONOPREF));
}
// Failed Count
temp.Format(_T("%i"), server->GetFailedCount());
SetItemText(itemnr, 8, temp);
// Static server
if (server->IsStaticMember())
SetItemText(itemnr,9,GetResString(IDS_YES));
else
SetItemText(itemnr,9,GetResString(IDS_NO));
// Soft Files
if (server->GetSoftFiles())
SetItemText(itemnr, 10, CastItoIShort(server->GetSoftFiles()));
else
SetItemText(itemnr,10,_T(""));
// Hard Files
if (server->GetHardFiles())
SetItemText(itemnr, 11, CastItoIShort(server->GetHardFiles()));
else
SetItemText(itemnr,11,_T(""));
temp = server->GetVersion();
if (thePrefs.GetDebugServerUDPLevel() > 0){
if (server->GetUDPFlags() != 0){
if (!temp.IsEmpty())
temp += _T("; ");
temp.AppendFormat(_T("ExtUDP=%x"), server->GetUDPFlags());
}
}
if (thePrefs.GetDebugServerTCPLevel() > 0){
if (server->GetTCPFlags() != 0){
if (!temp.IsEmpty())
temp += _T("; ");
temp.AppendFormat(_T("ExtTCP=%x"), server->GetTCPFlags());
}
}
SetItemText(itemnr,12,temp);
// LowID Users
if (server->GetLowIDUsers())
SetItemText(itemnr, 13, CastItoIShort(server->GetLowIDUsers()));
else
SetItemText(itemnr, 13,_T(""));
}
//EastShare Start - added by AndCycle, IP to Country
void CServerListCtrl::RefreshAllServer(){
for(POSITION pos = server_list->list.GetHeadPosition(); pos != NULL;){
RefreshServer(server_list->list.GetAt(pos));
server_list->list.GetNext(pos);
}
}
//EastShare End - added by AndCycle, IP to Country
// CServerListCtrl message handlers
void CServerListCtrl::OnContextMenu(CWnd* pWnd, CPoint point)
{
// get merged settings
bool bFirstItem = true;
int iSelectedItems = GetSelectedCount();
int iStaticServers = 0;
UINT uPrioMenuItem = 0;
POSITION pos = GetFirstSelectedItemPosition();
while (pos)
{
const CServer* pServer = (CServer*)GetItemData(GetNextSelectedItem(pos));
iStaticServers += pServer->IsStaticMember() ? 1 : 0;
UINT uCurPrioMenuItem = 0;
if (pServer->GetPreferences() == SRV_PR_LOW)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -