📄 serverlistctrl.cpp
字号:
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)
{
#ifndef _DEBUG
try
#endif
{
// 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)
{
LogError(LOG_STATUSBAR, 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);
}
#ifndef _DEBUG
catch (...)
{
ASSERT(0);
return false;
}
#endif
return true;
}
bool CServerListCtrl::StaticServerFileRemove(const CServer *server)
{
#ifndef _DEBUG
try
#endif
{
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);
LogError(LOG_STATUSBAR, 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 );
}
#ifndef _DEBUG
catch (...)
{
ASSERT(0);
return false;
}
#endif
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::OnLvnGetInfoTip(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMLVGETINFOTIP>(pNMHDR);
if (pGetInfoTip->iSubItem == 0)
{
LVHITTESTINFO hti = {0};
::GetCursorPos(&hti.pt);
ScreenToClient(&hti.pt);
bool bOverMainItem = (SubItemHitTest(&hti) != -1 && hti.iItem == pGetInfoTip->iItem && hti.iSubItem == 0);
// those tooltips are very nice for debugging/testing but pretty annoying for general usage
// enable tooltips only if Shift+Ctrl is currently pressed
bool bShowInfoTip = GetSelectedCount() > 1 || ((GetKeyState(VK_SHIFT) & 0x8000) && (GetKeyState(VK_CONTROL) & 0x8000));
if (!bShowInfoTip){
if (!bOverMainItem){
// don' show the default label tip for the main item, if the mouse is not over the main item
if ((pGetInfoTip->dwFlags & LVGIT_UNFOLDED) == 0 && pGetInfoTip->cchTextMax > 0 && pGetInfoTip->pszText[0] != '\0')
pGetInfoTip->pszText[0] = '\0';
}
return;
}
if (GetSelectedCount() == 1)
{
;
}
else
{
int iSelected = 0;
ULONGLONG ulTotalUsers = 0;
ULONGLONG ulTotalLowIdUsers = 0;
ULONGLONG ulTotalFiles = 0;
POSITION pos = GetFirstSelectedItemPosition();
while (pos)
{
const CServer* pServer = (CServer*)GetItemData(GetNextSelectedItem(pos));
if (pServer)
{
iSelected++;
ulTotalUsers += pServer->GetUsers();
ulTotalFiles += pServer->GetFiles();
ulTotalLowIdUsers += pServer->GetLowIDUsers();
}
}
if (iSelected > 0)
{
CString strInfo;
strInfo.Format(_T("%s: %u\r\n%s: %s\r\n%s: %s\r\n%s: %s"),
GetResString(IDS_FSTAT_SERVERS), iSelected,
GetResString(IDS_UUSERS), CastItoIShort(ulTotalUsers),
GetResString(IDS_IDLOW), CastItoIShort(ulTotalLowIdUsers),
GetResString(IDS_PW_FILES), CastItoIShort(ulTotalFiles));
_tcsncpy(pGetInfoTip->pszText, strInfo, pGetInfoTip->cchTextMax);
pGetInfoTip->pszText[pGetInfoTip->cchTextMax-1] = _T('\0');
}
}
}
*pResult = 0;
}
void CServerListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if( !theApp.emuledlg->IsRunning() )
return;
if (!lpDrawItemStruct->itemData)
return;
CDC* odc = CDC::FromHandle(lpDrawItemStruct->hDC);
BOOL bCtrlFocused = ((GetFocus() == this ) || (GetStyle() & LVS_SHOWSELALWAYS));
if( (lpDrawItemStruct->itemAction | ODA_SELECT) && (lpDrawItemStruct->itemState & ODS_SELECTED )){
if(bCtrlFocused)
odc->SetBkColor(m_crHighlight);
else
odc->SetBkColor(m_crNoHighlight);
}
else
odc->SetBkColor(GetBkColor());
const CServer* server = (CServer*)lpDrawItemStruct->itemData;
CRect rcItem(lpDrawItemStruct->rcItem);
CMemDC dc(CDC::FromHandle(lpDrawItemStruct->hDC), &rcItem);
CFont* pOldFont = dc.SelectObject(GetFont());
RECT cur_rec = rcItem;
COLORREF crOldTextColor = dc.SetTextColor(m_crWindowText);
int iOldBkMode;
if (m_crWindowTextBk == CLR_NONE){
DefWindowProc(WM_ERASEBKGND, (WPARAM)(HDC)dc, 0);
iOldBkMode = dc.SetBkMode(TRANSPARENT);
}
else
iOldBkMode = OPAQUE;
CString Sbuffer;
CHeaderCtrl *pHeaderCtrl = GetHeaderCtrl();
int iCount = pHeaderCtrl->GetItemCount();
cur_rec.right = cur_rec.left - 8;
cur_rec.left += 4;
for(int iCurrent = 0; iCurrent < iCount; iCurrent++){
int iColumn = pHeaderCtrl->OrderToIndex(iCurrent);
if( !IsColumnHidden(iColumn) ){
cur_rec.right += GetColumnWidth(iColumn);
RECT cur_backup = cur_rec;
Sbuffer = GetItemText(lpDrawItemStruct->itemID, iColumn);
switch(iColumn) {
case 0:
{
POINT point = {cur_rec.left, cur_rec.top};//check
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) {
imagelist.Draw(dc,0, point, ILD_NORMAL | INDEXTOOVERLAYMASK(1));
} else {
imagelist.Draw(dc,0, point, ILD_NORMAL);
}
cur_rec.left += 20;
}
//EastShare Start - added by AndCycle, IP to Country
Sbuffer = server->GetCountryName() + Sbuffer;
if(theApp.ip2country->ShowCountryFlag()){
POINT point = {cur_rec.left, cur_rec.top};//check
theApp.ip2country->GetFlagImageList()->DrawIndirect(dc, server->GetCountryFlagIndex(), point, CSize(18,16), CPoint(0,0), ILD_NORMAL);
cur_rec.left +=20;
}
//EastShare End - added by AndCycle, IP to Country
break;
}
//get the text justification
LV_COLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH;
GetColumn(iColumn, &lvc);
UINT nJustify = DT_LEFT;
switch(lvc.fmt & LVCFMT_JUSTIFYMASK)
{
case LVCFMT_RIGHT:
nJustify = DT_RIGHT;
break;
case LVCFMT_CENTER:
nJustify = DT_CENTER;
break;
default:
break;
}
#define MLC_DT_TEXT (DT_SINGLELINE | DT_NOPREFIX | DT_VCENTER | DT_END_ELLIPSIS)
dc->DrawText(Sbuffer,Sbuffer.GetLength(),&cur_rec,MLC_DT_TEXT | nJustify);
cur_rec = cur_backup;
cur_rec.left += GetColumnWidth(iColumn);
}
}
//draw rectangle around selected item(s)
if ((lpDrawItemStruct->itemAction | ODA_SELECT) && (lpDrawItemStruct->itemState & ODS_SELECTED))
{
RECT outline_rec = lpDrawItemStruct->rcItem;
outline_rec.top--;
outline_rec.bottom++;
dc->FrameRect(&outline_rec, &CBrush(GetBkColor()));
outline_rec.top++;
outline_rec.bottom--;
outline_rec.left++;
outline_rec.right--;
if(bCtrlFocused)
dc->FrameRect(&outline_rec, &CBrush(m_crFocusLine));
else
dc->FrameRect(&outline_rec, &CBrush(m_crNoFocusLine));
}
if (m_crWindowTextBk == CLR_NONE)
dc.SetBkMode(iOldBkMode);
dc.SelectObject(pOldFont);
dc.SetTextColor(crOldTextColor);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -