📄 searchfrm.cpp
字号:
LRESULT SearchFrame::onColumnClickResults(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) {
NMLISTVIEW* l = (NMLISTVIEW*)pnmh;
if(l->iSubItem == ctrlResults.getSortColumn()) {
ctrlResults.setSortDirection(!ctrlResults.getSortDirection());
} else {
if( (l->iSubItem == COLUMN_SIZE) || (l->iSubItem == COLUMN_EXACT_SIZE) ) {
ctrlResults.setSort(l->iSubItem, ExListViewCtrl::SORT_FUNC, true, sortSize);
} else if(l->iSubItem == COLUMN_SLOTS) {
ctrlResults.setSort(l->iSubItem, ExListViewCtrl::SORT_FUNC, true, sortSlots);
} else {
ctrlResults.setSort(l->iSubItem, ExListViewCtrl::SORT_STRING_NOCASE);
}
}
return 0;
}
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, ctrlMode.m_hWnd, ctrlSize.m_hWnd, ctrlSizeMode.m_hWnd,
ctrlFiletype.m_hWnd, ctrlSlots.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::onSpeaker(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
SearchResult* sr = (SearchResult*)lParam;
// Check previous search results for dupes
for(int i = 0, j = ctrlResults.GetItemCount(); i < j; ++i) {
SearchResult* sr2 = (SearchResult*)ctrlResults.GetItemData(i);
if((sr->getUser()->getNick() == sr2->getUser()->getNick()) && (sr->getFile() == sr2->getFile())) {
delete (StringList*)wParam;
delete sr;
return 0;
}
}
#if 0
int image = 0;
const string& tmp = sr->getUser()->getConnection();
if( (tmp == SettingsManager::connectionSpeeds[SettingsManager::SPEED_288K]) ||
(tmp == SettingsManager::connectionSpeeds[SettingsManager::SPEED_576K]) ||
(tmp == SettingsManager::connectionSpeeds[SettingsManager::SPEED_SATELLITE]) ||
(tmp == SettingsManager::connectionSpeeds[SettingsManager::SPEED_ISDN]) ) {
image = 1;
} else if( (tmp == SettingsManager::connectionSpeeds[SettingsManager::SPEED_CABLE]) ||
(tmp == SettingsManager::connectionSpeeds[SettingsManager::SPEED_DSL]) ) {
image = 2;
} else if( (tmp == SettingsManager::connectionSpeeds[SettingsManager::SPEED_T1]) ||
(tmp == SettingsManager::connectionSpeeds[SettingsManager::SPEED_T3]) ) {
image = 3;
}
#endif
int image = sr->getType() == SearchResult::TYPE_FILE ? WinUtil::getIconIndex(sr->getFile()) : WinUtil::getDirIconIndex();
ctrlResults.insert(*(StringList*)wParam, image, lParam);
// ctrlResults.SetItemState(i, INDEXTOOVERLAYMASK(image), LVIS_OVERLAYMASK)
delete (StringList*)wParam;
return 0;
}
LRESULT SearchFrame::onContextMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) {
RECT rc; // client area of window
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; // location of mouse click
// Get the bounding rectangle of the client area.
ctrlResults.GetClientRect(&rc);
ctrlResults.ScreenToClient(&pt);
int64_t cmpSize;
bool op = true;
string oneHub;
if (PtInRect(&rc, pt) && ctrlResults.GetSelectedCount() > 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;
targetDirMenu.AppendMenu(MF_STRING, IDC_DOWNLOADTO, CSTRING(BROWSE));
if(WinUtil::lastDirs.size() > 0) {
targetDirMenu.AppendMenu(MF_SEPARATOR, 0, (LPCTSTR)NULL);
for(StringIter i = WinUtil::lastDirs.begin(); i != WinUtil::lastDirs.end(); ++i) {
targetDirMenu.AppendMenu(MF_STRING, IDC_DOWNLOAD_WHOLE_TARGET + n, i->c_str());
n++;
}
n = 0;
}
if(ctrlResults.GetSelectedCount() == 1) {
targetMenu.AppendMenu(MF_STRING, IDC_DOWNLOADTO, CSTRING(BROWSE));
int pos = ctrlResults.GetNextItem(-1, LVNI_SELECTED);
dcassert(pos != -1);
SearchResult* sr = (SearchResult*)ctrlResults.GetItemData(pos);
if(sr->getType() == SearchResult::TYPE_FILE) {
targets = QueueManager::getInstance()->getTargetsBySize(sr->getSize(), Util::getExtension(sr->getFile()));
if(targets.size() > 0) {
targetMenu.AppendMenu(MF_SEPARATOR, 0, (LPCTSTR)NULL);
for(StringIter i = targets.begin(); i != targets.end(); ++i) {
targetMenu.AppendMenu(MF_STRING, IDC_DOWNLOAD_TARGET + n, i->c_str());
n++;
}
}
} else {
// Keep on counting on recent dirs
if(WinUtil::lastDirs.size() > 0) {
targetMenu.AppendMenu(MF_SEPARATOR, 0, (LPCTSTR)NULL);
for(StringIter i = WinUtil::lastDirs.begin(); i != WinUtil::lastDirs.end(); ++i) {
targetMenu.AppendMenu(MF_STRING, IDC_DOWNLOAD_TARGET + n, i->c_str());
n++;
}
}
}
op = sr->getUser()->isClientOp();
oneHub = sr->getUser()->getClientServer();
} else if(ctrlResults.GetSelectedCount() > 1) {
targetMenu.AppendMenu(MF_STRING, IDC_DOWNLOADTO, CSTRING(BROWSE));
// Keep on counting on recent dirs
if(WinUtil::lastDirs.size() > 0) {
targetMenu.AppendMenu(MF_SEPARATOR, 0, (LPCTSTR)NULL);
for(StringIter i = WinUtil::lastDirs.begin(); i != WinUtil::lastDirs.end(); ++i) {
targetMenu.AppendMenu(MF_STRING, IDC_DOWNLOAD_TARGET + n, i->c_str());
n++;
}
}
cmpSize = 0;
string ext;
int pos = -1;
while( (pos = ctrlResults.GetNextItem(pos, LVNI_SELECTED)) != -1) {
SearchResult* sr = (SearchResult*)ctrlResults.GetItemData(pos);
if(sr->getType() == SearchResult::TYPE_DIRECTORY) {
cmpSize = 0;
break;
}
if (cmpSize == 0) {
if(ext.empty()) {
ext = Util::getExtension(sr->getFile());
}
if(Util::stricmp(ext, Util::getExtension(sr->getFile())) == 0) {
cmpSize = sr->getSize();
} else {
cmpSize = 0;
break;
}
} else if(cmpSize != sr->getSize() || Util::stricmp(ext, Util::getExtension(sr->getFile())) != 0) {
cmpSize = 0;
break;
}
}
if(cmpSize != 0) {
// All selected files are same size, see if we have a match in queue
targets = QueueManager::getInstance()->getTargetsBySize(cmpSize, ext);
if(targets.size() > 0) {
targetMenu.AppendMenu(MF_SEPARATOR, 0, (LPCTSTR)NULL);
for(StringIter i = targets.begin(); i != targets.end(); ++i) {
targetMenu.AppendMenu(MF_STRING, IDC_DOWNLOAD_TARGET + n, i->c_str());
n++;
}
}
}
pos = -1;
bool one = true;
while( (pos = ctrlResults.GetNextItem(pos, LVNI_SELECTED)) != -1) {
SearchResult* sr = (SearchResult*) ctrlResults.GetItemData(pos);
if(!sr->getUser()->isClientOp()) {
op = false;
break;
}
if(one) {
if(oneHub.empty()) {
oneHub = sr->getUser()->getClientServer();
} else {
if(Util::stricmp(sr->getUser()->getClientServer(), oneHub) != 0) {
oneHub.clear();
one = false;
}
}
}
}
}
if(op) {
// Alrite, now add the special menu items...
int added = 0;
int n = 0;
UserCommand::List& ul = HubManager::getInstance()->getUserCommands();
for(UserCommand::Iter ui = ul.begin(); ui != ul.end(); ++ui) {
UserCommand& uc = *ui;
if(uc.getHub().empty() || uc.getHub() == "op" ||
Util::stricmp(uc.getHub(), oneHub) == 0) {
// We add!
if(added == 0) {
opMenu.AppendMenu(MF_SEPARATOR, 0, (LPCTSTR)0);
added++;
}
opMenu.AppendMenu(MF_STRING, IDC_USER_COMMAND+n, uc.getName().c_str());
added++;
}
n++;
}
commands = ul.size();
opMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
while(added > 0) {
opMenu.DeleteMenu(opMenu.GetMenuItemCount()-1, MF_BYPOSITION);
added--;
}
} else {
int added = 0;
int n = 0;
UserCommand::List& ul = HubManager::getInstance()->getUserCommands();
for(UserCommand::Iter ui = ul.begin(); ui != ul.end(); ++ui) {
UserCommand& uc = *ui;
if(uc.getHub().empty() ||
Util::stricmp(uc.getHub(), oneHub) == 0) {
// We add!
if(added == 0) {
resultsMenu.AppendMenu(MF_SEPARATOR, 0, (LPCTSTR)0);
added++;
}
resultsMenu.AppendMenu(MF_STRING, IDC_USER_COMMAND+n, uc.getName().c_str());
added++;
}
n++;
}
commands = ul.size();
resultsMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
while(added > 0) {
resultsMenu.DeleteMenu(resultsMenu.GetMenuItemCount()-1, MF_BYPOSITION);
added--;
}
}
return TRUE;
}
return FALSE;
}
LRESULT SearchFrame::onDownloadTarget(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
int newId = wID - IDC_DOWNLOAD_TARGET;
dcassert(newId >= 0);
if(ctrlResults.GetSelectedCount() == 1) {
int i = ctrlResults.GetNextItem(-1, LVNI_SELECTED);
dcassert(i != -1);
SearchResult* sr = (SearchResult*)ctrlResults.GetItemData(i);
try {
if(sr->getType() == SearchResult::TYPE_FILE) {
dcassert(newId < (int)targets.size());
QueueManager::getInstance()->add(sr->getFile(), sr->getSize(), sr->getUser(), targets[newId]);
} else {
dcassert(sr->getType() == SearchResult::TYPE_DIRECTORY);
dcassert(newId < (int)WinUtil::lastDirs.size());
QueueManager::getInstance()->addDirectory(sr->getFile(), sr->getUser(), WinUtil::lastDirs[newId]);
}
} catch(const Exception& e) {
ctrlStatus.SetText(1, e.getError().c_str());
}
} else if(ctrlResults.GetSelectedCount() > 1) {
if(newId < (int)WinUtil::lastDirs.size()) {
//Original Handler
downloadSelected(WinUtil::lastDirs[newId]);
} else {
newId -= WinUtil::lastDirs.size();
//Add all files as alternates to selected file
int pos = -1;
while( (pos = ctrlResults.GetNextItem(pos, LVNI_SELECTED)) != -1) {
SearchResult* sr = (SearchResult*)ctrlResults.GetItemData(pos);
dcassert(sr->getType() == SearchResult::TYPE_FILE);
try {
dcassert((newId < (int)targets.size()) && (newId >= 0));
QueueManager::getInstance()->add(sr->getFile(), sr->getSize(), sr->getUser(), targets[newId]);
} catch(const Exception& e) {
ctrlStatus.SetText(1, e.getError().c_str());
}
}
}
}
return 0;
}
LRESULT SearchFrame::onDownloadWholeTarget(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
dcassert((wID-IDC_DOWNLOAD_WHOLE_TARGET) < (int)WinUtil::lastDirs.size());
downloadWholeSelected(WinUtil::lastDirs[wID-IDC_DOWNLOAD_WHOLE_TARGET]);
return 0;
}
/**
* @file
* $Id: SearchFrm.cpp,v 1.21 2003/07/15 14:53:12 arnetheduck Exp $
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -