📄 uploadlistctrl.cpp
字号:
//this file is part of eMule
//Copyright (C)2002 Merkur ( devs@emule-project.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.
#include "stdafx.h"
#include "emule.h"
#include "UploadListCtrl.h"
#include "TransferWnd.h"
#include "otherfunctions.h"
#include "MenuCmds.h"
#include "ClientDetailDialog.h"
#include "KademliaWnd.h"
#include "emuledlg.h"
#include "friendlist.h"
#include "MemDC.h"
#include "KnownFile.h"
#include "SharedFileList.h"
#include "UpDownClient.h"
#include "ClientCredits.h"
#include "ChatWnd.h"
#include "kademlia/kademlia/Kademlia.h"
#include "kademlia/net/KademliaUDPListener.h"
#include "UploadQueue.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "IP2Country.h"//EastShare - added by AndCycle, IP to Country
// CUploadListCtrl
IMPLEMENT_DYNAMIC(CUploadListCtrl, CMuleListCtrl)
CUploadListCtrl::CUploadListCtrl()
: CListCtrlItemWalk(this)
{
}
void CUploadListCtrl::Init()
{
CImageList ilDummyImageList; //dummy list for getting the proper height of listview entries
ilDummyImageList.Create(1, theApp.GetSmallSytemIconSize().cy,theApp.m_iDfltImageListColorFlags|ILC_MASK, 1, 1);
SetImageList(&ilDummyImageList, LVSIL_SMALL);
ASSERT( (GetStyle() & LVS_SHAREIMAGELISTS) == 0 );
ilDummyImageList.Detach();
SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
CToolTipCtrl* tooltip = GetToolTips();
if (tooltip){
tooltip->ModifyStyle(0, TTS_NOPREFIX);
tooltip->SetDelayTime(TTDT_AUTOPOP, 20000);
tooltip->SetDelayTime(TTDT_INITIAL, thePrefs.GetToolTipDelay()*1000);
}
InsertColumn(0,GetResString(IDS_QL_USERNAME),LVCFMT_LEFT,150,0);
InsertColumn(1,GetResString(IDS_FILE),LVCFMT_LEFT,275,1);
InsertColumn(2,GetResString(IDS_DL_SPEED),LVCFMT_LEFT,60,2);
InsertColumn(3,GetResString(IDS_DL_TRANSF),LVCFMT_LEFT,65,3);
InsertColumn(4,GetResString(IDS_WAITED),LVCFMT_LEFT,60,4);
InsertColumn(5,GetResString(IDS_UPLOADTIME),LVCFMT_LEFT,60,5);
InsertColumn(6,GetResString(IDS_STATUS),LVCFMT_LEFT,110,6);
InsertColumn(7,GetResString(IDS_UPSTATUS),LVCFMT_LEFT,100,7);
SetAllIcons();
Localize();
LoadSettings(CPreferences::tableUpload);
// Barry - Use preferred sort order from preferences
int sortItem = thePrefs.GetColumnSortItem(CPreferences::tableUpload);
bool sortAscending = thePrefs.GetColumnSortAscending(CPreferences::tableUpload);
SetSortArrow(sortItem, sortAscending);
SortItems(SortProc, sortItem + (sortAscending ? 0:100));
}
CUploadListCtrl::~CUploadListCtrl(){
}
void CUploadListCtrl::OnSysColorChange()
{
CMuleListCtrl::OnSysColorChange();
SetAllIcons();
}
void CUploadListCtrl::SetAllIcons()
{
imagelist.DeleteImageList();
imagelist.Create(16,16,theApp.m_iDfltImageListColorFlags|ILC_MASK,0,1);
imagelist.SetBkColor(CLR_NONE);
imagelist.Add(CTempIconLoader(_T("ClientEDonkey")));
imagelist.Add(CTempIconLoader(_T("ClientCompatible")));
imagelist.Add(CTempIconLoader(_T("ClientEDonkeyPlus")));
imagelist.Add(CTempIconLoader(_T("ClientCompatiblePlus")));
imagelist.Add(CTempIconLoader(_T("Friend")));
imagelist.Add(CTempIconLoader(_T("ClientMLDonkey")));
imagelist.Add(CTempIconLoader(_T("ClientMLDonkeyPlus")));
imagelist.Add(CTempIconLoader(_T("ClientEDonkeyHybrid")));
imagelist.Add(CTempIconLoader(_T("ClientEDonkeyHybridPlus")));
imagelist.Add(CTempIconLoader(_T("ClientShareaza")));
imagelist.Add(CTempIconLoader(_T("ClientShareazaPlus")));
imagelist.Add(CTempIconLoader(_T("ClientAMule")));
imagelist.Add(CTempIconLoader(_T("ClientAMulePlus")));
imagelist.Add(CTempIconLoader(_T("ClientLPhant")));
imagelist.Add(CTempIconLoader(_T("ClientLPhantPlus")));
imagelist.SetOverlayImage(imagelist.Add(CTempIconLoader(_T("ClientSecureOvl"))), 1);
}
void CUploadListCtrl::Localize()
{
CHeaderCtrl* pHeaderCtrl = GetHeaderCtrl();
HDITEM hdi;
hdi.mask = HDI_TEXT;
CString strRes;
strRes = GetResString(IDS_QL_USERNAME);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(0, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_FILE);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(1, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_DL_SPEED);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(2, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_DL_TRANSF);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(3, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_WAITED);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(4, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_UPLOADTIME);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(5, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_STATUS);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(6, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_UPSTATUS);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(7, &hdi);
strRes.ReleaseBuffer();
}
void CUploadListCtrl::AddClient(const CUpDownClient* client)
{
if (!theApp.emuledlg->IsRunning())
return;
int iItemCount = GetItemCount();
int iItem = InsertItem(LVIF_TEXT|LVIF_PARAM,iItemCount,LPSTR_TEXTCALLBACK,0,0,0,(LPARAM)client);
Update(iItem);
theApp.emuledlg->transferwnd->UpdateListCount(1, iItemCount+1);
}
void CUploadListCtrl::RemoveClient(const CUpDownClient* client)
{
if (!theApp.emuledlg->IsRunning())
return;
LVFINDINFO find;
find.flags = LVFI_PARAM;
find.lParam = (LPARAM)client;
sint32 result = FindItem(&find);
if (result != -1){
DeleteItem(result);
theApp.emuledlg->transferwnd->UpdateListCount(1);
}
}
void CUploadListCtrl::RefreshClient(const CUpDownClient* client)
{
// There is some type of timing issue here.. If you click on item in the queue or upload and leave
// the focus on it when you exit the cient, it breaks on line 854 of emuleDlg.cpp
// I added this IsRunning() check to this function and the DrawItem method and
// this seems to keep it from crashing. This is not the fix but a patch until
// someone points out what is going wrong.. Also, it will still assert in debug mode..
if (!theApp.emuledlg->IsRunning())
return;
LVFINDINFO find;
find.flags = LVFI_PARAM;
find.lParam = (LPARAM)client;
sint16 result = FindItem(&find);
if (result != -1)
Update(result);
}
#define DLC_DT_TEXT (DT_LEFT|DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX|DT_END_ELLIPSIS)
void CUploadListCtrl::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 CUpDownClient* client = (CUpDownClient*)lpDrawItemStruct->itemData;
CMemDC dc(CDC::FromHandle(lpDrawItemStruct->hDC), &lpDrawItemStruct->rcItem);
CFont* pOldFont = dc.SelectObject(GetFont());
RECT cur_rec = lpDrawItemStruct->rcItem;
COLORREF crOldTextColor = dc.SetTextColor(m_crWindowText);
if(client->GetSlotNumber() > theApp.uploadqueue->GetActiveUploadsCount()) {
dc.SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
}
int iOldBkMode;
if (m_crWindowTextBk == CLR_NONE){
DefWindowProc(WM_ERASEBKGND, (WPARAM)(HDC)dc, 0);
iOldBkMode = dc.SetBkMode(TRANSPARENT);
}
else
iOldBkMode = OPAQUE;
CString Sbuffer;
CKnownFile* file = theApp.sharedfiles->GetFileByID(client->GetUploadFileID());
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);
switch (iColumn)
{
case 0:{
uint8 image;
if (client->IsFriend())
image = 4;
else if (client->GetClientSoft() == SO_EDONKEYHYBRID){
if (client->credits->GetScoreRatio(client->GetIP()) > 1)
image = 8;
else
image = 7;
}
else if (client->GetClientSoft() == SO_MLDONKEY){
if (client->credits->GetScoreRatio(client->GetIP()) > 1)
image = 6;
else
image = 5;
}
else if (client->GetClientSoft() == SO_SHAREAZA){
if(client->credits->GetScoreRatio(client->GetIP()) > 1)
image = 10;
else
image = 9;
}
else if (client->GetClientSoft() == SO_AMULE){
if(client->credits->GetScoreRatio(client->GetIP()) > 1)
image = 12;
else
image = 11;
}
else if (client->GetClientSoft() == SO_LPHANT){
if(client->credits->GetScoreRatio(client->GetIP()) > 1)
image = 14;
else
image = 13;
}
else if (client->ExtProtocolAvailable()){
if(client->credits->GetScoreRatio(client->GetIP()) > 1)
image = 3;
else
image = 1;
}
else{
if (client->credits->GetScoreRatio(client->GetIP()) > 1)
image = 2;
else
image = 0;
}
POINT point = {cur_rec.left, cur_rec.top+1};
imagelist.Draw(dc,image, point, ILD_NORMAL | ((client->Credits() && client->Credits()->GetCurrentIdentState(client->GetIP()) == IS_IDENTIFIED) ? INDEXTOOVERLAYMASK(1) : 0));
Sbuffer = client->GetUserName();
//EastShare Start - added by AndCycle, IP to Country
CString tempStr;
tempStr.Format(_T("%s%s"), client->GetCountryName(), Sbuffer);
Sbuffer = tempStr;
if(theApp.ip2country->ShowCountryFlag()){
cur_rec.left += 20;
POINT point2= {cur_rec.left,cur_rec.top+1};
theApp.ip2country->GetFlagImageList()->DrawIndirect(dc, client->GetCountryFlagIndex(), point2, CSize(18,16), CPoint(0,0), ILD_NORMAL);
}
//EastShare End - added by AndCycle, IP to Country
cur_rec.left +=20;
dc->DrawText(Sbuffer, Sbuffer.GetLength(), &cur_rec, DLC_DT_TEXT);
cur_rec.left -= 20;
//EastShare Start - added by AndCycle, IP to Country
if(theApp.ip2country->ShowCountryFlag()){
cur_rec.left-=20;
}
//EastShare End - added by AndCycle, IP to Country
break;
}
case 1:
if (file)
Sbuffer = file->GetFileName();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -