📄 mainfrm.cpp
字号:
}
}
}
void MainFrame::updateTray(bool add /* = true */) {
if(add) {
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = m_hWnd;
nid.uID = 0;
nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
nid.uCallbackMessage = WM_APP + 242;
nid.hIcon = (HICON)::LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
_tcscpy(nid.szTip, _T("DC++"));
nid.szTip[63] = '\0';
lastMove = GET_TICK() - 1000;
::Shell_NotifyIcon(NIM_ADD, &nid);
trayIcon = true;
} else {
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = m_hWnd;
nid.uID = 0;
nid.uFlags = 0;
::Shell_NotifyIcon(NIM_DELETE, &nid);
ShowWindow(SW_SHOW);
trayIcon = false;
}
}
/**
* @todo Fix so that the away mode is not reset if it was set manually...
*/
LRESULT MainFrame::onSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
if(wParam == SIZE_MINIMIZED) {
if(BOOLSETTING(AUTO_AWAY)) {
Util::setAway(true);
}
if(BOOLSETTING(MINIMIZE_TRAY)) {
updateTray(true);
ShowWindow(SW_HIDE);
}
maximized = IsZoomed() > 0;
} else if( (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED) ) {
if(BOOLSETTING(AUTO_AWAY)) {
Util::setAway(false);
}
if(trayIcon) {
updateTray(false);
}
}
bHandled = FALSE;
return 0;
}
LRESULT MainFrame::onEndSession(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) {
if(c != NULL) {
c->removeListener(this);
delete c;
c = NULL;
}
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);
QueueManager::getInstance()->saveQueue();
SettingsManager::getInstance()->save();
return 0;
}
LRESULT MainFrame::OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) {
if(c != NULL) {
c->removeListener(this);
delete c;
c = NULL;
}
if(!closing) {
if( oldshutdown ||(!BOOLSETTING(CONFIRM_EXIT)) || (MessageBox(CTSTRING(REALLY_EXIT), _T(APPNAME) _T(" ") _T(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);
ShowWindow(SW_HIDE);
transferView.prepareClose();
SearchManager::getInstance()->disconnect();
ConnectionManager::getInstance()->disconnect();
// Just check if the port mapping objects are initialized (NOT NULL)
if ( UPnP_TCPConnection != NULL )
{
if (FAILED(UPnP_TCPConnection->ClosePorts()) )
{
LogManager::getInstance()->message(STRING(UPNP_FAILED_TO_REMOVE_MAPPINGS));
}
delete UPnP_TCPConnection;
}
if ( UPnP_UDPConnection != NULL )
{
if (FAILED(UPnP_UDPConnection->ClosePorts()) )
{
LogManager::getInstance()->message(STRING(UPNP_FAILED_TO_REMOVE_MAPPINGS));
}
delete UPnP_UDPConnection;
}
// Not sure this is required (i.e. Objects are checked later in execution)
// But its better being on the save side :P
UPnP_TCPConnection = UPnP_UDPConnection = NULL;
DWORD id;
stopperThread = CreateThread(NULL, 0, stopper, this, 0, &id);
closing = true;
}
bHandled = TRUE;
} else {
// This should end immediately, as it only should be the stopper that sends another WM_CLOSE
WaitForSingleObject(stopperThread, 60*1000);
CloseHandle(stopperThread);
stopperThread = NULL;
bHandled = FALSE;
}
return 0;
}
LRESULT MainFrame::onLink(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
tstring site;
bool isFile = false;
switch(wID) {
case IDC_HELP_README: site = Text::toT(Util::getAppPath() + "README.txt"); isFile = true; break;
case IDC_HELP_HOMEPAGE: site = links.homepage; break;
case IDC_HELP_DOWNLOADS: site = links.downloads; break;
case IDC_HELP_TRANSLATIONS: site = links.translations; break;
case IDC_HELP_FAQ: site = links.faq; break;
case IDC_HELP_HELP_FORUM: site = links.help; break;
case IDC_HELP_DISCUSS: site = links.discuss; break;
case IDC_HELP_REQUEST_FEATURE: site = links.features; break;
case IDC_HELP_REPORT_BUG: site = links.bugs; break;
case IDC_HELP_DONATE: site = Text::toT("https://www.paypal.com/xclick/business=arnetheduck%40gmail.com&item_name=DCPlusPlus&no_shipping=1&return=http%3A//dcplusplus.sf.net&cn=Greeting+%28and+forum+nick%3F%29¤cy_code=EUR"); break;
default: dcassert(0);
}
if(isFile)
WinUtil::openFile(site);
else
WinUtil::openLink(site);
return 0;
}
void MainFrame::UpdateLayout(BOOL bResizeBars /* = TRUE */)
{
RECT rect;
GetClientRect(&rect);
// position bars and offset their dimensions
UpdateBarsPosition(rect, bResizeBars);
if(ctrlStatus.IsWindow() && ctrlLastLines.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);
ctrlLastLines.SetMaxTipWidth(w[0]);
ctrlLastLines.SetWindowPos(HWND_TOPMOST, sr.left, sr.top, sr.Width(), sr.Height(), SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}
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 TCHAR types[] = _T("File Lists\0*.DcLst;*.xml.bz2\0All Files\0*.*\0");
LRESULT MainFrame::onOpenFileList(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
tstring file;
if(WinUtil::browseFile(file, m_hWnd, false, Text::toT(Util::getAppPath() + "FileLists\\"), types)) {
tstring username;
if(file.rfind('\\') != string::npos) {
username = file.substr(file.rfind('\\') + 1);
if(username.rfind('.') != string::npos) {
username.erase(username.rfind('.'));
}
if(username.length() > 4 && Util::stricmp(username.c_str() + username.length() - 4, _T(".xml")) == 0)
username.erase(username.length()-4);
DirectoryListingFrame::openWindow(file, ClientManager::getInstance()->getUser(Text::fromT(username)));
}
}
return 0;
}
LRESULT MainFrame::onOpenOwnList(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(!ShareManager::getInstance()->getOwnListFile().empty()){
DirectoryListingFrame::openWindow(Text::toT(ShareManager::getInstance()->getOwnListFile()), ClientManager::getInstance()->getUser(SETTING(NICK)));
}
return 0;
}
LRESULT MainFrame::onRefreshFileList(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
ShareManager::getInstance()->setDirty();
ShareManager::getInstance()->refresh(true);
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_RBUTTONDOWN || lParam == WM_CONTEXTMENU){
CPoint pt;
CMenu mnuTrayMenu;
mnuTrayMenu.CreatePopupMenu();
mnuTrayMenu.AppendMenu(MF_STRING, IDC_TRAY_SHOW, CTSTRING(MENU_SHOW));
mnuTrayMenu.AppendMenu(MF_STRING, IDC_TRAY_QUIT, CTSTRING(MENU_EXIT));
mnuTrayMenu.AppendMenu(MF_STRING, IDC_OPEN_DOWNLOADS, CTSTRING(MENU_OPEN_DOWNLOADS_DIR));
GetCursorPos(&pt);
SetForegroundWindow(m_hWnd);
mnuTrayMenu.TrackPopupMenu(TPM_BOTTOMALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,pt.x,pt.y,m_hWnd);
PostMessage(WM_NULL, 0, 0);
mnuTrayMenu.SetMenuDefaultItem(0,TRUE);
} 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;
_tcsncpy(nid.szTip, Text::toT("D: " + Util::formatBytes(DownloadManager::getInstance()->getAverageSpeed()) + "/s (" +
Util::toString(DownloadManager::getInstance()->getDownloadCount()) + ")\r\nU: " +
Util::formatBytes(UploadManager::getInstance()->getAverageSpeed()) + "/s (" +
Util::toString(UploadManager::getInstance()->getUploadCount()) + ")").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();
SettingsManager::getInstance()->set(SettingsManager::SHOW_TOOLBAR, bVisible);
return 0;
}
LRESULT MainFrame::OnViewStatusBar(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
BOOL bVisible = !::IsWindowVisible(m_hWndStatusBar);
::ShowWindow(m_hWndStatusBar, bVisible ? SW_SHOWNOACTIVATE : SW_HIDE);
UISetCheck(ID_VIEW_STATUS_BAR, bVisible);
UpdateLayout();
SettingsManager::getInstance()->set(SettingsManager::SHOW_STATUSBAR, bVisible);
return 0;
}
LRESULT MainFrame::OnViewTransferView(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
BOOL bVisible = !transferView.IsWindowVisible();
if(!bVisible) {
if(GetSinglePaneMode() == SPLIT_PANE_NONE)
SetSinglePaneMode(SPLIT_PANE_TOP);
} else {
if(GetSinglePaneMode() != SPLIT_PANE_NONE)
SetSinglePaneMode(SPLIT_PANE_NONE);
}
UISetCheck(ID_VIEW_TRANSFER_VIEW, bVisible);
UpdateLayout();
SettingsManager::getInstance()->set(SettingsManager::SHOW_TRANSFERVIEW, bVisible);
return 0;
}
LRESULT MainFrame::onFinished(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
FinishedFrame::openWindow();
return 0;
}
LRESULT MainFrame::onFinishedUploads(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
FinishedULFrame::openWindow();
return 0;
}
LRESULT MainFrame::onCloseDisconnected(WORD , WORD , HWND , BOOL& ) {
HubFrame::closeDisconnected();
return 0;
}
LRESULT MainFrame::onQuickConnect(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/){
LineDlg dlg;
dlg.description = TSTRING(HUB_ADDRESS);
dlg.title = TSTRING(QUICK_CONNECT);
if(dlg.DoModal(m_hWnd) == IDOK){
if(SETTING(NICK).empty())
return 0;
tstring tmp = dlg.line;
// Strip out all the spaces
string::size_type i;
while((i = tmp.find(' ')) != string::npos)
tmp.erase(i, 1);
HubFrame::openWindow(tmp);
}
return 0;
}
void MainFrame::on(TimerManagerListener::Second, u_int32_t aTick) throw() {
int64_t diff = (int64_t)((lastUpdate == 0) ? aTick - 1000 : aTick - lastUpdate);
int64_t updiff = Socket::getTotalUp() - lastUp;
int64_t downdiff = Socket::getTotalDown() - lastDown;
TStringList* str = new TStringList();
str->push_back(Util::getAway() ? TSTRING(AWAY) : _T(""));
str->push_back(Text::toT("H: " + Client::getCounts()));
str->push_back(Text::toT(STRING(SLOTS) + ": " + Util::toString(UploadManager::getInstance()->getFreeSlots()) + '/' + Util::toString(SETTING(SLOTS))));
str->push_back(Text::toT("D: " + Util::formatBytes(Socket::getTotalDown())));
str->push_back(Text::toT("U: " + Util::formatBytes(Socket::getTotalUp())));
str->push_back(Text::toT("D: " + Util::formatBytes(downdiff*1000I64/diff) + "/s (" + Util::toString(DownloadManager::getInstance()->getDownloadCount()) + ")"));
str->push_back(Text::toT("U: " + Util::formatBytes(updiff*1000I64/diff) + "/s (" + Util::toString(UploadManager::getInstance()->getUploadCount()) + ")"));
PostMessage(WM_SPEAKER, STATS, (LPARAM)str);
SettingsManager::getInstance()->set(SettingsManager::TOTAL_UPLOAD, SETTING(TOTAL_UPLOAD) + updiff);
SettingsManager::getInstance()->set(SettingsManager::TOTAL_DOWNLOAD, SETTING(TOTAL_DOWNLOAD) + downdiff);
lastUpdate = aTick;
lastUp = Socket::getTotalUp();
lastDown = Socket::getTotalDown();
}
void MainFrame::on(HttpConnectionListener::Data, HttpConnection* /*conn*/, const u_int8_t* buf, size_t len) throw() {
versionInfo += string((const char*)buf, len);
}
void MainFrame::on(PartialList, const User::Ptr& aUser, const string& text) throw() {
PostMessage(WM_SPEAKER, BROWSE_LISTING, (LPARAM)new DirectoryBrowseInfo(aUser, text));
}
void MainFrame::on(QueueManagerListener::Finished, QueueItem* qi) throw() {
if(qi->isSet(QueueItem::FLAG_CLIENT_VIEW)) {
if(qi->isSet(QueueItem::FLAG_USER_LIST)) {
// This is a file listing, show it...
DirectoryListInfo* i = new DirectoryListInfo();
i->file = Text::toT(qi->getListName());
i->user = qi->getCurrent()->getUser();
PostMessage(WM_SPEAKER, DOWNLOAD_LISTING, (LPARAM)i);
} else if(qi->isSet(QueueItem::FLAG_TEXT)) {
PostMessage(WM_SPEAKER, VIEW_FILE_AND_DELETE, (LPARAM) new tstring(Text::toT(qi->getTarget())));
}
}
}
/**
* @file
* $Id: MainFrm.cpp,v 1.86 2005/03/19 13:00:53 arnetheduck Exp $
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -