⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serverlistctrl.cpp

📁 非常出名开源客户端下载的程序emule
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//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 + -