📄 mainfrm.cpp
字号:
if( oldshutdown ||(!BOOLSETTING(CONFIRM_EXIT)) || (MessageBox(CSTRING(REALLY_EXIT), APPNAME " " VERSIONSTRING, MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2) == IDYES) ) {
string tmp1;
string tmp2;
WINDOWPLACEMENT wp;
wp.length = sizeof(wp);
GetWindowPlacement(&wp);
CRect rc;
GetWindowRect(rc);
if(wp.showCmd == SW_SHOW || wp.showCmd == SW_SHOWNORMAL) {
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_POS_X, rc.left);
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_POS_Y, rc.top);
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_SIZE_X, rc.Width());
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_SIZE_Y, rc.Height());
}
if(wp.showCmd == SW_SHOWNORMAL || wp.showCmd == SW_SHOW || wp.showCmd == SW_SHOWMAXIMIZED || wp.showCmd == SW_MAXIMIZE)
SettingsManager::getInstance()->set(SettingsManager::MAIN_WINDOW_STATE, (int)wp.showCmd);
WinUtil::saveHeaderOrder(ctrlTransfers, SettingsManager::MAINFRAME_ORDER,
SettingsManager::MAINFRAME_WIDTHS, COLUMN_LAST, columnIndexes, columnSizes);
ShowWindow(SW_HIDE);
SearchManager::getInstance()->disconnect();
ConnectionManager::getInstance()->disconnect();
DWORD id;
stopperThread = CreateThread(NULL, 0, stopper, this, 0, &id);
closing = true;
}
bHandled = TRUE;
} else {
// This should end immideately, as it only should be the stopper that sends another WM_CLOSE
WaitForSingleObject(stopperThread, 60*1000);
CloseHandle(stopperThread);
stopperThread = NULL;
MDIDestroy(m_hWnd);
}
return 0;
}
LRESULT MainFrame::onLink(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
string site;
switch(wID) {
case IDC_HELP_README: site = Util::getAppPath() + "README.txt"; break;
case IDC_HELP_CHANGELOG: site = Util::getAppPath() + "changelog.txt"; break;
case IDC_HELP_HOMEPAGE: site = "http://dcplusplus.sourceforge.net"; break;
case IDC_HELP_DOWNLOADS: site = "http://dcplusplus.sourceforge.net/index.php?page=download"; break;
case IDC_HELP_FAQ: site = "http://dcplusplus.sourceforge.net/faq/faq.php?list=all&prog=1&lang=en"; break;
case IDC_HELP_HELP_FORUM: site = "http://dcplusplus.sf.net/forum"; break;
case IDC_HELP_DISCUSS: site = "http://dcplusplus.sf.net/forum"; break;
case IDC_HELP_REQUEST_FEATURE: site = "http://sourceforge.net/tracker/?atid=427635&group_id=40287&func=browse"; break;
case IDC_HELP_REPORT_BUG: site = "http://sourceforge.net/tracker/?atid=427632&group_id=40287&func=browse"; break;
case IDC_HELP_DONATE: site = "https://www.paypal.com/xclick/business=j_s%40telia.com&item_name=DC%2B%2B&no_shipping=1&cn=DC%2B%2B+forum+nick+or+greeting"; break;
default: dcassert(0);
}
ShellExecute(NULL, NULL, site.c_str(), NULL, NULL, SW_SHOWNORMAL);
return 0;
}
LRESULT MainFrame::onImport(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
string file = Util::getAppPath() + "queue.config";
if(WinUtil::browseFile(file, m_hWnd, false) == IDOK) {
try {
QueueManager::getInstance()->importNMQueue(file);
} catch(const FileException&) {
ctrlStatus.SetText(0, CSTRING(ERROR_OPENING_FILE));
}
}
return 0;
}
void MainFrame::UpdateLayout(BOOL bResizeBars /* = TRUE */)
{
RECT rect;
GetClientRect(&rect);
// position bars and offset their dimensions
UpdateBarsPosition(rect, bResizeBars);
if(ctrlStatus.IsWindow()) {
CRect sr;
int w[8];
ctrlStatus.GetClientRect(sr);
w[7] = sr.right - 16;
#define setw(x) w[x] = max(w[x+1] - statusSizes[x], 0)
setw(6); setw(5); setw(4); setw(3); setw(2); setw(1); setw(0);
ctrlStatus.SetParts(8, w);
}
CRect rc = rect;
rc.top = rc.bottom - ctrlTab.getHeight();
if(ctrlTab.IsWindow())
ctrlTab.MoveWindow(rc);
CRect rc2 = rect;
rc2.bottom = rc.top;
SetSplitterRect(rc2);
}
static const char types[] = "File Lists\0*.DcLst;*.bz2\0All Files\0*.*\0";
LRESULT MainFrame::onOpenFileList(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
string file;
if(WinUtil::browseFile(file, m_hWnd, false, Util::getAppPath() + "FileLists\\", types)) {
string username;
if(file.rfind('\\') != string::npos) {
username = file.substr(file.rfind('\\') + 1);
if(username.rfind('.') != string::npos) {
username.erase(username.rfind('.'));
}
User::Ptr& u = ClientManager::getInstance()->getUser(username);
DirectoryListingFrame* pChild = new DirectoryListingFrame(file, u);
pChild->setTab(&ctrlTab);
pChild->CreateEx(m_hWndClient);
pChild->setWindowTitle();
}
}
return 0;
}
LRESULT MainFrame::onTrayIcon(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
if (lParam == WM_LBUTTONUP) {
ShowWindow(SW_SHOW);
ShowWindow(maximized ? SW_MAXIMIZE : SW_RESTORE);
} else if(lParam == WM_MOUSEMOVE && ((lastMove + 1000) < GET_TICK()) ) {
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = m_hWnd;
nid.uID = 0;
nid.uFlags = NIF_TIP;
strncpy(nid.szTip, ("D: " + Util::formatBytes(DownloadManager::getInstance()->getAverageSpeed()) + "/s (" +
Util::toString(DownloadManager::getInstance()->getDownloads()) + ")\r\nU: " +
Util::formatBytes(UploadManager::getInstance()->getAverageSpeed()) + "/s (" +
Util::toString(UploadManager::getInstance()->getUploads()) + ")").c_str(), 64);
::Shell_NotifyIcon(NIM_MODIFY, &nid);
lastMove = GET_TICK();
}
return 0;
}
LRESULT MainFrame::OnViewToolBar(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
static BOOL bVisible = TRUE; // initially visible
bVisible = !bVisible;
CReBarCtrl rebar = m_hWndToolBar;
int nBandIndex = rebar.IdToIndex(ATL_IDW_BAND_FIRST + 1); // toolbar is 2nd added band
rebar.ShowBand(nBandIndex, bVisible);
UISetCheck(ID_VIEW_TOOLBAR, bVisible);
UpdateLayout();
return 0;
}
LRESULT MainFrame::onFinished(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(FinishedFrame::frame == NULL) {
FinishedFrame* pChild = new FinishedFrame();
pChild->setTab(&ctrlTab);
pChild->CreateEx(m_hWndClient);
} else {
MDIActivate(FinishedFrame::frame->m_hWnd);
}
return 0;
}
LRESULT MainFrame::onFinishedUploads(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(FinishedULFrame::frame == NULL) {
FinishedULFrame* pChild = new FinishedULFrame();
pChild->setTab(&ctrlTab);
pChild->CreateEx(m_hWndClient);
} else {
MDIActivate(FinishedULFrame::frame->m_hWnd);
}
return 0;
}
LRESULT MainFrame::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...
char buf[256];
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;
//::Rectangle(cd->nmcd.hdc, rc.left, rc.top, rc.right, rc.bottom);
//rc.DeflateRect(1, 1, 1, 1);
if(ii->size == 0)
ii->size = 1;
rc.right = rc.left + (int) (((int64_t)rc.Width()) * ii->pos / ii->size);
bool altColor = (ctrlTransfers.m_hWnd == ::GetFocus()) && (ctrlTransfers.GetItemState((int)cd->nmcd.dwItemSpec, LVIS_SELECTED) & LVIS_SELECTED);
int color = altColor ? COLOR_BTNFACE : COLOR_HIGHLIGHT;
HGDIOBJ old = ::SelectObject(cd->nmcd.hdc, GetSysColorBrush(color));
::Rectangle(cd->nmcd.hdc, rc.left, rc.top,
rc.right, rc.bottom);
::SelectObject(cd->nmcd.hdc, old);
COLORREF oldcol = ::SetTextColor(cd->nmcd.hdc, cd->clrText);
::DrawText(cd->nmcd.hdc, buf, strlen(buf), rc2, DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER);
color = altColor ? COLOR_BTNTEXT : COLOR_HIGHLIGHTTEXT;
::SetTextColor(cd->nmcd.hdc, GetSysColor(color));
rc2.right = rc.right;
::DrawText(cd->nmcd.hdc, buf, strlen(buf), rc2, DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER);
::SelectObject(cd->nmcd.hdc, old);
::SetTextColor(cd->nmcd.hdc, oldcol);
return CDRF_SKIPDEFAULT;
}
}
// Fall through
default:
return CDRF_DODEFAULT;
}
}
LRESULT MainFrame::onCloseDisconnected(WORD , WORD , HWND , BOOL& ) {
HubFrame::closeDisconnected();
return 0;
}
LRESULT MainFrame::onGrantSlot(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
int i = -1;
while( (i = ctrlTransfers.GetNextItem(i, LVNI_SELECTED)) != -1) {
UploadManager::getInstance()->reserveSlot(((ItemInfo*)ctrlTransfers.GetItemData(i))->user);
}
return 0;
}
LRESULT MainFrame::onAddToFavorites(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
int i = -1;
while( (i = ctrlTransfers.GetNextItem(i, LVNI_SELECTED)) != -1) {
HubManager::getInstance()->addFavoriteUser(((ItemInfo*)ctrlTransfers.GetItemData(i))->user);
}
return 0;
}
void MainFrame::onAction(UploadManagerListener::Types type, Upload* aUpload) throw() {
switch(type) {
case UploadManagerListener::COMPLETE: onUploadComplete(aUpload); break;
case UploadManagerListener::STARTING: onUploadStarting(aUpload); break;
default: dcassert(0);
}
}
void MainFrame::onAction(UploadManagerListener::Types type, const Upload::List& ul) throw() {
switch(type) {
case UploadManagerListener::TICK: onUploadTick(ul); break;
}
}
void MainFrame::onAction(DownloadManagerListener::Types type, Download* aDownload) throw() {
switch(type) {
case DownloadManagerListener::COMPLETE: onDownloadComplete(aDownload); break;
case DownloadManagerListener::STARTING: onDownloadStarting(aDownload); break;
default: dcassert(0); break;
}
}
void MainFrame::onAction(DownloadManagerListener::Types type, const Download::List& dl) throw() {
switch(type) {
case DownloadManagerListener::TICK: onDownloadTick(dl); break;
}
}
void MainFrame::onAction(DownloadManagerListener::Types type, Download* aDownload, const string& aReason) throw() {
switch(type) {
case DownloadManagerListener::FAILED: onDownloadFailed(aDownload, aReason); break;
default: dcassert(0); break;
}
}
void MainFrame::onAction(ConnectionManagerListener::Types type, ConnectionQueueItem* aCqi) throw() {
switch(type) {
case ConnectionManagerListener::ADDED: onConnectionAdded(aCqi); break;
case ConnectionManagerListener::CONNECTED: onConnectionConnected(aCqi); break;
case ConnectionManagerListener::REMOVED: onConnectionRemoved(aCqi); break;
case ConnectionManagerListener::STATUS_CHANGED: onConnectionStatus(aCqi); break;
default: dcassert(0); break;
}
};
void MainFrame::onAction(ConnectionManagerListener::Types type, ConnectionQueueItem* aCqi, const string& aLine) throw() {
switch(type) {
case ConnectionManagerListener::FAILED: onConnectionFailed(aCqi, aLine); break;
default: dcassert(0); break;
}
}
void MainFrame::onAction(TimerManagerListener::Types type, u_int32_t aTick) throw() {
if(type == TimerManagerListener::SECOND) {
int64_t diff = (int64_t)((lastUpdate == 0) ? aTick - 1000 : aTick - lastUpdate);
StringList* str = new StringList();
str->push_back(Util::getAway() ? STRING(AWAY) : "");
str->push_back("H: " + Client::getCounts());
str->push_back(STRING(SLOTS) + ": " + Util::toString(SETTING(SLOTS) - UploadManager::getInstance()->getRunning()) + '/' + Util::toString(SETTING(SLOTS)));
str->push_back("D: " + Util::formatBytes(Socket::getTotalDown()));
str->push_back("U: " + Util::formatBytes(Socket::getTotalUp()));
str->push_back("D: " + Util::formatBytes(Socket::getDown()*1000I64/diff) + "/s (" + Util::toString(DownloadManager::getInstance()->getDownloads()) + ")");
str->push_back("U: " + Util::formatBytes(Socket::getUp()*1000I64/diff) + "/s (" + Util::toString(UploadManager::getInstance()->getUploads()) + ")");
PostMessage(WM_SPEAKER, STATS, (LPARAM)str);
SettingsManager::getInstance()->set(SettingsManager::TOTAL_UPLOAD, SETTING(TOTAL_UPLOAD) + Socket::getUp());
SettingsManager::getInstance()->set(SettingsManager::TOTAL_DOWNLOAD, SETTING(TOTAL_DOWNLOAD) + Socket::getDown());
lastUpdate = aTick;
Socket::resetStats();
}
}
// HttpConnectionListener
void MainFrame::onAction(HttpConnectionListener::Types type, HttpConnection* conn, string const& /*aLine*/) throw() {
switch(type) {
case HttpConnectionListener::COMPLETE: onHttpComplete(conn); break;
}
}
void MainFrame::onAction(HttpConnectionListener::Types type, HttpConnection* /*conn*/, const BYTE* buf, int len) throw() {
switch(type) {
case HttpConnectionListener::DATA: versionInfo += string((const char*)buf, len); break;
}
}
void MainFrame::onAction(QueueManagerListener::Types type, QueueItem* qi) throw() {
if(type == QueueManagerListener::FINISHED) {
if(qi->isSet(QueueItem::FLAG_CLIENT_VIEW)) {
// This is a file listing, show it...
DirectoryListInfo* i = new DirectoryListInfo();
if(qi->isSet(QueueItem::FLAG_BZLIST) ){
dcassert(qi->getTarget().rfind('.') != string::npos);
i->file = qi->getTarget().substr(0, qi->getTarget().rfind('.')+1) + "bz2";
} else {
i->file = qi->getTarget();
}
i->user = qi->getCurrent()->getUser();
PostMessage(WM_SPEAKER, DOWNLOAD_LISTING, (LPARAM)i);
}
}
}
/**
* @file
* $Id: MainFrm.cpp,v 1.27 2003/07/15 14:53:12 arnetheduck Exp $
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -