📄 searchfrm.cpp
字号:
if(hWnd != NULL && !ctrlSearch.IsWindow() && hWnd != ctrlSearchBox.m_hWnd) {
ctrlSearch.Attach(hWnd);
searchContainer.SubclassWindow(ctrlSearch.m_hWnd);
}
}
void SearchFrame::runUserCommand(UserCommand& uc) {
if(!WinUtil::getUCParams(m_hWnd, uc, ucParams))
return;
set<User::Ptr> nicks;
int sel = -1;
while((sel = ctrlResults.GetNextItem(sel, LVNI_SELECTED)) != -1) {
SearchResult* sr = ctrlResults.getItemData(sel)->sr;
if(uc.getType() == UserCommand::TYPE_RAW_ONCE) {
if(nicks.find(sr->getUser()) != nicks.end())
continue;
nicks.insert(sr->getUser());
}
if(!sr->getUser()->isOnline())
return;
ucParams["mynick"] = sr->getUser()->getClientNick();
ucParams["mycid"] = sr->getUser()->getClientCID().toBase32();
ucParams["file"] = sr->getFile();
ucParams["filesize"] = Util::toString(sr->getSize());
ucParams["filesizeshort"] = Util::formatBytes(sr->getSize());
if(sr->getTTH() != NULL) {
ucParams["tth"] = sr->getTTH()->toBase32();
}
StringMap tmp = ucParams;
sr->getUser()->getParams(tmp);
sr->getUser()->clientEscapeParams(tmp);
sr->getUser()->sendUserCmd(Util::formatParams(uc.getCommand(), tmp));
}
return;
};
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((GetKeyState(VK_SHIFT) & 0x8000) > 0);
}
break;
case VK_RETURN:
if( (GetKeyState(VK_SHIFT) & 0x8000) ||
(GetKeyState(VK_CONTROL) & 0x8000) ||
(GetKeyState(VK_MENU) & 0x8000) ) {
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()->getNick() == sr2->getUser()->getNick()) && (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(TAB_DIRTY)) {
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 ((HWND)wParam == ctrlResults && ctrlResults.GetSelectedCount() > 0) {
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
if(pt.x < 0 || pt.y < 0) {
pt.x = pt.y = 0;
ctrlResults.ClientToScreen(&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 = HubManager::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.hub, cs.op);
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->getIpPort()), Text::toT(client->getName()), client->getOp()));
}
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)->ipPort == info->ipPort)
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)->ipPort == info->ipPort)
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*/)
{
while(ctrlSearchBox.GetCount() > 0){
ctrlSearchBox.DeleteString(0);
}
return 0;
}
/**
* @file
* $Id: SearchFrm.cpp,v 1.89 2005/03/19 17:59:26 arnetheduck Exp $
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -