📄 searchfrm.cpp
字号:
if(uc.getType() == UserCommand::TYPE_RAW_ONCE) {
if(users.find(sr->getUser()->getCID()) != users.end())
continue;
users.insert(sr->getUser()->getCID());
}
ucParams["fileFN"] = sr->getFile();
ucParams["fileSI"] = Util::toString(sr->getSize());
ucParams["fileSIshort"] = Util::formatBytes(sr->getSize());
if(sr->getTTH() != NULL) {
ucParams["fileTR"] = sr->getTTH()->toBase32();
} else {
ucParams["fileTR"] = "NONE";
}
// compatibility with 0.674 and earlier
ucParams["file"] = ucParams["fileFN"];
ucParams["filesize"] = ucParams["fileSI"];
ucParams["filesizeshort"] = ucParams["fileSIshort"];
ucParams["tth"] = ucParams["fileTR"];
StringMap tmp = ucParams;
ClientManager::getInstance()->userCommand(sr->getUser(), uc, tmp, true);
}
}
LRESULT SearchFrame::onCtlColor(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
HWND hWnd = (HWND)lParam;
HDC hDC = (HDC)wParam;
if(hWnd == searchLabel.m_hWnd || hWnd == sizeLabel.m_hWnd || hWnd == optionLabel.m_hWnd || hWnd == typeLabel.m_hWnd
|| hWnd == hubsLabel.m_hWnd || hWnd == ctrlSlots.m_hWnd || hWnd == ctrlTTH.m_hWnd) {
::SetBkColor(hDC, ::GetSysColor(COLOR_3DFACE));
::SetTextColor(hDC, ::GetSysColor(COLOR_BTNTEXT));
return (LRESULT)::GetSysColorBrush(COLOR_3DFACE);
} else {
::SetBkColor(hDC, WinUtil::bgColor);
::SetTextColor(hDC, WinUtil::textColor);
return (LRESULT)WinUtil::bgBrush;
}
}
LRESULT SearchFrame::onChar(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) {
switch(wParam) {
case VK_TAB:
if(uMsg == WM_KEYDOWN) {
onTab(WinUtil::isShift());
}
break;
case VK_RETURN:
if( WinUtil::isShift() || WinUtil::isCtrl() || WinUtil::isAlt() ) {
bHandled = FALSE;
} else {
if(uMsg == WM_KEYDOWN) {
onEnter();
}
}
break;
default:
bHandled = FALSE;
}
return 0;
}
void SearchFrame::onTab(bool shift) {
HWND wnds[] = {
ctrlSearch.m_hWnd, ctrlPurge.m_hWnd, ctrlMode.m_hWnd, ctrlSize.m_hWnd, ctrlSizeMode.m_hWnd,
ctrlFiletype.m_hWnd, ctrlSlots.m_hWnd, ctrlTTH.m_hWnd, ctrlDoSearch.m_hWnd, ctrlSearch.m_hWnd,
ctrlResults.m_hWnd
};
HWND focus = GetFocus();
if(focus == ctrlSearchBox.m_hWnd)
focus = ctrlSearch.m_hWnd;
static const int size = sizeof(wnds) / sizeof(wnds[0]);
int i;
for(i = 0; i < size; i++) {
if(wnds[i] == focus)
break;
}
::SetFocus(wnds[(i + (shift ? -1 : 1)) % size]);
}
LRESULT SearchFrame::onSearchByTTH(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlResults.GetSelectedCount() == 1) {
int i = ctrlResults.GetNextItem(-1, LVNI_SELECTED);
SearchResult* sr = ctrlResults.getItemData(i)->sr;
if(sr->getTTH() != NULL) {
WinUtil::searchHash(sr->getTTH());
}
}
return 0;
}
LRESULT SearchFrame::onBitziLookup(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlResults.GetSelectedCount() == 1) {
int i = ctrlResults.GetNextItem(-1, LVNI_SELECTED);
SearchResult* sr = ctrlResults.getItemData(i)->sr;
WinUtil::bitziLink(sr->getTTH());
}
return 0;
}
LRESULT SearchFrame::onCopyMagnet(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlResults.GetSelectedCount() == 1) {
int i = ctrlResults.GetNextItem(-1, LVNI_SELECTED);
SearchResult* sr = ctrlResults.getItemData(i)->sr;
WinUtil::copyMagnet(sr->getTTH(), Text::toT(sr->getFileName()));
}
return 0;
}
LRESULT SearchFrame::onSpeaker(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
switch(wParam) {
case ADD_RESULT:
{
SearchInfo* si = (SearchInfo*)lParam;
SearchResult* sr = si->sr;
// Check previous search results for dupes
for(int i = 0, j = ctrlResults.GetItemCount(); i < j; ++i) {
SearchInfo* si2 = ctrlResults.getItemData(i);
SearchResult* sr2 = si2->sr;
if((sr->getUser()->getCID() == sr2->getUser()->getCID()) && (sr->getFile() == sr2->getFile())) {
delete si;
return 0;
}
}
int image = sr->getType() == SearchResult::TYPE_FILE ? WinUtil::getIconIndex(Text::toT(sr->getFile())) : WinUtil::getDirIconIndex();
ctrlResults.insertItem(si, image);
ctrlStatus.SetText(2, Text::toT(Util::toString(ctrlResults.GetItemCount()) + ' ' + STRING(ITEMS)).c_str());
if (BOOLSETTING(BOLD_SEARCH)) {
setDirty();
}
}
break;
case FILTER_RESULT:
ctrlStatus.SetText(3, Text::toT(Util::toString(droppedResults) + ' ' + STRING(FILTERED)).c_str());
break;
case HUB_ADDED:
onHubAdded((HubInfo*)(lParam));
break;
case HUB_CHANGED:
onHubChanged((HubInfo*)(lParam));
break;
case HUB_REMOVED:
onHubRemoved((HubInfo*)(lParam));
break;
}
return 0;
}
LRESULT SearchFrame::onContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
if (reinterpret_cast<HWND>(wParam) == ctrlResults && ctrlResults.GetSelectedCount() > 0) {
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
if(pt.x == -1 && pt.y == -1) {
WinUtil::getContextMenuPos(ctrlResults, pt);
}
while(targetMenu.GetMenuItemCount() > 0) {
targetMenu.DeleteMenu(0, MF_BYPOSITION);
}
while(targetDirMenu.GetMenuItemCount() > 0) {
targetDirMenu.DeleteMenu(0, MF_BYPOSITION);
}
int n = 0;
//Append favorite download dirs
StringPairList spl = FavoriteManager::getInstance()->getFavoriteDirs();
if (spl.size() > 0) {
for(StringPairIter i = spl.begin(); i != spl.end(); i++) {
targetMenu.AppendMenu(MF_STRING, IDC_DOWNLOAD_FAVORITE_DIRS + n, Text::toT(i->second).c_str());
n++;
}
targetMenu.AppendMenu(MF_SEPARATOR);
}
n = 0;
targetMenu.AppendMenu(MF_STRING, IDC_DOWNLOADTO, CTSTRING(BROWSE));
if(WinUtil::lastDirs.size() > 0) {
targetMenu.AppendMenu(MF_SEPARATOR);
for(TStringIter i = WinUtil::lastDirs.begin(); i != WinUtil::lastDirs.end(); ++i) {
targetMenu.AppendMenu(MF_STRING, IDC_DOWNLOAD_TARGET + n, i->c_str());
n++;
}
}
SearchInfo::CheckSize cs = ctrlResults.forEachSelectedT(SearchInfo::CheckSize());
if(cs.size != -1 || cs.hasTTH) {
targets.clear();
if(cs.hasTTH) {
QueueManager::getInstance()->getTargetsByRoot(targets, TTHValue(Text::fromT(cs.tth)));
} else {
QueueManager::getInstance()->getTargetsBySize(targets, cs.size, Text::fromT(cs.ext));
}
if(targets.size() > 0) {
targetMenu.AppendMenu(MF_SEPARATOR);
for(StringIter i = targets.begin(); i != targets.end(); ++i) {
targetMenu.AppendMenu(MF_STRING, IDC_DOWNLOAD_TARGET + n, Text::toT(*i).c_str());
n++;
}
}
}
n = 0;
//Append favorite download dirs
if (spl.size() > 0) {
for(StringPairIter i = spl.begin(); i != spl.end(); ++i) {
targetDirMenu.AppendMenu(MF_STRING, IDC_DOWNLOAD_WHOLE_FAVORITE_DIRS + n, Text::toT(i->second).c_str());
n++;
}
targetDirMenu.AppendMenu(MF_SEPARATOR);
}
n = 0;
targetDirMenu.AppendMenu(MF_STRING, IDC_DOWNLOADDIRTO, CTSTRING(BROWSE));
if(WinUtil::lastDirs.size() > 0) {
targetDirMenu.AppendMenu(MF_SEPARATOR);
for(TStringIter i = WinUtil::lastDirs.begin(); i != WinUtil::lastDirs.end(); ++i) {
targetDirMenu.AppendMenu(MF_STRING, IDC_DOWNLOAD_WHOLE_TARGET + n, i->c_str());
n++;
}
}
int i = ctrlResults.GetNextItem(-1, LVNI_SELECTED);
SearchResult* sr = ctrlResults.getItemData(i)->sr;
if (ctrlResults.GetSelectedCount() == 1 && sr->getTTH() != NULL) {
resultsMenu.EnableMenuItem(IDC_SEARCH_ALTERNATES, MFS_ENABLED);
resultsMenu.EnableMenuItem(IDC_BITZI_LOOKUP, MFS_ENABLED);
resultsMenu.EnableMenuItem(IDC_COPY_MAGNET, MFS_ENABLED);
} else {
resultsMenu.EnableMenuItem(IDC_SEARCH_ALTERNATES, MFS_GRAYED);
resultsMenu.EnableMenuItem(IDC_BITZI_LOOKUP, MFS_GRAYED);
resultsMenu.EnableMenuItem(IDC_COPY_MAGNET, MFS_GRAYED);
}
prepareMenu(resultsMenu, UserCommand::CONTEXT_SEARCH, cs.hubs);
checkAdcItems(resultsMenu);
resultsMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
cleanMenu(resultsMenu);
return TRUE;
}
bHandled = FALSE;
return FALSE;
}
void SearchFrame::initHubs() {
ctrlHubs.insertItem(new HubInfo(Util::emptyStringT, TSTRING(ONLY_WHERE_OP), false), 0);
ctrlHubs.SetCheckState(0, false);
ClientManager* clientMgr = ClientManager::getInstance();
clientMgr->lock();
clientMgr->addListener(this);
Client::List& clients = clientMgr->getClients();
Client::List::iterator it;
Client::List::iterator endIt = clients.end();
for(it = clients.begin(); it != endIt; ++it) {
Client* client = *it;
if (!client->isConnected())
continue;
onHubAdded(new HubInfo(Text::toT(client->getHubUrl()), Text::toT(client->getHubName()), client->getMyIdentity().isOp()));
}
clientMgr->unlock();
ctrlHubs.SetColumnWidth(0, LVSCW_AUTOSIZE);
}
void SearchFrame::onHubAdded(HubInfo* info) {
int nItem = ctrlHubs.insertItem(info, 0);
ctrlHubs.SetCheckState(nItem, (ctrlHubs.GetCheckState(0) ? info->op : true));
ctrlHubs.SetColumnWidth(0, LVSCW_AUTOSIZE);
}
void SearchFrame::onHubChanged(HubInfo* info) {
int nItem = 0;
int n = ctrlHubs.GetItemCount();
for(; nItem < n; nItem++) {
if(ctrlHubs.getItemData(nItem)->url == info->url)
break;
}
if (nItem == n)
return;
delete ctrlHubs.getItemData(nItem);
ctrlHubs.SetItemData(nItem, (DWORD_PTR)info);
ctrlHubs.updateItem(nItem);
if (ctrlHubs.GetCheckState(0))
ctrlHubs.SetCheckState(nItem, info->op);
ctrlHubs.SetColumnWidth(0, LVSCW_AUTOSIZE);
}
void SearchFrame::onHubRemoved(HubInfo* info) {
int nItem = 0;
int n = ctrlHubs.GetItemCount();
for(; nItem < n; nItem++) {
if(ctrlHubs.getItemData(nItem)->url == info->url)
break;
}
if (nItem == n)
return;
delete ctrlHubs.getItemData(nItem);
ctrlHubs.DeleteItem(nItem);
ctrlHubs.SetColumnWidth(0, LVSCW_AUTOSIZE);
}
LRESULT SearchFrame::onGetList(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
ctrlResults.forEachSelected(&SearchInfo::getList);
return 0;
}
LRESULT SearchFrame::onBrowseList(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
ctrlResults.forEachSelected(&SearchInfo::browseList);
return 0;
}
LRESULT SearchFrame::onItemChangedHub(int /* idCtrl */, LPNMHDR pnmh, BOOL& /* bHandled */) {
NMLISTVIEW* lv = (NMLISTVIEW*)pnmh;
if(lv->iItem == 0 && (lv->uNewState ^ lv->uOldState) & LVIS_STATEIMAGEMASK) {
if (((lv->uNewState & LVIS_STATEIMAGEMASK) >> 12) - 1) {
for(int iItem = 0; (iItem = ctrlHubs.GetNextItem(iItem, LVNI_ALL)) != -1; ) {
HubInfo* client = ctrlHubs.getItemData(iItem);
if (!client->op)
ctrlHubs.SetCheckState(iItem, false);
}
}
}
return 0;
}
LRESULT SearchFrame::onPurge(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
ctrlSearchBox.ResetContent();
lastSearches.clear();
return 0;
}
void SearchFrame::SearchInfo::update() {
if(sr->getType() == SearchResult::TYPE_FILE) {
if(sr->getFile().rfind(_T('\\')) == tstring::npos) {
columns[COLUMN_FILENAME] = Text::toT(sr->getUtf8() ? sr->getFile() : Text::acpToUtf8(sr->getFile()));
} else {
columns[COLUMN_FILENAME] = Text::toT(Util::getFileName(sr->getUtf8() ? sr->getFile() : Text::acpToUtf8(sr->getFile())));
columns[COLUMN_PATH] = Text::toT(Util::getFilePath(sr->getUtf8() ? sr->getFile() : Text::acpToUtf8(sr->getFile())));
}
columns[COLUMN_TYPE] = Text::toT(Util::getFileExt(Text::fromT(columns[COLUMN_FILENAME])));
if(!columns[COLUMN_TYPE].empty() && columns[COLUMN_TYPE][0] == _T('.'))
columns[COLUMN_TYPE].erase(0, 1);
columns[COLUMN_SIZE] = Text::toT(Util::formatBytes(sr->getSize()));
columns[COLUMN_EXACT_SIZE] = Text::toT(Util::formatExactSize(sr->getSize()));
} else {
columns[COLUMN_FILENAME] = Text::toT(sr->getUtf8() ? sr->getFileName() : Text::acpToUtf8(sr->getFileName()));
columns[COLUMN_PATH] = Text::toT(sr->getUtf8() ? sr->getFile() : Text::acpToUtf8(sr->getFile()));
columns[COLUMN_TYPE] = TSTRING(DIRECTORY);
if(sr->getSize() > 0) {
columns[COLUMN_SIZE] = Text::toT(Util::formatBytes(sr->getSize()));
columns[COLUMN_EXACT_SIZE] = Text::toT(Util::formatExactSize(sr->getSize()));
}
}
columns[COLUMN_NICK] = WinUtil::getNicks(sr->getUser());
columns[COLUMN_CONNECTION] = Text::toT(ClientManager::getInstance()->getConnection(sr->getUser()->getCID()));
columns[COLUMN_HUB] = Text::toT(sr->getHubName());
columns[COLUMN_SLOTS] = Text::toT(sr->getSlotString());
columns[COLUMN_IP] = Text::toT(sr->getIP());
if (!columns[COLUMN_IP].empty()) {
// Only attempt to grab a country mapping if we actually have an IP address
tstring tmpCountry = Text::toT(Util::getIpCountry(sr->getIP()));
if(!tmpCountry.empty())
columns[COLUMN_IP] = tmpCountry + _T(" (") + columns[COLUMN_IP] + _T(")");
}
if(sr->getTTH() != NULL) {
columns[COLUMN_TTH] = Text::toT(sr->getTTH()->toBase32());
}
columns[COLUMN_CID] = Text::toT(sr->getUser()->getCID().toBase32());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -