📄 downloadlistctrl.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 "DownloadListCtrl.h"
#include "otherfunctions.h"
#include "updownclient.h"
#include "MenuCmds.h"
#include "ClientDetailDialog.h"
#include "FileDetailDialog.h"
#include "commentdialoglst.h"
#include "MetaDataDlg.h"
#include "InputBox.h"
#include "KademliaWnd.h"
#include "emuledlg.h"
#include "DownloadQueue.h"
#include "FriendList.h"
#include "PartFile.h"
#include "ClientCredits.h"
#include "MemDC.h"
#include "ChatWnd.h"
#include "TransferWnd.h"
#include "Kademlia/Kademlia/Kademlia.h"
#include "Kademlia/Kademlia/Prefs.h"
#include "Kademlia/net/KademliaUDPListener.h"
#include "WebServices.h"
#include "Preview.h"
#include "StringConversion.h"
#include "AddSourceDlg.h"
#include "IP2Country.h" //EastShare - added by AndCycle, IP to Country
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// CDownloadListCtrl
#define DLC_DT_TEXT (DT_LEFT|DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX|DT_END_ELLIPSIS)
#define DLC_BARUPDATE 512
#define FILE_ITEM_MARGIN_X 4
#define RATING_ICON_WIDTH 8
IMPLEMENT_DYNAMIC(CDownloadListCtrl, CListBox)
CDownloadListCtrl::CDownloadListCtrl() {
}
CDownloadListCtrl::~CDownloadListCtrl(){
if (m_PrioMenu) VERIFY( m_PrioMenu.DestroyMenu() );
if (m_A4AFMenu) VERIFY( m_A4AFMenu.DestroyMenu() );
if (m_FileMenu) VERIFY( m_FileMenu.DestroyMenu() );
while(m_ListItems.empty() == false){
delete m_ListItems.begin()->second; // second = CtrlItem_Struct*
m_ListItems.erase(m_ListItems.begin());
}
}
void CDownloadListCtrl::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();
SetStyle();
ModifyStyle(LVS_SINGLESEL,0);
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_DL_FILENAME),LVCFMT_LEFT, 260);
InsertColumn(1,GetResString(IDS_DL_SIZE),LVCFMT_LEFT, 60);
InsertColumn(2,GetResString(IDS_DL_TRANSF),LVCFMT_LEFT, 65);
InsertColumn(3,GetResString(IDS_DL_TRANSFCOMPL),LVCFMT_LEFT, 65);
InsertColumn(4,GetResString(IDS_DL_SPEED),LVCFMT_LEFT, 65);
InsertColumn(5,GetResString(IDS_DL_PROGRESS),LVCFMT_LEFT, 170);
InsertColumn(6,GetResString(IDS_DL_SOURCES),LVCFMT_LEFT, 50);
InsertColumn(7,GetResString(IDS_PRIORITY),LVCFMT_LEFT, 55);
InsertColumn(8,GetResString(IDS_STATUS),LVCFMT_LEFT, 70);
InsertColumn(9,GetResString(IDS_DL_REMAINS),LVCFMT_LEFT, 110);
CString lsctitle=GetResString(IDS_LASTSEENCOMPL);
lsctitle.Remove(':');
InsertColumn(10, lsctitle,LVCFMT_LEFT, 220);
lsctitle=GetResString(IDS_FD_LASTCHANGE);
lsctitle.Remove(':');
InsertColumn(11, lsctitle,LVCFMT_LEFT, 220);
InsertColumn(12, GetResString(IDS_CAT) ,LVCFMT_LEFT, 100);
SetAllIcons();
Localize();
LoadSettings(CPreferences::tableDownload);
curTab=0;
if (thePrefs.GetShowActiveDownloadsBold())
{
CFont* pFont = GetFont();
LOGFONT lfFont = {0};
pFont->GetLogFont(&lfFont);
lfFont.lfWeight = FW_BOLD;
m_fontBold.CreateFontIndirect(&lfFont);
}
// Barry - Use preferred sort order from preferences
m_bRemainSort=thePrefs.TransferlistRemainSortStyle();
int sortItem = thePrefs.GetColumnSortItem(CPreferences::tableDownload);
bool sortAscending = thePrefs.GetColumnSortAscending(CPreferences::tableDownload);
uint8 adder=0;
if (sortItem!=9 || !m_bRemainSort)
SetSortArrow(sortItem, sortAscending);
else {
SetSortArrow(sortItem, sortAscending?arrowDoubleUp : arrowDoubleDown);
adder=81;
}
SortItems(SortProc, sortItem + (sortAscending ? 0:100) + adder);
}
void CDownloadListCtrl::OnSysColorChange()
{
CMuleListCtrl::OnSysColorChange();
SetAllIcons();
}
void CDownloadListCtrl::SetAllIcons()
{
m_ImageList.DeleteImageList();
m_ImageList.Create(16,16,theApp.m_iDfltImageListColorFlags|ILC_MASK,0,1);
m_ImageList.SetBkColor(CLR_NONE);
m_ImageList.Add(CTempIconLoader(_T("SrcDownloading")));
m_ImageList.Add(CTempIconLoader(_T("SrcOnQueue")));
m_ImageList.Add(CTempIconLoader(_T("SrcConnecting")));
m_ImageList.Add(CTempIconLoader(_T("SrcNNPQF")));
m_ImageList.Add(CTempIconLoader(_T("SrcUnknown")));
m_ImageList.Add(CTempIconLoader(_T("ClientCompatible")));
m_ImageList.Add(CTempIconLoader(_T("Friend")));
m_ImageList.Add(CTempIconLoader(_T("ClientEDonkey")));
m_ImageList.Add(CTempIconLoader(_T("ClientMLDonkey")));
m_ImageList.Add(CTempIconLoader(_T("RatingReceived")));
m_ImageList.Add(CTempIconLoader(_T("BadRatingReceived")));
m_ImageList.Add(CTempIconLoader(_T("ClientEDonkeyHybrid")));
m_ImageList.Add(CTempIconLoader(_T("ClientShareaza")));
m_ImageList.Add(CTempIconLoader(_T("Server")));
m_ImageList.Add(CTempIconLoader(_T("ClientAMule")));
m_ImageList.Add(CTempIconLoader(_T("ClientLPhant")));
m_ImageList.SetOverlayImage(m_ImageList.Add(CTempIconLoader(_T("ClientSecureOvl"))), 1);
}
void CDownloadListCtrl::Localize()
{
CHeaderCtrl* pHeaderCtrl = GetHeaderCtrl();
HDITEM hdi;
hdi.mask = HDI_TEXT;
CString strRes;
strRes = GetResString(IDS_DL_FILENAME);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(0, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_DL_SIZE);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(1, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_DL_TRANSF);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(2, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_DL_TRANSFCOMPL);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(3, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_DL_SPEED);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(4, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_DL_PROGRESS);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(5, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_DL_SOURCES);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(6, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_PRIORITY);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(7, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_STATUS);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(8, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_DL_REMAINS);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(9, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_LASTSEENCOMPL);
strRes.Remove(':');
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(10, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_FD_LASTCHANGE);
strRes.Remove(':');
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(11, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_CAT);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(12, &hdi);
strRes.ReleaseBuffer();
CreateMenues();
ShowFilesCount();
}
void CDownloadListCtrl::AddFile(CPartFile* toadd)
{
// Create new Item
CtrlItem_Struct* newitem = new CtrlItem_Struct;
uint16 itemnr = GetItemCount();
newitem->owner = NULL;
newitem->type = FILE_TYPE;
newitem->value = toadd;
newitem->parent = NULL;
newitem->dwUpdated = 0;
// The same file shall be added only once
ASSERT(m_ListItems.find(toadd) == m_ListItems.end());
m_ListItems.insert(ListItemsPair(toadd, newitem));
if (toadd->CheckShowItemInGivenCat(curTab))
InsertItem(LVIF_PARAM|LVIF_TEXT,itemnr,LPSTR_TEXTCALLBACK,0,0,0,(LPARAM)newitem);
ShowFilesCount();
}
void CDownloadListCtrl::AddSource(CPartFile* owner, CUpDownClient* source, bool notavailable)
{
// Create new Item
CtrlItem_Struct* newitem = new CtrlItem_Struct;
newitem->owner = owner;
newitem->type = (notavailable) ? UNAVAILABLE_SOURCE : AVAILABLE_SOURCE;
newitem->value = source;
newitem->dwUpdated = 0;
// Update cross link to the owner
ListItems::const_iterator ownerIt = m_ListItems.find(owner);
ASSERT(ownerIt != m_ListItems.end());
CtrlItem_Struct* ownerItem = ownerIt->second;
ASSERT(ownerItem->value == owner);
newitem->parent = ownerItem;
// The same source could be added a few time but only one time per file
{
// Update the other instances of this source
bool bFound = false;
std::pair<ListItems::const_iterator, ListItems::const_iterator> rangeIt = m_ListItems.equal_range(source);
for(ListItems::const_iterator it = rangeIt.first; it != rangeIt.second; it++){
CtrlItem_Struct* cur_item = it->second;
// Check if this source has been already added to this file => to be sure
if(cur_item->owner == owner){
// Update this instance with its new setting
cur_item->type = newitem->type;
cur_item->dwUpdated = 0;
bFound = true;
}
else if(notavailable == false){
// The state 'Available' is exclusive
cur_item->type = UNAVAILABLE_SOURCE;
cur_item->dwUpdated = 0;
}
}
if(bFound == true){
delete newitem;
return;
}
}
m_ListItems.insert(ListItemsPair(source, newitem));
if (owner->srcarevisible) {
// find parent from the CListCtrl to add source
LVFINDINFO find;
find.flags = LVFI_PARAM;
find.lParam = (LPARAM)ownerItem;
sint16 result = FindItem(&find);
if(result != (-1))
InsertItem(LVIF_PARAM|LVIF_TEXT,result+1,LPSTR_TEXTCALLBACK,0,0,0,(LPARAM)newitem);
}
}
void CDownloadListCtrl::RemoveSource(CUpDownClient* source, CPartFile* owner)
{
if (!theApp.emuledlg->IsRunning())
return;
// Retrieve all entries matching the source
std::pair<ListItems::iterator, ListItems::iterator> rangeIt = m_ListItems.equal_range(source);
for(ListItems::iterator it = rangeIt.first; it != rangeIt.second; ){
CtrlItem_Struct* delItem = it->second;
if(owner == NULL || owner == delItem->owner){
// Remove it from the m_ListItems
it = m_ListItems.erase(it);
// Remove it from the CListCtrl
LVFINDINFO find;
find.flags = LVFI_PARAM;
find.lParam = (LPARAM)delItem;
sint16 result = FindItem(&find);
if(result != (-1)){
DeleteItem(result);
}
// finally it could be delete
delete delItem;
}
else{
it++;
}
}
}
bool CDownloadListCtrl::RemoveFile(const CPartFile* toremove)
{
bool bResult = false;
if (!theApp.emuledlg->IsRunning())
return bResult;
// Retrieve all entries matching the File or linked to the file
// Remark: The 'asked another files' clients must be removed from here
ASSERT(toremove != NULL);
for(ListItems::iterator it = m_ListItems.begin(); it != m_ListItems.end(); ){
CtrlItem_Struct* delItem = it->second;
if(delItem->owner == toremove || delItem->value == (void*)toremove){
// Remove it from the m_ListItems
it = m_ListItems.erase(it);
// Remove it from the CListCtrl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -