📄 serverlistctrl.cpp
字号:
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);
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_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)
{
try
{
// Remove any entry before writing to avoid duplicates
StaticServerFileRemove(server);
FILE* staticservers = _tfsopen(thePrefs.GetConfigDir() + _T("staticservers.dat"), _T("a"), _SH_DENYWR);
if (staticservers==NULL)
{
AddLogLine(false, GetResString(IDS_ERROR_SSF));
return false;
}
if (_ftprintf(staticservers,
_T("%s:%i,%i,%s\n"),
server->GetAddress(),
server->GetPort(),
server->GetPreferences(),
server->GetListName()) != EOF)
{
AddLogLine(false, _T("'%s:%i,%s' %s"), server->GetAddress(), server->GetPort(), server->GetListName(), GetResString(IDS_ADDED2SSF));
server->SetIsStaticMember(true);
theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(server);
}
fclose(staticservers);
}
catch (...)
{
ASSERT(0);
return false;
}
return true;
}
bool CServerListCtrl::StaticServerFileRemove(const CServer *server)
{
try
{
if (!server->IsStaticMember())
return true;
CString strLine;
CString strTest;
TCHAR buffer[1024];
int lenBuf = 1024;
int pos;
CString StaticFilePath = thePrefs.GetConfigDir() + _T("staticservers.dat");
CString StaticTempPath = thePrefs.GetConfigDir() + _T("statictemp.dat");
FILE* staticservers = _tfsopen(StaticFilePath , _T("r"), _SH_DENYWR);
FILE* statictemp = _tfsopen(StaticTempPath , _T("w"), _SH_DENYWR);
if ((staticservers == NULL) || (statictemp == NULL))
{
if (staticservers)
fclose(staticservers);
if (statictemp)
fclose(statictemp);
AddLogLine( false, GetResString(IDS_ERROR_SSF));
return false;
}
while (!feof(staticservers))
{
if (_fgetts(buffer, lenBuf, staticservers) == 0)
break;
strLine = buffer;
// ignore comments or invalid lines
if (strLine.GetAt(0) == _T('#') || strLine.GetAt(0) == _T('/'))
continue;
if (strLine.GetLength() < 5)
continue;
// Only interested in "host:port"
pos = strLine.Find(_T(','));
if (pos == -1)
continue;
strLine = strLine.Left(pos);
// Get host and port from given server
strTest.Format(_T("%s:%i"), server->GetAddress(), server->GetPort());
// Compare, if not the same server write original line to temp file
if (strLine.Compare(strTest) != 0)
_ftprintf(statictemp, buffer);
}
fclose(staticservers);
fclose(statictemp);
// All ok, remove the existing file and replace with the new one
CFile::Remove( StaticFilePath );
CFile::Rename( StaticTempPath, StaticFilePath );
}
catch (...)
{
ASSERT(0);
return false;
}
return true;
}
void CServerListCtrl::ShowServerCount() {
CString counter;
counter.Format(_T(" (%i)"), GetItemCount());
theApp.emuledlg->serverwnd->GetDlgItem(IDC_SERVLIST_TEXT)->SetWindowText(GetResString(IDS_SV_SERVERLIST)+counter );
}
void CServerListCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == 'C' && (GetKeyState(VK_CONTROL) & 0x8000))
{
// Ctrl+C: Copy listview items to clipboard
SendMessage(WM_COMMAND, MP_GETED2KLINK);
return;
}
else if (nChar == 'V' && (GetKeyState(VK_CONTROL) & 0x8000))
{
// Ctrl+C: Copy listview items to clipboard
SendMessage(WM_COMMAND, MP_PASTE);
return;
}
CMuleListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -