📄 serverlistctrl.cpp
字号:
//this file is part of eMule
//Copyright (C)2002 Merkur ( merkur-@users.sourceforge.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"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// CServerListCtrl
IMPLEMENT_DYNAMIC(CServerListCtrl, CMuleListCtrl)
CServerListCtrl::CServerListCtrl() {
server_list = 0; // i_a
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
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);
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(""));
}
BEGIN_MESSAGE_MAP(CServerListCtrl, CMuleListCtrl)
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)
ON_NOTIFY_REFLECT (NM_DBLCLK, OnNMLdblclk) //<-- mod bb 27.09.02
ON_WM_CONTEXTMENU()
ON_WM_SYSCOLORCHANGE()
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
// 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)
uCurPrioMenuItem = MP_PRIOLOW;
else if (pServer->GetPreferences() == SRV_PR_NORMAL)
uCurPrioMenuItem = MP_PRIONORMAL;
else if (pServer->GetPreferences() == SRV_PR_HIGH)
uCurPrioMenuItem = MP_PRIOHIGH;
else
ASSERT(0);
if (bFirstItem)
uPrioMenuItem = uCurPrioMenuItem;
else if (uPrioMenuItem != uCurPrioMenuItem)
uPrioMenuItem = 0;
bFirstItem = false;
}
CTitleMenu ServerMenu;
ServerMenu.CreatePopupMenu();
ServerMenu.AddMenuTitle(GetResString(IDS_EM_SERVER));
ServerMenu.AppendMenu(MF_STRING | (iSelectedItems > 0 ? MF_ENABLED : MF_GRAYED), MP_CONNECTTO, GetResString(IDS_CONNECTTHIS));
ServerMenu.SetDefaultItem(iSelectedItems > 0 ? MP_CONNECTTO : -1);
CMenu ServerPrioMenu;
ServerPrioMenu.CreateMenu();
if (iSelectedItems > 0){
ServerPrioMenu.AppendMenu(MF_STRING, MP_PRIOLOW, GetResString(IDS_PRIOLOW));
ServerPrioMenu.AppendMenu(MF_STRING, MP_PRIONORMAL, GetResString(IDS_PRIONORMAL));
ServerPrioMenu.AppendMenu(MF_STRING, MP_PRIOHIGH, GetResString(IDS_PRIOHIGH));
ServerPrioMenu.CheckMenuRadioItem(MP_PRIOLOW, MP_PRIOHIGH, uPrioMenuItem, 0);
}
ServerMenu.AppendMenu(MF_POPUP | (iSelectedItems > 0 ? MF_ENABLED : MF_GRAYED), (UINT_PTR)ServerPrioMenu.m_hMenu, GetResString(IDS_PRIORITY));
// enable add/remove from static server list, if there is at least one selected server which can be used for the action
ServerMenu.AppendMenu(MF_STRING | (iStaticServers < iSelectedItems ? MF_ENABLED : MF_GRAYED), MP_ADDTOSTATIC, GetResString(IDS_ADDTOSTATIC));
ServerMenu.AppendMenu(MF_STRING | (iStaticServers > 0 ? MF_ENABLED : MF_GRAYED), MP_REMOVEFROMSTATIC, GetResString(IDS_REMOVEFROMSTATIC));
ServerMenu.AppendMenu(MF_SEPARATOR);
ServerMenu.AppendMenu(MF_STRING | (iSelectedItems > 0 ? MF_ENABLED : MF_GRAYED), MP_REMOVE, GetResString(IDS_REMOVETHIS));
ServerMenu.AppendMenu(MF_STRING | (GetItemCount() > 0 ? MF_ENABLED : MF_GRAYED), MP_REMOVEALL, GetResString(IDS_REMOVEALL));
ServerMenu.AppendMenu(MF_STRING | (iSelectedItems > 0 ? MF_ENABLED : MF_GRAYED), MP_GETED2KLINK, GetResString(IDS_DL_LINK1));
ServerMenu.AppendMenu(MF_STRING | (theApp.IsEd2kServerLinkInClipboard() ? MF_ENABLED : MF_GRAYED), MP_PASTE, GetResString(IDS_PASTE));
ServerMenu.AppendMenu(MF_SEPARATOR);
ServerMenu.AppendMenu(MF_ENABLED | (GetItemCount() > 0 ? MF_ENABLED : MF_GRAYED), MP_FIND, GetResString(IDS_FIND));
GetPopupMenuPos(*this, point);
ServerMenu.TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, point.y, this);
VERIFY( ServerPrioMenu.DestroyMenu() );
VERIFY( ServerMenu.DestroyMenu() );
}
BOOL CServerListCtrl::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (wParam == MP_REMOVEALL)
{
if( theApp.serverconnect->IsConnecting() ){
theApp.downloadqueue->StopUDPRequests();
theApp.serverconnect->StopConnectionTry();
theApp.serverconnect->Disconnect();
theApp.emuledlg->ShowConnectionState();
}
ShowWindow(SW_HIDE);
server_list->RemoveAllServers();
DeleteAllItems();
ShowWindow(SW_SHOW);
ShowServerCount();
return TRUE;
}
else if (wParam == MP_FIND)
{
OnFindStart();
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -