📄 serverlistctrl.cpp
字号:
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 (AfxMessageBox(_T("Do you really want to remove all servers?"), MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2) != IDYES)
return TRUE;
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;
}
else if (wParam == MP_PASTE)
{
if (theApp.IsEd2kServerLinkInClipboard())
theApp.emuledlg->serverwnd->PasteServerFromClipboard();
return TRUE;
}
int item = GetNextItem(-1, LVIS_SELECTED | LVIS_FOCUSED);
if (item != -1)
{
if (((CServer*)GetItemData(item)) != NULL)
{
switch (wParam){
case MP_CONNECTTO:
{
if (GetSelectedCount() > 1)
{
CServer* aServer;
theApp.serverconnect->Disconnect();
POSITION pos=GetFirstSelectedItemPosition();
while (pos != NULL)
{
item = GetNextSelectedItem(pos);
if (item > -1) {
aServer=(CServer*)GetItemData(item);
theApp.serverlist->MoveServerDown(aServer);
}
}
theApp.serverconnect->ConnectToAnyServer(theApp.serverlist->GetServerCount() - this->GetSelectedCount(), false, false);
}
else{
theApp.serverconnect->ConnectToServer((CServer*)GetItemData(item));
}
theApp.emuledlg->ShowConnectionState();
return TRUE;
}
case MPG_DELETE:
case MP_REMOVE:
{
ShowWindow(SW_HIDE);
POSITION pos;
while (GetFirstSelectedItemPosition() != NULL)
{
pos = GetFirstSelectedItemPosition();
item = GetNextSelectedItem(pos);
server_list->RemoveServer((CServer*)GetItemData(item));
DeleteItem(item);
}
ShowServerCount();
ShowWindow(SW_SHOW);
SetFocus();
return TRUE;
}
case MP_ADDTOSTATIC:
{
POSITION pos = GetFirstSelectedItemPosition();
while (pos != NULL){
CServer* change = (CServer*)GetItemData(GetNextSelectedItem(pos));
if (!StaticServerFileAppend(change))
return FALSE;
change->SetIsStaticMember(true);
theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(change);
}
return TRUE;
}
case MP_REMOVEFROMSTATIC:
{
POSITION pos = GetFirstSelectedItemPosition();
while (pos != NULL){
CServer* change = (CServer*)GetItemData(GetNextSelectedItem(pos));
if (!StaticServerFileRemove(change))
return FALSE;
change->SetIsStaticMember(false);
theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(change);
}
return TRUE;
}
case MP_PRIOLOW:
{
POSITION pos = GetFirstSelectedItemPosition();
while (pos != NULL){
CServer* change = (CServer*)GetItemData(GetNextSelectedItem(pos));
change->SetPreference(SRV_PR_LOW);
theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(change);
}
return TRUE;
}
case MP_PRIONORMAL:
{
POSITION pos = GetFirstSelectedItemPosition();
while (pos != NULL){
CServer* change = (CServer*)GetItemData(GetNextSelectedItem(pos));
change->SetPreference(SRV_PR_NORMAL);
theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(change);
}
return TRUE;
}
case MP_PRIOHIGH:
{
POSITION pos = GetFirstSelectedItemPosition();
while (pos != NULL){
CServer* change = (CServer*)GetItemData(GetNextSelectedItem(pos));
change->SetPreference(SRV_PR_HIGH);
theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(change);
}
return TRUE;
}
case MP_COPYSELECTED:
case MP_GETED2KLINK:
{
POSITION pos = GetFirstSelectedItemPosition();
CString buffer, link;
while (pos != NULL){
const CServer* change = (CServer*)GetItemData(GetNextSelectedItem(pos));
buffer.Format(_T("ed2k://|server|%s|%d|/"), change->GetFullIP(), change->GetPort());
if (link.GetLength() > 0)
buffer = _T("\r\n") + buffer;
link += buffer;
}
theApp.CopyTextToClipboard(link);
return TRUE;
}
case Irc_SetSendLink:
{
POSITION pos = GetFirstSelectedItemPosition();
CString buffer, link;
while (pos != NULL){
const CServer* change = (CServer*)GetItemData(GetNextSelectedItem(pos));
buffer.Format(_T("ed2k://|server|%s|%d|/"), change->GetFullIP(), change->GetPort());
if (link.GetLength() > 0)
buffer = _T("\r\n") + buffer;
link += buffer;
}
theApp.emuledlg->ircwnd->SetSendFileString(link);
return TRUE;
}
}
}
}
return FALSE;
}
void CServerListCtrl::OnNMLdblclk(NMHDR *pNMHDR, LRESULT *pResult)
{
int iSel = GetNextItem(-1, LVIS_SELECTED | LVIS_FOCUSED);
if (iSel != -1){
theApp.serverconnect->ConnectToServer((CServer*)GetItemData(iSel));
theApp.emuledlg->ShowConnectionState();
}
}
bool CServerListCtrl::AddServermetToList(const CString& strFile)
{
SetRedraw(false);
bool flag=server_list->AddServermetToList(strFile);
RemoveAllDeadServers();
ShowServerCount();
SetRedraw(true);
return flag;
}
void CServerListCtrl::OnColumnClick(NMHDR *pNMHDR, LRESULT *pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// Barry - Store sort order in preferences
// Determine ascending based on whether already sorted on this column
int iSortItem = thePrefs.GetColumnSortItem(CPreferences::tableServer);
bool bOldSortAscending = thePrefs.GetColumnSortAscending(CPreferences::tableServer);
bool bSortAscending = (iSortItem != pNMListView->iSubItem) ? true : !bOldSortAscending;
// Item is column clicked
iSortItem = pNMListView->iSubItem;
// Save new preferences
thePrefs.SetColumnSortItem(CPreferences::tableServer, iSortItem);
thePrefs.SetColumnSortAscending(CPreferences::tableServer, bSortAscending);
// Sort table
SetSortArrow(iSortItem, bSortAscending);
SortItems(SortProc, MAKELONG(iSortItem, (bSortAscending ? 0 : 0x0001)));
Invalidate();
*pResult = 0;
}
int CServerListCtrl::SortProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
const CServer* item1 = (CServer*)lParam1;
const CServer* item2 = (CServer*)lParam2;
if (item1 == NULL || item2 == NULL)
return 0;
#define UNDEFINED_STR_AT_BOTTOM(s1, s2) \
if ((s1).IsEmpty() && (s2).IsEmpty()) \
return 0; \
if ((s1).IsEmpty()) \
return 1; \
if ((s2).IsEmpty()) \
return -1; \
#define UNDEFINED_INT_AT_BOTTOM(i1, i2) \
if ((i1) == (i2)) \
return 0; \
if ((i1) == 0) \
return 1; \
if ((i2) == 0) \
return -1; \
int iResult;
switch (LOWORD(lParamSort)){
case 0:
UNDEFINED_STR_AT_BOTTOM(item1->GetListName(), item2->GetListName());
iResult = item1->GetListName().CompareNoCase(item2->GetListName());
break;
case 1:
if (item1->HasDynIP() && item2->HasDynIP())
iResult = item1->GetDynIP().CompareNoCase(item2->GetDynIP());
else if (item1->HasDynIP())
iResult = -1;
else if (item2->HasDynIP())
iResult = 1;
else{
uint32 uIP1 = htonl(item1->GetIP());
uint32 uIP2 = htonl(item2->GetIP());
if (uIP1 < uIP2)
iResult = -1;
else if (uIP1 > uIP2)
iResult = 1;
else
iResult = CompareUnsigned(item1->GetPort(), item2->GetPort());
}
break;
case 2:
UNDEFINED_STR_AT_BOTTOM(item1->GetDescription(), item2->GetDescription());
iResult = item1->GetDescription().CompareNoCase(item2->GetDescription());
break;
case 3:
UNDEFINED_INT_AT_BOTTOM(item1->GetPing(), item2->GetPing());
iResult = CompareUnsigned(item1->GetPing(), item2->GetPing());
break;
case 4:
UNDEFINED_INT_AT_BOTTOM(item1->GetUsers(), item2->GetUsers());
iResult = CompareUnsigned(item1->GetUsers(), item2->GetUsers());
break;
case 5:
UNDEFINED_INT_AT_BOTTOM(item1->GetMaxUsers(), item2->GetMaxUsers());
iResult = CompareUnsigned(item1->GetMaxUsers(), item2->GetMaxUsers());
break;
case 6:
UNDEFINED_INT_AT_BOTTOM(item1->GetFiles(), item2->GetFiles());
iResult = CompareUnsigned(item1->GetFiles(), item2->GetFiles());
break;
case 7:
if (item2->GetPreferences() == item1->GetPreferences())
iResult = 0;
else if (item2->GetPreferences() == SRV_PR_LOW)
iResult = 1;
else if (item1->GetPreferences() == SRV_PR_LOW)
iResult = -1;
else if (item2->GetPreferences() == SRV_PR_HIGH)
iResult = -1;
else if (item1->GetPreferences() == SRV_PR_HIGH)
iResult = 1;
else
iResult = 0;
break;
case 8:
iResult = CompareUnsigned(item1->GetFailedCount(), item2->GetFailedCount());
break;
case 9:
iResult = (int)item1->IsStaticMember() - (int)item2->IsStaticMember();
break;
case 10:
UNDEFINED_INT_AT_BOTTOM(item1->GetSoftFiles(), item2->GetSoftFiles());
iResult = CompareUnsigned(item1->GetSoftFiles(), item2->GetSoftFiles());
break;
case 11:
UNDEFINED_INT_AT_BOTTOM(item1->GetHardFiles(), item2->GetHardFiles());
iResult = CompareUnsigned(item1->GetHardFiles(), item2->GetHardFiles());
break;
case 12:
UNDEFINED_STR_AT_BOTTOM(item1->GetVersion(), item2->GetVersion());
iResult = item1->GetVersion().CompareNoCase(item2->GetVersion());
break;
case 13:
UNDEFINED_INT_AT_BOTTOM(item1->GetLowIDUsers(), item2->GetLowIDUsers());
iResult = CompareUnsigned(item1->GetLowIDUsers(), item2->GetLowIDUsers());
break;
default:
iResult = 0;
}
if (HIWORD(lParamSort))
iResult = -iResult;
return iResult;
}
bool CServerListCtrl::StaticServerFileAppend(CServer *server)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -