📄 transferwnd.cpp
字号:
//this file is part of eMule
//Copyright (C)2002 Merkur ( merkur-@users.sourceforge.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.
// TransferWnd.cpp : implementation file
//
#include "stdafx.h"
#include "emule.h"
#include "TransferWnd.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// CTransferWnd dialog
IMPLEMENT_DYNAMIC(CTransferWnd, CDialog)
CTransferWnd::CTransferWnd(CWnd* pParent /*=NULL*/)
: CResizableDialog(CTransferWnd::IDD, pParent)
{
}
CTransferWnd::~CTransferWnd()
{
}
BEGIN_MESSAGE_MAP(CTransferWnd, CResizableDialog)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT,0,0xFFFF,OnToolTipNotify)
ON_NOTIFY(LVN_HOTTRACK, IDC_UPLOADLIST, OnHoverUploadList)
ON_NOTIFY(LVN_HOTTRACK, IDC_QUEUELIST, OnHoverUploadList)
ON_NOTIFY(LVN_HOTTRACK, IDC_DOWNLOADLIST, OnHoverDownloadList)
ON_NOTIFY(LVN_HOTTRACK, IDC_CLIENTLIST , OnHoverUploadList)
ON_NOTIFY(TCN_SELCHANGE, IDC_DLTAB, OnTcnSelchangeDltab)
ON_NOTIFY(NM_RCLICK, IDC_DLTAB, OnNMRclickDltab)
ON_NOTIFY(LVN_BEGINDRAG, IDC_DOWNLOADLIST, OnLvnBegindrag)
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
BOOL CTransferWnd::OnInitDialog(){
CResizableDialog::OnInitDialog();
windowtransferstate = 1;
uploadlistctrl.Init();
downloadlistctrl.Init();
queuelistctrl.Init();
clientlistctrl.Init();
queuelistctrl.Hide();
clientlistctrl.Hide();
uploadlistctrl.Visable();
Localize(); // i_a
((CStatic*)GetDlgItem(IDC_DOWNLOAD_ICO))->SetIcon((HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_DIRECTDOWNLOAD), IMAGE_ICON, 16, 16, 0));
m_uplBtn.SetIcon(IDI_UPLOAD); m_uplBtn.SetAlign(CButtonST::ST_ALIGN_HORIZ);
m_uplBtn.SetFlat();
m_uplBtn.SetLeftAlign(true);
AddAnchor(IDC_DOWNLOADLIST,TOP_LEFT,CSize(100, theApp.glob_prefs->GetSplitterbarPosition() ));
AddAnchor(IDC_UPLOADLIST,CSize(0,theApp.glob_prefs->GetSplitterbarPosition()),BOTTOM_RIGHT);
AddAnchor(IDC_QUEUELIST,CSize(0,theApp.glob_prefs->GetSplitterbarPosition()),BOTTOM_RIGHT);
AddAnchor(IDC_CLIENTLIST,CSize(0,theApp.glob_prefs->GetSplitterbarPosition()),BOTTOM_RIGHT);
AddAnchor(IDC_UPLOAD_ICO,CSize(0,theApp.glob_prefs->GetSplitterbarPosition()),BOTTOM_RIGHT);
AddAnchor(IDC_QUEUECOUNT,BOTTOM_LEFT);
AddAnchor(IDC_TSTATIC1,BOTTOM_LEFT);
AddAnchor(IDC_QUEUE_REFRESH_BUTTON, BOTTOM_RIGHT);
AddAnchor(IDC_DLTAB,TOP_RIGHT);
// splitting functionality
CRect rc,rcSpl,rcDown;
GetWindowRect(rc);
ScreenToClient(rc);
rcSpl=rc; rcSpl.top=rc.bottom-100 ; rcSpl.bottom=rcSpl.top+5;rcSpl.left=55;
m_wndSplitter.Create(WS_CHILD | WS_VISIBLE, rcSpl, this, IDC_SPLITTER);
SetInitLayout();
//cats
rightclickindex=-1;
// create tooltip
m_ttip.Create(this);
m_ttip.SetDelayTime(TTDT_AUTOPOP, 20000);
m_ttip.SetDelayTime(TTDT_INITIAL, theApp.glob_prefs->GetToolTipDelay()*1000);
m_ttip.SendMessage(TTM_SETMAXTIPWIDTH, 0, SHRT_MAX); // recognize \n chars!
m_ttip.AddTool(&downloadlistctrl);
m_ttip.AddTool(&uploadlistctrl);
m_iOldToolTipItemDown = -1;
m_iOldToolTipItemUp = -1;
m_iOldToolTipItemQueue = -1;
downloadlistactive=true;
m_bIsDragging=false;
// show & cat-tabs
sprintf(theApp.glob_prefs->GetCategory(0)->title,(theApp.glob_prefs->ShowAllNotCats())? GetResString(IDS_ALLOTHERS):GetResString(IDS_ALL));
sprintf(theApp.glob_prefs->GetCategory(0)->incomingpath,theApp.glob_prefs->GetIncomingDir());
for (int ix=0;ix<theApp.glob_prefs->GetCatCount();ix++)
m_dlTab.InsertItem(ix,theApp.glob_prefs->GetCategory(ix)->title);
return true;
}
void CTransferWnd::ShowQueueCount(uint32 number){
char buffer[100];
sprintf(buffer,"%u (%u "+ GetResString(IDS_BANNED).MakeLower() +")",number,theApp.uploadqueue->GetBanCount());
this->GetDlgItem(IDC_QUEUECOUNT)->SetWindowText(buffer);
}
void CTransferWnd::DoDataExchange(CDataExchange* pDX)
{
CResizableDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_UPLOADLIST, uploadlistctrl);
DDX_Control(pDX, IDC_DOWNLOADLIST, downloadlistctrl);
DDX_Control(pDX, IDC_QUEUELIST, queuelistctrl);
DDX_Control(pDX, IDC_CLIENTLIST, clientlistctrl);
DDX_Control(pDX, IDC_UPLOAD_ICO, m_uplBtn);
DDX_Control(pDX, IDC_DLTAB, m_dlTab);
}
void CTransferWnd::SetInitLayout() {
CRect rcDown,rcSpl,rcW;
CWnd* pWnd;
GetWindowRect(rcW);
ScreenToClient(rcW);
LONG splitpos=(theApp.glob_prefs->GetSplitterbarPosition()*rcW.Height())/100;
pWnd = GetDlgItem(IDC_DOWNLOADLIST);
pWnd->GetWindowRect(rcDown);
ScreenToClient(rcDown);
rcDown.right=rcW.right-7;
rcDown.bottom=splitpos-5;
downloadlistctrl.MoveWindow(rcDown);
pWnd = GetDlgItem(IDC_UPLOADLIST);
pWnd->GetWindowRect(rcDown);
ScreenToClient(rcDown);
rcDown.right=rcW.right-7;
rcDown.bottom=rcW.bottom-20;
rcDown.top=splitpos+20;
uploadlistctrl.MoveWindow(rcDown);
pWnd = GetDlgItem(IDC_QUEUELIST);
pWnd->GetWindowRect(rcDown);
ScreenToClient(rcDown);
rcDown.right=rcW.right-7;
rcDown.bottom=rcW.bottom-20;
rcDown.top=splitpos+20;
queuelistctrl.MoveWindow(rcDown);
pWnd = GetDlgItem(IDC_CLIENTLIST);
pWnd->GetWindowRect(rcDown);
ScreenToClient(rcDown);
rcDown.right=rcW.right-7;
rcDown.bottom=rcW.bottom-20;
rcDown.top=splitpos+20;
clientlistctrl.MoveWindow(rcDown);
rcSpl=rcDown;
rcSpl.top=rcDown.bottom+4;rcSpl.bottom=rcSpl.top+7;rcSpl.left=(rcDown.right/2)-50;rcSpl.right=rcSpl.left+100;
m_wndSplitter.MoveWindow(rcSpl,true);
DoResize(0);
}
void CTransferWnd::DoResize(int delta)
{
CSplitterControl::ChangeHeight(&downloadlistctrl, delta);
CSplitterControl::ChangeHeight(&uploadlistctrl, -delta, CW_BOTTOMALIGN);
CSplitterControl::ChangeHeight(&queuelistctrl, -delta, CW_BOTTOMALIGN);
CSplitterControl::ChangeHeight(&clientlistctrl, -delta, CW_BOTTOMALIGN);
UpdateSplitterRange();
Invalidate();
UpdateWindow();
}
// setting splitter range limits
void CTransferWnd::UpdateSplitterRange()
{
CRect rcDown,rcUp,rcW,rcSpl;
CWnd* pWnd;
GetWindowRect(rcW);
ScreenToClient(rcW);
pWnd = GetDlgItem(IDC_DOWNLOADLIST);
pWnd->GetWindowRect(rcDown);
ScreenToClient(rcDown);
pWnd = GetDlgItem(IDC_UPLOADLIST);
pWnd->GetWindowRect(rcUp);
ScreenToClient(rcUp);
pWnd = GetDlgItem(IDC_QUEUELIST);
pWnd->GetWindowRect(rcUp);
ScreenToClient(rcUp);
pWnd = GetDlgItem(IDC_CLIENTLIST);
pWnd->GetWindowRect(rcUp);
ScreenToClient(rcUp);
theApp.glob_prefs->SetSplitterbarPosition((rcDown.bottom*100)/rcW.Height());
RemoveAnchor(IDC_DOWNLOADLIST);
RemoveAnchor(IDC_UPLOADLIST);
RemoveAnchor(IDC_QUEUELIST);
RemoveAnchor(IDC_CLIENTLIST);
AddAnchor(IDC_DOWNLOADLIST,TOP_LEFT,CSize(100,theApp.glob_prefs->GetSplitterbarPosition() ));
AddAnchor(IDC_UPLOADLIST,CSize(0,theApp.glob_prefs->GetSplitterbarPosition()),BOTTOM_RIGHT);
AddAnchor(IDC_QUEUELIST,CSize(0,theApp.glob_prefs->GetSplitterbarPosition()),BOTTOM_RIGHT);
AddAnchor(IDC_CLIENTLIST,CSize(0,theApp.glob_prefs->GetSplitterbarPosition()),BOTTOM_RIGHT);
m_wndSplitter.SetRange(rcDown.top+50 , rcUp.bottom-40);
}
LRESULT CTransferWnd::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
// arrange transferwindow layout
case WM_PAINT:
if (m_wndSplitter) {
CRect rcDown,rcSpl,rcW;
CWnd* pWnd;
GetWindowRect(rcW);
ScreenToClient(rcW);
pWnd = GetDlgItem(IDC_DOWNLOADLIST);
pWnd->GetWindowRect(rcDown);
ScreenToClient(rcDown);
if (rcW.Height()>0) {
// splitter paint update
rcSpl=rcDown;
rcSpl.top=rcDown.bottom+8;rcSpl.bottom=rcSpl.top+5;rcSpl.left=150;
GetDlgItem(IDC_UPLOAD_ICO)->MoveWindow(10,rcSpl.top-4,130,18);
m_wndSplitter.MoveWindow(rcSpl,true);
UpdateSplitterRange();
}
}
break;
case WM_NOTIFY:
if (wParam == IDC_SPLITTER)
{
SPC_NMHDR* pHdr = (SPC_NMHDR*) lParam;
DoResize(pHdr->delta);
}
break;
case WM_WINDOWPOSCHANGED :
{
CRect rcW;
GetWindowRect(rcW);
ScreenToClient(rcW);
if (m_wndSplitter && rcW.Height()>0) Invalidate();
break;
}
case WM_SIZE:
if (m_wndSplitter) {
CRect rcDown,rcSpl,rcW;
CWnd* pWnd;
GetWindowRect(rcW);
ScreenToClient(rcW);
if (rcW.Height()>0){
pWnd = GetDlgItem(IDC_DOWNLOADLIST);
pWnd->GetWindowRect(rcDown);
ScreenToClient(rcDown);
long splitpos=(theApp.glob_prefs->GetSplitterbarPosition()*rcW.Height())/100;
rcSpl.right=rcDown.right;rcSpl.top=splitpos+10;rcSpl.bottom=rcSpl.top+7;rcSpl.left=(rcDown.right/2)-50;rcSpl.right=rcSpl.left+100;
m_wndSplitter.MoveWindow(rcSpl,true);
}
}
break;
}
return CResizableDialog::DefWindowProc(message, wParam, lParam);
}
// CTransferWnd message handlers
BOOL CTransferWnd::PreTranslateMessage(MSG* pMsg)
{
// handle tooltip updating, when mouse is moved from one item to another
if (pMsg->message== WM_MOUSEMOVE)
UpdateToolTips();
// relay mouse events to tooltip control
if (pMsg->message== WM_LBUTTONDOWN || pMsg->message== WM_LBUTTONUP || pMsg->message== WM_MOUSEMOVE)
m_ttip.RelayEvent(pMsg);
if (pMsg->message==WM_MBUTTONUP) {
if (downloadlistactive) downloadlistctrl.ShowSelectedFileDetails();
else {
switch(windowtransferstate){
case 2:
queuelistctrl.ShowSelectedUserDetails();
break;
case 1:
uploadlistctrl.ShowSelectedUserDetails();
break;
case 0:
clientlistctrl.ShowSelectedUserDetails();
break;
}
}
return TRUE;
}
return CResizableDialog::PreTranslateMessage(pMsg);
}
void CTransferWnd::UpdateToolTips(void)
{
int sel = GetItemUnderMouse(&downloadlistctrl);
if (sel != -1)
{
if (sel != m_iOldToolTipItemDown)
{
if (m_ttip.IsWindowVisible())
m_ttip.Update();
m_iOldToolTipItemDown = sel;
return;
}
}
int sel2 = GetItemUnderMouse(&uploadlistctrl);
if (sel2 != -1)
{
if (sel2 != m_iOldToolTipItemUp)
{
if (m_ttip.IsWindowVisible())
m_ttip.Update();
m_iOldToolTipItemUp = sel2;
return;
}
}
/* no tooltips needed ATM
int sel3 = GetItemUnderMouse(&queuelistctrl);
if (sel3 != -1)
{
if (sel3 != m_iOldToolTipItemQueue)
{
if (m_ttip.IsWindowVisible())
m_ttip.Update();
m_iOldToolTipItemQueue = sel3;
}
}
*/
if (sel == -1 && sel2 == -1 /*&& sel3 != -1*/)
m_ttip.Pop();
}
int CTransferWnd::GetItemUnderMouse(CListCtrl* ctrl)
{
CPoint pt;
::GetCursorPos(&pt);
ctrl->ScreenToClient(&pt);
LVHITTESTINFO hit, subhit;
hit.pt = pt;
subhit.pt = pt;
ctrl->SubItemHitTest(&subhit);
int sel = ctrl->HitTest(&hit);
if (sel != LB_ERR && (hit.flags & LVHT_ONITEM))
{
if (subhit.iSubItem == 0)
return sel;
}
return LB_ERR;
}
BOOL CTransferWnd::OnToolTipNotify(UINT id, NMHDR *pNMH, LRESULT *pResult)
{
TOOLTIPTEXT *pText = (TOOLTIPTEXT *)pNMH;
int control_id = ::GetDlgCtrlID((HWND)pNMH->idFrom);
if (!control_id)
return FALSE;
CString info;
if (control_id == IDC_DOWNLOADLIST)
{
if (downloadlistctrl.GetItemCount() < 1)
return FALSE;
int sel = GetItemUnderMouse(&downloadlistctrl);
if (sel < 0 || sel == 65535)
return FALSE;
// build info text and display it
CtrlItem_Struct* content = (CtrlItem_Struct*)downloadlistctrl.GetItemData(sel);
if (content->type == 1) // for downloading files
{
CPartFile* partfile = (CPartFile*)content->value;
CString strHash;
strHash.Format("%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
partfile->GetFileHash()[0],partfile->GetFileHash()[1],partfile->GetFileHash()[2],partfile->GetFileHash()[3],partfile->GetFileHash()[4],partfile->GetFileHash()[5],partfile->GetFileHash()[6],partfile->GetFileHash()[7],
partfile->GetFileHash()[8],partfile->GetFileHash()[9],partfile->GetFileHash()[10],partfile->GetFileHash()[11],partfile->GetFileHash()[12],partfile->GetFileHash()[13],partfile->GetFileHash()[14],partfile->GetFileHash()[15]);
CString Sbuffer;
CString lsc; CString compl; CString buffer; CString lastdwl;
lsc.Format("%s", CastItoXBytes(partfile->GetCompletedSize()));
buffer.Format( "%s", CastItoXBytes(partfile->GetFileSize()));
compl.Format( "%s/%s",lsc,buffer);
if (partfile->lastseencomplete==NULL) lsc.Format("%s",GetResString(IDS_UNKNOWN).MakeLower() ); else
lsc.Format( "%s", partfile->lastseencomplete.Format( theApp.glob_prefs->GetDateTimeFormat()));
float availability = 0;
if(partfile->GetPartCount() != 0) {
availability = partfile->GetAvailablePartCount() * 100 / partfile->GetPartCount();
}
if (partfile->GetCFileDate()!=NULL) lastdwl.Format( "%s",partfile->GetCFileDate().Format( theApp.glob_prefs->GetDateTimeFormat()));
else lastdwl=GetResString(IDS_UNKNOWN);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -