📄 mainfrm.cpp
字号:
tb[n].idCommand = IDC_FINISHED;
tb[n].fsState = TBSTATE_ENABLED;
tb[n].fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE;
n++;
tb[n].iBitmap = bitmap++;
tb[n].idCommand = IDC_FINISHED_UL;
tb[n].fsState = TBSTATE_ENABLED;
tb[n].fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE;
n++;
tb[n].fsStyle = TBSTYLE_SEP;
n++;
tb[n].iBitmap = bitmap++;
tb[n].idCommand = ID_FILE_SEARCH;
tb[n].fsState = TBSTATE_ENABLED;
tb[n].fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE;
n++;
tb[n].iBitmap = bitmap++;
tb[n].idCommand = IDC_FILE_ADL_SEARCH;
tb[n].fsState = TBSTATE_ENABLED;
tb[n].fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE;
n++;
tb[n].iBitmap = bitmap++;
tb[n].idCommand = IDC_SEARCH_SPY;
tb[n].fsState = TBSTATE_ENABLED;
tb[n].fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE;
n++;
tb[n].fsStyle = TBSTYLE_SEP;
n++;
tb[n].iBitmap = bitmap++;
tb[n].idCommand = IDC_OPEN_FILE_LIST;
tb[n].fsState = TBSTATE_ENABLED;
tb[n].fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE;
n++;
tb[n].fsStyle = TBSTYLE_SEP;
n++;
tb[n].iBitmap = bitmap++;
tb[n].idCommand = ID_FILE_SETTINGS;
tb[n].fsState = TBSTATE_ENABLED;
tb[n].fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE;
n++;
tb[n].fsStyle = TBSTYLE_SEP;
n++;
tb[n].iBitmap = bitmap++;
tb[n].idCommand = IDC_NOTEPAD;
tb[n].fsState = TBSTATE_ENABLED;
tb[n].fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE;
ctrlToolbar.SetButtonStructSize();
ctrlToolbar.AddButtons(numButtons, tb);
ctrlToolbar.AutoSize();
return ctrlToolbar.m_hWnd;
}
LRESULT MainFrame::onSpeaker(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
if(wParam == DOWNLOAD_LISTING) {
DirectoryListInfo* i = (DirectoryListInfo*)lParam;
DirectoryListingFrame::openWindow(i->file, i->user);
delete i;
} else if(wParam == BROWSE_LISTING) {
DirectoryBrowseInfo* i = (DirectoryBrowseInfo*)lParam;
DirectoryListingFrame::openWindow(i->user, i->text);
delete i;
} else if(wParam == VIEW_FILE_AND_DELETE) {
tstring* file = (tstring*)lParam;
TextFrame::openWindow(*file);
File::deleteFile(Text::fromT(*file));
delete file;
} else if(wParam == STATS) {
TStringList& str = *(TStringList*)lParam;
if(ctrlStatus.IsWindow()) {
HDC dc = ::GetDC(ctrlStatus.m_hWnd);
bool u = false;
ctrlStatus.SetText(1, str[0].c_str());
for(int i = 1; i < 7; i++) {
int w = WinUtil::getTextWidth(str[i], dc);
if(statusSizes[i] < w) {
statusSizes[i] = w;
u = true;
}
ctrlStatus.SetText(i+1, str[i].c_str());
}
::ReleaseDC(ctrlStatus.m_hWnd, dc);
if(u)
UpdateLayout(TRUE);
}
delete &str;
} else if(wParam == AUTO_CONNECT) {
autoConnect(HubManager::getInstance()->getFavoriteHubs());
} else if(wParam == PARSE_COMMAND_LINE) {
parseCommandLine(GetCommandLine());
} else if(wParam == STATUS_MESSAGE) {
tstring* msg = (tstring*)lParam;
if(ctrlStatus.IsWindow()) {
tstring line = Text::toT("[" + Util::getShortTimeString() + "] ") + *msg;
ctrlStatus.SetText(0, line.c_str());
while(lastLinesList.size() + 1 > MAX_CLIENT_LINES)
lastLinesList.erase(lastLinesList.begin());
if (line.find(_T('\r')) == tstring::npos) {
lastLinesList.push_back(line);
} else {
lastLinesList.push_back(line.substr(0, line.find(_T('\r'))));
}
}
delete msg;
}
return 0;
}
void MainFrame::parseCommandLine(const tstring& cmdLine)
{
string::size_type i = 0;
string::size_type j;
if( (j = cmdLine.find(_T("dchub://"), i)) != string::npos) {
WinUtil::parseDchubUrl(cmdLine.substr(j));
}
if( (j = cmdLine.find(_T("adc://"), i)) != string::npos) {
WinUtil::parseADChubUrl(cmdLine.substr(j));
}
if( (j = cmdLine.find(_T("magnet:?"), i)) != string::npos) {
WinUtil::parseMagnetUri(cmdLine.substr(j));
}
}
LRESULT MainFrame::onCopyData(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) {
tstring cmdLine = (LPCTSTR) (((COPYDATASTRUCT *)lParam)->lpData);
parseCommandLine(Text::toT(Util::getAppName() + " ") + cmdLine);
return true;
}
LRESULT MainFrame::OnFileSearch(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
SearchFrame::openWindow();
return 0;
}
LRESULT MainFrame::onFavorites(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
FavoriteHubsFrame::openWindow();
return 0;
}
LRESULT MainFrame::onHashProgress(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
HashProgressDlg(false).DoModal(m_hWnd);
return 0;
}
LRESULT MainFrame::onFavoriteUsers(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
UsersFrame::openWindow();
return 0;
}
LRESULT MainFrame::onNotepad(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
NotepadFrame::openWindow();
return 0;
}
LRESULT MainFrame::onQueue(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
QueueFrame::openWindow();
return 0;
}
LRESULT MainFrame::OnFileConnect(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
PublicHubsFrame::openWindow();
return 0;
}
LRESULT MainFrame::onSearchSpy(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
SpyFrame::openWindow();
return 0;
}
LRESULT MainFrame::onNetStats(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
StatsFrame::openWindow();
return 0;
}
LRESULT MainFrame::onFileADLSearch(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
ADLSearchFrame::openWindow();
return 0;
}
LRESULT MainFrame::OnAppAbout(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
AboutDlg dlg;
dlg.DoModal(m_hWnd);
return 0;
}
LRESULT MainFrame::OnFileSettings(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
PropertiesDlg dlg(SettingsManager::getInstance());
short lastPort = (short)SETTING(IN_PORT);
short lastUDP = (short)SETTING(UDP_PORT);
int lastConn = SETTING(CONNECTION_TYPE);
if(dlg.DoModal(m_hWnd) == IDOK)
{
SettingsManager::getInstance()->save();
if(missedAutoConnect && !SETTING(NICK).empty()) {
PostMessage(WM_SPEAKER, AUTO_CONNECT);
}
if(SETTING(CONNECTION_TYPE) != lastConn || SETTING(IN_PORT) != lastPort || SETTING(UDP_PORT) != lastUDP) {
startSocket();
}
ClientManager::getInstance()->infoUpdated();
if(BOOLSETTING(URL_HANDLER)) {
WinUtil::registerDchubHandler();
WinUtil::registerADChubHandler();
}
if(BOOLSETTING(URL_MAGNET))
WinUtil::registerMagnetHandler();
}
return 0;
}
void MainFrame::on(HttpConnectionListener::Complete, HttpConnection* /*aConn*/, const string&) throw() {
try {
SimpleXML xml;
xml.fromXML(versionInfo);
xml.stepIn();
string url = Text::fromT(links.homepage);
if(xml.findChild("URL")) {
url = xml.getChildData();
}
xml.resetCurrentChild();
if(xml.findChild("Version")) {
if(atof(xml.getChildData().c_str()) > VERSIONFLOAT) {
xml.resetCurrentChild();
xml.resetCurrentChild();
if(xml.findChild("Title")) {
const string& title = xml.getChildData();
xml.resetCurrentChild();
if(xml.findChild("Message")) {
if(url.empty()) {
const string& msg = xml.getChildData();
MessageBox(Text::toT(msg).c_str(), Text::toT(title).c_str(), MB_OK);
} else {
string msg = xml.getChildData() + "\r\n" + STRING(OPEN_DOWNLOAD_PAGE);
if(MessageBox(Text::toT(msg).c_str(), Text::toT(title).c_str(), MB_YESNO) == IDYES) {
WinUtil::openLink(Text::toT(url));
}
}
}
}
} else {
xml.resetCurrentChild();
if(xml.findChild("VeryOldVersion")) {
if(atof(xml.getChildData().c_str()) >= VERSIONFLOAT) {
string msg = xml.getChildAttrib("Message", "Your version of DC++ contains a serious bug that affects all users of the DC network or the security of your computer.");
MessageBox(Text::toT(msg + "\r\nPlease get a new one at " + url).c_str());
oldshutdown = true;
PostMessage(WM_CLOSE);
}
}
}
xml.resetCurrentChild();
if(xml.findChild("BadVersions")) {
xml.stepIn();
while(xml.findChild("BadVersion")) {
double v = atof(xml.getChildAttrib("Version").c_str());
if(v == VERSIONFLOAT) {
string msg = xml.getChildAttrib("Message", "Your version of DC++ contains a serious bug that affects all users of the DC network or the security of your computer.");
MessageBox(Text::toT(msg + "\r\nPlease get a new one at " + url).c_str(), _T("Bad DC++ version"), MB_OK | MB_ICONEXCLAMATION);
oldshutdown = true;
PostMessage(WM_CLOSE);
}
}
xml.stepOut();
}
xml.resetCurrentChild();
if(xml.findChild("Links")) {
xml.stepIn();
if(xml.findChild("Homepage")) {
links.homepage = Text::toT(xml.getChildData());
}
xml.resetCurrentChild();
if(xml.findChild("Downloads")) {
links.downloads = Text::toT(xml.getChildData());
}
xml.resetCurrentChild();
if(xml.findChild("Translations")) {
links.translations = Text::toT(xml.getChildData());
}
xml.resetCurrentChild();
if(xml.findChild("Faq")) {
links.faq = Text::toT(xml.getChildData());
}
xml.resetCurrentChild();
if(xml.findChild("Bugs")) {
links.bugs = Text::toT(xml.getChildData());
}
xml.resetCurrentChild();
if(xml.findChild("Features")) {
links.features = Text::toT(xml.getChildData());
}
xml.resetCurrentChild();
if(xml.findChild("Help")) {
links.help = Text::toT(xml.getChildData());
}
xml.resetCurrentChild();
if(xml.findChild("Forum")) {
links.discuss = Text::toT(xml.getChildData());
}
xml.stepOut();
}
}
xml.stepOut();
} catch (const Exception&) {
// ...
}
}
LRESULT MainFrame::onServerSocket(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) {
ConnectionManager::getInstance()->getServerSocket().incoming();
return 0;
}
LRESULT MainFrame::onHelp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) {
HtmlHelp(m_hWnd, WinUtil::getHelpFile().c_str(), HH_DISPLAY_TOC, NULL);
bHandled = TRUE;
return 0;
}
LRESULT MainFrame::onMenuHelp(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& bHandled) {
UINT action = (wID == IDC_HELP_CONTENTS) ? HH_DISPLAY_TOC : HH_HELP_CONTEXT;
HtmlHelp(m_hWnd, WinUtil::getHelpFile().c_str(), action, wID);
bHandled = TRUE;
return 0;
}
LRESULT MainFrame::onGetToolTip(int idCtrl, LPNMHDR pnmh, BOOL& /*bHandled*/) {
LPNMTTDISPINFO pDispInfo = (LPNMTTDISPINFO)pnmh;
pDispInfo->szText[0] = 0;
if((idCtrl != 0) && !(pDispInfo->uFlags & TTF_IDISHWND))
{
int stringId = -1;
switch(idCtrl) {
case ID_FILE_CONNECT: stringId = ResourceManager::MENU_PUBLIC_HUBS; break;
case ID_FILE_RECONNECT: stringId = ResourceManager::MENU_RECONNECT; break;
case IDC_FOLLOW: stringId = ResourceManager::MENU_FOLLOW_REDIRECT; break;
case IDC_FAVORITES: stringId = ResourceManager::MENU_FAVORITE_HUBS; break;
case IDC_FAVUSERS: stringId = ResourceManager::MENU_FAVORITE_USERS; break;
case IDC_QUEUE: stringId = ResourceManager::MENU_DOWNLOAD_QUEUE; break;
case IDC_FINISHED: stringId = ResourceManager::FINISHED_DOWNLOADS; break;
case IDC_FINISHED_UL: stringId = ResourceManager::FINISHED_UPLOADS; break;
case ID_FILE_SEARCH: stringId = ResourceManager::MENU_SEARCH; break;
case IDC_FILE_ADL_SEARCH: stringId = ResourceManager::MENU_ADL_SEARCH; break;
case IDC_SEARCH_SPY: stringId = ResourceManager::MENU_SEARCH_SPY; break;
case IDC_OPEN_FILE_LIST: stringId = ResourceManager::MENU_OPEN_FILE_LIST; break;
case ID_FILE_SETTINGS: stringId = ResourceManager::MENU_SETTINGS; break;
case IDC_NOTEPAD: stringId = ResourceManager::MENU_NOTEPAD; break;
}
if(stringId != -1) {
_tcsncpy(pDispInfo->lpszText, CTSTRING_I((ResourceManager::Strings)stringId), 79);
pDispInfo->uFlags |= TTF_DI_SETITEM;
}
} else { // if we're really in the status bar, this should be detected intelligently
lastLines.clear();
for(TStringIter i = lastLinesList.begin(); i != lastLinesList.end(); ++i) {
lastLines += *i;
lastLines += _T("\r\n");
}
if(lastLines.size() > 2) {
lastLines.erase(lastLines.size() - 2);
}
pDispInfo->lpszText = const_cast<TCHAR*>(lastLines.c_str());
}
return 0;
}
void MainFrame::autoConnect(const FavoriteHubEntry::List& fl) {
missedAutoConnect = false;
for(FavoriteHubEntry::List::const_iterator i = fl.begin(); i != fl.end(); ++i) {
FavoriteHubEntry* entry = *i;
if(entry->getConnect()) {
if(!entry->getNick().empty() || !SETTING(NICK).empty())
HubFrame::openWindow(Text::toT(entry->getServer()));
else
missedAutoConnect = true;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -