📄 transferview.cpp
字号:
/*
* Copyright (C) 2001-2006 Jacek Sieka, arnetheduck on gmail point com
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "stdafx.h"
#include "../client/DCPlusPlus.h"
#include "Resource.h"
#include "../client/ResourceManager.h"
#include "../client/QueueManager.h"
#include "../client/ConnectionManager.h"
#include "../client/ClientManager.h"
#include "WinUtil.h"
#include "TransferView.h"
int TransferView::columnIndexes[] = { COLUMN_USER, COLUMN_HUB, COLUMN_STATUS, COLUMN_TIMELEFT, COLUMN_SPEED, COLUMN_FILE, COLUMN_SIZE, COLUMN_PATH, COLUMN_IP, COLUMN_RATIO, COLUMN_CID };
int TransferView::columnSizes[] = { 150, 100, 250, 75, 75, 175, 100, 200, 50, 75, 125 };
static ResourceManager::Strings columnNames[] = { ResourceManager::USER, ResourceManager::HUB, ResourceManager::STATUS,
ResourceManager::TIME_LEFT, ResourceManager::SPEED, ResourceManager::FILENAME, ResourceManager::SIZE, ResourceManager::PATH,
ResourceManager::IP_BARE, ResourceManager::RATIO, ResourceManager::CID, };
TransferView::~TransferView() {
arrows.Destroy();
}
LRESULT TransferView::onCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) {
arrows.CreateFromImage(IDB_ARROWS, 16, 2, CLR_DEFAULT, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_SHARED);
ctrlTransfers.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
WS_HSCROLL | WS_VSCROLL | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS, WS_EX_CLIENTEDGE, IDC_TRANSFERS);
ctrlTransfers.SetExtendedListViewStyle(LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER);
WinUtil::splitTokens(columnIndexes, SETTING(MAINFRAME_ORDER), COLUMN_LAST);
WinUtil::splitTokens(columnSizes, SETTING(MAINFRAME_WIDTHS), COLUMN_LAST);
for(int j=0; j<COLUMN_LAST; j++) {
int fmt = (j == COLUMN_SIZE || j == COLUMN_TIMELEFT || j == COLUMN_SPEED) ? LVCFMT_RIGHT : LVCFMT_LEFT;
ctrlTransfers.InsertColumn(j, CTSTRING_I(columnNames[j]), fmt, columnSizes[j], j);
}
ctrlTransfers.SetColumnOrderArray(COLUMN_LAST, columnIndexes);
ctrlTransfers.SetBkColor(WinUtil::bgColor);
ctrlTransfers.SetTextBkColor(WinUtil::bgColor);
ctrlTransfers.SetTextColor(WinUtil::textColor);
ctrlTransfers.SetImageList(arrows, LVSIL_SMALL);
ctrlTransfers.setSortColumn(COLUMN_USER);
transferMenu.CreatePopupMenu();
appendUserItems(transferMenu);
transferMenu.AppendMenu(MF_SEPARATOR);
transferMenu.AppendMenu(MF_STRING, IDC_FORCE, CTSTRING(FORCE_ATTEMPT));
transferMenu.AppendMenu(MF_STRING, IDC_SEARCH_ALTERNATES, CTSTRING(SEARCH_FOR_ALTERNATES));
transferMenu.AppendMenu(MF_STRING, IDC_COPY_NICK, CTSTRING(COPY_NICK));
transferMenu.AppendMenu(MF_SEPARATOR);
transferMenu.AppendMenu(MF_STRING, IDC_REMOVE, CTSTRING(CLOSE_CONNECTION));
transferMenu.SetMenuDefaultItem(IDC_PRIVATEMESSAGE);
ConnectionManager::getInstance()->addListener(this);
DownloadManager::getInstance()->addListener(this);
UploadManager::getInstance()->addListener(this);
return 0;
}
void TransferView::prepareClose() {
WinUtil::saveHeaderOrder(ctrlTransfers, SettingsManager::MAINFRAME_ORDER,
SettingsManager::MAINFRAME_WIDTHS, COLUMN_LAST, columnIndexes, columnSizes);
ConnectionManager::getInstance()->removeListener(this);
DownloadManager::getInstance()->removeListener(this);
UploadManager::getInstance()->removeListener(this);
}
LRESULT TransferView::onSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) {
RECT rc;
GetClientRect(&rc);
ctrlTransfers.MoveWindow(&rc);
return 0;
}
LRESULT TransferView::onContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
if (reinterpret_cast<HWND>(wParam) == ctrlTransfers && ctrlTransfers.GetSelectedCount() > 0) {
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
if(pt.x == -1 && pt.y == -1) {
WinUtil::getContextMenuPos(ctrlTransfers, pt);
}
int i = -1;
ItemInfo* itemI;
bool bCustomMenu = false;
if( (i = ctrlTransfers.GetNextItem(i, LVNI_SELECTED)) != -1) {
itemI = ctrlTransfers.getItemData(i);
bCustomMenu = true;
prepareMenu(transferMenu, UserCommand::CONTEXT_CHAT, ClientManager::getInstance()->getHubs(itemI->user->getCID()));
transferMenu.AppendMenu(MF_SEPARATOR);
}
checkAdcItems(transferMenu);
transferMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
if ( bCustomMenu ) {
transferMenu.DeleteMenu(transferMenu.GetMenuItemCount()-1, MF_BYPOSITION);
cleanMenu(transferMenu);
}
return TRUE;
}
bHandled = FALSE;
return FALSE;
}
void TransferView::runUserCommand(UserCommand& uc) {
if(!WinUtil::getUCParams(m_hWnd, uc, ucLineParams))
return;
StringMap ucParams = ucLineParams;
int i = -1;
while((i = ctrlTransfers.GetNextItem(i, LVNI_SELECTED)) != -1) {
ItemInfo* itemI = ctrlTransfers.getItemData(i);
if(!itemI->user->isOnline())
continue;
StringMap tmp = ucParams;
/// @todo tmp["fileFN"] = Text::fromT(itemI->path + itemI->file);
// compatibility with 0.674 and earlier
ucParams["file"] = ucParams["fileFN"];
ClientManager::getInstance()->userCommand(itemI->user, uc, tmp, true);
}
}
LRESULT TransferView::onForce(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
int i = -1;
while( (i = ctrlTransfers.GetNextItem(i, LVNI_SELECTED)) != -1) {
ctrlTransfers.SetItemText(i, COLUMN_STATUS, CTSTRING(CONNECTING_FORCED));
ClientManager::getInstance()->connect(((ItemInfo*)ctrlTransfers.getItemData(i))->user);
}
return 0;
}
void TransferView::ItemInfo::removeAll() {
QueueManager::getInstance()->removeSource(user, QueueItem::Source::FLAG_REMOVED);
}
LRESULT TransferView::onCopyNick(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
int i = -1;
/// @todo Fix when more items are selected
while( (i = ctrlTransfers.GetNextItem(i, LVNI_SELECTED)) != -1) {
WinUtil::setClipboard(WinUtil::getNicks(ctrlTransfers.getItemData(i)->user));
}
return 0;
}
LRESULT TransferView::onCustomDraw(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) {
if(!BOOLSETTING(SHOW_PROGRESS_BARS)) {
bHandled = FALSE;
return 0;
}
CRect rc;
LPNMLVCUSTOMDRAW cd = (LPNMLVCUSTOMDRAW)pnmh;
switch(cd->nmcd.dwDrawStage) {
case CDDS_PREPAINT:
return CDRF_NOTIFYITEMDRAW;
case CDDS_ITEMPREPAINT:
return CDRF_NOTIFYSUBITEMDRAW;
case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
// Let's draw a box if needed...
if(cd->iSubItem == COLUMN_STATUS) {
ItemInfo* ii = (ItemInfo*)cd->nmcd.lItemlParam;
if(ii->status == ItemInfo::STATUS_RUNNING) {
// draw something nice...
TCHAR buf[256];
COLORREF barBase = ii->download ? SETTING(DOWNLOAD_BAR_COLOR) : SETTING(UPLOAD_BAR_COLOR);
COLORREF bgBase = WinUtil::bgColor;
int mod = (HLS_L(RGB2HLS(bgBase)) >= 128) ? -30 : 30;
COLORREF barPal[3] = { HLS_TRANSFORM(barBase, -40, 50), barBase, HLS_TRANSFORM(barBase, 40, -30) };
COLORREF bgPal[2] = { HLS_TRANSFORM(bgBase, mod, 0), HLS_TRANSFORM(bgBase, mod/2, 0) };
ctrlTransfers.GetItemText((int)cd->nmcd.dwItemSpec, COLUMN_STATUS, buf, 255);
buf[255] = 0;
ctrlTransfers.GetSubItemRect((int)cd->nmcd.dwItemSpec, COLUMN_STATUS, LVIR_BOUNDS, rc);
CRect rc2 = rc;
rc2.left += 6;
// draw background
HGDIOBJ oldpen = ::SelectObject(cd->nmcd.hdc, CreatePen(PS_SOLID,0,bgPal[0]));
HGDIOBJ oldbr = ::SelectObject(cd->nmcd.hdc, CreateSolidBrush(bgPal[1]));
::Rectangle(cd->nmcd.hdc, rc.left, rc.top - 1, rc.right, rc.bottom);
rc.DeflateRect(1, 0, 1, 1);
LONG left = rc.left;
int64_t w = rc.Width();
// draw start part
if(ii->size == 0)
ii->size = 1;
rc.right = left + (int) (w * ii->start / ii->size);
DeleteObject(SelectObject(cd->nmcd.hdc, CreateSolidBrush(barPal[0])));
DeleteObject(SelectObject(cd->nmcd.hdc, CreatePen(PS_SOLID,0,barPal[0])));
::Rectangle(cd->nmcd.hdc, rc.left, rc.top, rc.right, rc.bottom);
// Draw actual part
rc.left = rc.right;
rc.right = left + (int) (w * ii->actual / ii->size);
DeleteObject(SelectObject(cd->nmcd.hdc, CreateSolidBrush(barPal[1])));
::Rectangle(cd->nmcd.hdc, rc.left, rc.top, rc.right, rc.bottom);
// And the effective part...
if(ii->pos > ii->actual) {
rc.left = rc.right - 1;
rc.right = left + (int) (w * ii->pos / ii->size);
DeleteObject(SelectObject(cd->nmcd.hdc, CreateSolidBrush(barPal[2])));
::Rectangle(cd->nmcd.hdc, rc.left, rc.top, rc.right, rc.bottom);
}
rc.left = left;
// draw progressbar highlight
if(rc.Width()>2) {
DeleteObject(SelectObject(cd->nmcd.hdc, CreatePen(PS_SOLID,1,barPal[2])));
rc.top += 2;
::MoveToEx(cd->nmcd.hdc,rc.left+1,rc.top,(LPPOINT)NULL);
::LineTo(cd->nmcd.hdc,rc.right-2,rc.top);
}
// draw status text
DeleteObject(::SelectObject(cd->nmcd.hdc, oldpen));
DeleteObject(::SelectObject(cd->nmcd.hdc, oldbr));
LONG right = rc2.right;
left = rc2.left;
rc2.right = rc.right;
LONG top = rc2.top + (rc2.Height() - WinUtil::getTextHeight(cd->nmcd.hdc) - 1)/2;
SetTextColor(cd->nmcd.hdc, RGB(255, 255, 255));
::ExtTextOut(cd->nmcd.hdc, left, top, ETO_CLIPPED, rc2, buf, _tcslen(buf), NULL);
//::DrawText(cd->nmcd.hdc, buf, strlen(buf), rc2, DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER);
rc2.left = rc2.right;
rc2.right = right;
SetTextColor(cd->nmcd.hdc, WinUtil::textColor);
::ExtTextOut(cd->nmcd.hdc, left, top, ETO_CLIPPED, rc2, buf, _tcslen(buf), NULL);
return CDRF_SKIPDEFAULT;
}
}
// Fall through
default:
return CDRF_DODEFAULT;
}
}
LRESULT TransferView::onDoubleClickTransfers(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) {
NMITEMACTIVATE* item = (NMITEMACTIVATE*)pnmh;
if (item->iItem != -1 ) {
ctrlTransfers.getItemData(item->iItem)->pm();
}
return 0;
}
LRESULT TransferView::onSpeaker(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
if(wParam == ADD_ITEM) {
auto_ptr<UpdateInfo> ui(reinterpret_cast<UpdateInfo*>(lParam));
ItemInfo* ii = new ItemInfo(ui->user, ui->download);
ii->update(*ui);
ctrlTransfers.insertItem(ii, ii->download ? IMAGE_DOWNLOAD : IMAGE_UPLOAD);
} else if(wParam == REMOVE_ITEM) {
auto_ptr<UpdateInfo> ui(reinterpret_cast<UpdateInfo*>(lParam));
int ic = ctrlTransfers.GetItemCount();
for(int i = 0; i < ic; ++i) {
ItemInfo* ii = ctrlTransfers.getItemData(i);
if(*ui == *ii) {
ctrlTransfers.DeleteItem(i);
delete ii;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -