📄 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.
// ServerListCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "emule.h"
#include "ServerListCtrl.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// CServerListCtrl
IMPLEMENT_DYNAMIC(CServerListCtrl, CMuleListCtrl/*CTreeCtrl*/)
CServerListCtrl::CServerListCtrl() {
server_list = 0; // i_a
}
bool CServerListCtrl::Init(CServerList* in_list){
this->ModifyStyle(0,TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS);
// Set Imagelist
server_list = in_list;
imagelist.Create(16,16,ILC_COLOR16|ILC_MASK,0,10);
imagelist.SetBkColor(RGB(255,255,255));
imagelist.Add(theApp.LoadIcon(IDI_ICON1));
this->SetImageList(&imagelist,LVSIL_SMALL);//TVSIL_NORMAL);
this->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_LEFT, 50);
InsertColumn(4, GetResString(IDS_UUSERS), LVCFMT_LEFT, 50);
InsertColumn(5, GetResString(IDS_MAXCLIENT), LVCFMT_LEFT, 50);
InsertColumn(6,GetResString(IDS_PW_FILES) ,LVCFMT_LEFT, 50);
InsertColumn(7,GetResString(IDS_PREFERENCE),LVCFMT_LEFT, 60);
InsertColumn(8,GetResString(IDS_UFAILED),LVCFMT_LEFT, 50);
InsertColumn(9,GetResString(IDS_STATICSERVER),LVCFMT_LEFT, 50);
LoadSettings(CPreferences::tableServer);
// Barry - Use preferred sort order from preferences
int sortItem = theApp.glob_prefs->GetColumnSortItem(CPreferences::tableServer);
bool sortAscending = theApp.glob_prefs->GetColumnSortAscending(CPreferences::tableServer);
SetSortArrow(sortItem, sortAscending);
SortItems(SortProc, sortItem + (sortAscending ? 0:100));
return true;
}
CServerListCtrl::~CServerListCtrl() {
}
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();
}
/*void CServerListCtrl::ShowServers(){
DeleteAllItems();
int i=0;
CString temp;
for(POSITION pos = server_list->list.GetHeadPosition(); pos != NULL;server_list->list.GetNext(pos)) {
CServer* cur_server = server_list->list.GetAt(pos);
InsertItem(LVIF_TEXT|LVIF_PARAM,i,cur_server->GetListName(),0,0,0,(LPARAM)cur_server);
RefreshServer( cur_server );
i++;
}
}
*/
void CServerListCtrl::RemoveServer(CServer* todel,bool bDelToList){
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);
}
ShowFilesCount();
return;
}
// Remove Dead Servers
void CServerListCtrl::RemoveDeadServer(){
if( theApp.glob_prefs->DeadServer() ){
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() > theApp.glob_prefs->GetDeadserverRetries() ){ // MAX_SERVERFAILCOUNT
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 );
}
ShowFilesCount();
return true;
}
void CServerListCtrl::RefreshServer( CServer* server ){
LVFINDINFO find;
find.flags = LVFI_PARAM;
find.lParam = (LPARAM)server;
sint32 itemnr = FindItem(&find);
if (itemnr == (-1))
return;
CString temp;
if( !server )
return;
temp.Format( "%s : %i",server->GetAddress(),server->GetPort());
SetItemText(itemnr,1,(LPCTSTR)temp);
if(server->GetListName()){
temp.Format( server->GetListName());
SetItemText(itemnr,0,(LPCTSTR)temp);
}
if(server->GetDescription()){
temp.Format( server->GetDescription());
SetItemText(itemnr,2,(LPCTSTR)temp);
}
if(server->GetPing()){
temp.Format( "%i",server->GetPing());
SetItemText(itemnr,3,(LPCTSTR)temp);
}
if(server->GetUsers()){
temp.Format( "%i",server->GetUsers());
SetItemText(itemnr,4,(LPCTSTR)temp);
}
if(server->GetMaxUsers()){
temp.Format( "%i",server->GetMaxUsers());
SetItemText(itemnr,5,(LPCTSTR)temp);
}
if(server->GetFiles()){
temp.Format( "%i",server->GetFiles());
SetItemText(itemnr,6,(LPCTSTR)temp);
}
switch(server->GetPreferences()){
case SRV_PR_LOW:
temp.Format( IDS_PRIOLOW);
SetItemText(itemnr,7,(LPCTSTR)temp);
break;
case SRV_PR_NORMAL:
temp.Format( IDS_PRIONORMAL);
SetItemText(itemnr,7,(LPCTSTR)temp);
break;
case SRV_PR_HIGH:
temp.Format( IDS_PRIOHIGH);
SetItemText(itemnr,7,(LPCTSTR)temp);
break;
default:
temp.Format( GetResString(IDS_PRIONOPREF));
SetItemText(itemnr,7,(LPCTSTR)temp);
}
if( server->GetFailedCount() < 0 )
server->ResetFailedCount();
temp.Format( "%i",server->GetFailedCount());
SetItemText(itemnr,8,(LPCTSTR)temp);
if (server->IsStaticMember())
SetItemText(itemnr,9,GetResString(IDS_YES));
else
SetItemText(itemnr,9,GetResString(IDS_NO));
}
BEGIN_MESSAGE_MAP(CServerListCtrl, CMuleListCtrl/*CTreeCtrl*/)
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)
ON_NOTIFY_REFLECT (NM_DBLCLK, OnNMLdblclk) //<-- mod bb 27.09.02
ON_WM_CONTEXTMENU()
END_MESSAGE_MAP()
// CServerListCtrl message handlers
void CServerListCtrl::OnContextMenu(CWnd* pWnd, CPoint point)
{
// POINT point;
// ::GetCursorPos(&point);
// tecxx 0609 2002
// fix - on right click, we also want to change the current selection like the left click does
CPoint p = point;
ScreenToClient(&p);
int it = HitTest(p);
if (it != -1)
SetSelectionMark(it); // display selection mark correctly!
// fix end
// Create up-to-date popupmenu
UINT flags,flagSSL1,flagSSL2;
CTitleMenu m_ServerMenu;
CMenu m_ServerPrioMenu;
CServer* test=NULL;
if (this->GetSelectionMark() != -1) test=(CServer*)GetItemData(GetSelectionMark());
// set state of selection-dependent menuitems
flags=MF_STRING || MF_DISABLED;
if (this->GetSelectionMark() != -1) if (test != NULL) flags=MF_STRING;
flagSSL1=MF_STRING || MF_DISABLED;
flagSSL2=MF_STRING || MF_DISABLED;
if (test != NULL)
if (test->IsStaticMember()) flagSSL2=MF_STRING; else flagSSL1=MF_STRING;
// add priority switcher
m_ServerPrioMenu.CreateMenu();
m_ServerPrioMenu.AppendMenu(MF_STRING,MP_PRIOLOW,GetResString(IDS_PRIOLOW));
m_ServerPrioMenu.AppendMenu(MF_STRING,MP_PRIONORMAL,GetResString(IDS_PRIONORMAL));
m_ServerPrioMenu.AppendMenu(MF_STRING,MP_PRIOHIGH,GetResString(IDS_PRIOHIGH));
m_ServerMenu.CreatePopupMenu();
m_ServerMenu.AddMenuTitle(GetResString(IDS_EM_SERVER));
m_ServerMenu.AppendMenu(flags,MP_CONNECTTO, GetResString(IDS_CONNECTTHIS));
m_ServerMenu.AppendMenu(flags|MF_POPUP,(UINT_PTR)m_ServerPrioMenu.m_hMenu, GetResString(IDS_PRIORITY));
m_ServerMenu.AppendMenu( flagSSL1,MP_ADDTOSTATIC, GetResString(IDS_ADDTOSTATIC));
m_ServerMenu.AppendMenu( flagSSL2,MP_REMOVEFROMSTATIC, GetResString(IDS_REMOVEFROMSTATIC));
m_ServerMenu.AppendMenu(MF_STRING|MF_SEPARATOR);
m_ServerMenu.AppendMenu(flags,MP_REMOVE, GetResString(IDS_REMOVETHIS));
m_ServerMenu.AppendMenu(MF_STRING,MP_REMOVEALL, GetResString(IDS_REMOVEALL));
m_ServerMenu.AppendMenu(MF_SEPARATOR);
m_ServerMenu.AppendMenu(MF_STRING,MP_GETED2KLINK, GetResString(IDS_DL_LINK1) );
// m_ServerMenu.AppendMenu(MF_STRING,Irc_SetSendLink,GetResString(IDS_IRC_ADDLINKTOIRC));
m_ServerMenu.SetDefaultItem(MP_CONNECTTO);
m_ServerMenu.TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, point.y, this);
m_ServerMenu.DestroyMenu();
m_ServerPrioMenu.DestroyMenu();
}
BOOL CServerListCtrl::OnCommand(WPARAM wParam,LPARAM lParam ){
int item= this->GetSelectionMark();
if (wParam==MP_REMOVEALL)
{
if( theApp.serverconnect->IsConnecting() ){
theApp.downloadqueue->StopUDPRequests();
theApp.serverconnect->StopConnectionTry();
theApp.serverconnect->Disconnect();
theApp.emuledlg->ShowConnectionState(false);
}
ShowWindow(SW_HIDE);
server_list->RemoveAllServers();
DeleteAllItems();
ShowWindow(SW_SHOW);
ShowFilesCount();
return true;
}
if (item != -1){
if (((CServer*)GetItemData(GetSelectionMark())) != NULL){
switch (wParam){
case MP_CONNECTTO:
{
if ( this->GetSelectedCount()>1 ) {
CServer* aServer;
uint32 newPosition=0;
theApp.serverconnect->Disconnect();
POSITION pos=GetFirstSelectedItemPosition();
while (pos!=NULL )
{
item = this->GetNextSelectedItem(pos);
if (item>-1) {
aServer=(CServer*)this->GetItemData(item);
theApp.serverlist->MoveServerDown(aServer);
}
}
theApp.serverconnect->ConnectToAnyServer( theApp.serverlist->GetServerCount()- this->GetSelectedCount(),false, false );
} else {
theApp.serverconnect->ConnectToServer((CServer*)GetItemData(GetSelectionMark()));
}
theApp.emuledlg->ShowConnectionState(false);
break;
}
case MP_REMOVE:
{
ShowWindow(SW_HIDE);
POSITION pos;
while (GetFirstSelectedItemPosition()!=NULL) //(pos != NULL)
{
pos=GetFirstSelectedItemPosition();
item = this->GetNextSelectedItem(pos);
server_list->RemoveServer( (CServer*)this->GetItemData(item));
DeleteItem(item);
}
ShowFilesCount();
ShowWindow(SW_SHOW);
break;
}
case MP_ADDTOSTATIC:{
POSITION pos=GetFirstSelectedItemPosition();
while( pos != NULL ){
CServer* change = (CServer*)this->GetItemData(this->GetNextSelectedItem(pos));
if (!StaticServerFileAppend(change))
return false;
change->SetIsStaticMember(true);
theApp.emuledlg->serverwnd.serverlistctrl.RefreshServer(change);
}
break;
}
// Remove Static Servers [Barry]
case MP_REMOVEFROMSTATIC:
{
POSITION pos=GetFirstSelectedItemPosition();
while( pos != NULL ){
CServer* change = (CServer*)this->GetItemData(this->GetNextSelectedItem(pos));
if (!StaticServerFileRemove(change))
return false;
change->SetIsStaticMember(false);
theApp.emuledlg->serverwnd.serverlistctrl.RefreshServer(change);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -