📄 searchfrm.cpp
字号:
_stprintf(buf, CTSTRING(SEARCHING_WAIT), waitFor);
ctrlStatus.SetText(1, buf);
SetWindowText((TSTRING(SEARCH) + _T(" - ") + tstring(buf)).c_str());
} else {
if(timerID != 0) {
KillTimer(timerID);
timerID = 0;
}
ctrlStatus.SetText(1, (TSTRING(SEARCHING_READY)).c_str());
SetWindowText((TSTRING(SEARCH) + _T(" - ") + TSTRING(SEARCHING_READY)).c_str());
}
ctrlStatus.SetText(2, _T(""));
ctrlStatus.SetText(3, _T(""));
return 0;
}
void SearchFrame::SearchInfo::view() {
try {
if(sr->getType() == SearchResult::TYPE_FILE) {
QueueManager::getInstance()->add(Util::getTempPath() + Text::fromT(columns[COLUMN_FILENAME]),
sr->getSize(), sr->getTTH(), sr->getUser(), sr->getFile(),
sr->getUtf8(), QueueItem::FLAG_CLIENT_VIEW | QueueItem::FLAG_TEXT);
}
} catch(const Exception&) {
}
}
void SearchFrame::SearchInfo::Download::operator()(SearchInfo* si) {
try {
if(si->sr->getType() == SearchResult::TYPE_FILE) {
string target = Text::fromT(tgt + si->columns[COLUMN_FILENAME]);
QueueManager::getInstance()->add(target, si->sr->getSize(),
si->sr->getTTH(), si->sr->getUser(), si->sr->getFile(),
si->sr->getUtf8());
if(WinUtil::isShift())
QueueManager::getInstance()->setPriority(target, QueueItem::HIGHEST);
} else {
QueueManager::getInstance()->addDirectory(si->sr->getFile(), si->sr->getUser(), Text::fromT(tgt),
WinUtil::isShift() ? QueueItem::HIGHEST : QueueItem::DEFAULT);
}
} catch(const Exception&) {
}
}
void SearchFrame::SearchInfo::DownloadWhole::operator()(SearchInfo* si) {
try {
if(si->sr->getType() == SearchResult::TYPE_FILE) {
QueueManager::getInstance()->addDirectory(Text::fromT(si->columns[COLUMN_PATH]), si->sr->getUser(), Text::fromT(tgt),
WinUtil::isShift() ? QueueItem::HIGHEST : QueueItem::DEFAULT);
} else {
QueueManager::getInstance()->addDirectory(si->sr->getFile(), si->sr->getUser(), Text::fromT(tgt),
WinUtil::isShift() ? QueueItem::HIGHEST : QueueItem::DEFAULT);
}
} catch(const Exception&) {
}
}
void SearchFrame::SearchInfo::DownloadTarget::operator()(SearchInfo* si) {
try {
if(si->sr->getType() == SearchResult::TYPE_FILE) {
string target = Text::fromT(tgt);
QueueManager::getInstance()->add(target, si->sr->getSize(),
si->sr->getTTH(), si->sr->getUser(), si->sr->getFile(),
si->sr->getUtf8());
if(WinUtil::isShift())
QueueManager::getInstance()->setPriority(target, QueueItem::HIGHEST);
} else {
QueueManager::getInstance()->addDirectory(si->sr->getFile(), si->sr->getUser(), Text::fromT(tgt),
WinUtil::isShift() ? QueueItem::HIGHEST : QueueItem::DEFAULT);
}
} catch(const Exception&) {
}
}
void SearchFrame::SearchInfo::getList() {
try {
WinUtil::addInitalDir(sr->getUser(), Text::fromT(columns[COLUMN_PATH]));
QueueManager::getInstance()->addList(sr->getUser(), QueueItem::FLAG_CLIENT_VIEW);
} catch(const Exception&) {
// Ignore for now...
}
}
void SearchFrame::SearchInfo::browseList() {
try {
QueueManager::getInstance()->addPfs(sr->getUser(), Text::fromT(columns[COLUMN_PATH]));
} catch(const Exception&) {
// Ignore for now...
}
}
void SearchFrame::SearchInfo::CheckSize::operator()(SearchInfo* si) {
if(!si->columns[COLUMN_TTH].empty()) {
if(firstTTH) {
tth = si->columns[COLUMN_TTH];
hasTTH = true;
firstTTH = false;
} else if(hasTTH) {
if(tth != si->columns[COLUMN_TTH]) {
hasTTH = false;
}
}
} else {
firstTTH = false;
hasTTH = false;
}
if(si->sr->getType() == SearchResult::TYPE_FILE) {
if(ext.empty()) {
ext = Util::getFileExt(si->columns[COLUMN_FILENAME]);
size = si->sr->getSize();
} else if(size != -1) {
if((si->sr->getSize() != size) || (Util::stricmp(ext, Util::getFileExt(si->columns[COLUMN_FILENAME])) != 0)) {
size = -1;
}
}
} else {
size = -1;
}
if(firstHubs && hubs.empty()) {
hubs = ClientManager::getInstance()->getHubs(si->sr->getUser()->getCID());
firstHubs = false;
} else if(!hubs.empty()) {
Util::intersect(hubs, ClientManager::getInstance()->getHubs(si->sr->getUser()->getCID()));
}
}
LRESULT SearchFrame::onDownloadTo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlResults.GetSelectedCount() == 1) {
int i = ctrlResults.GetNextItem(-1, LVNI_SELECTED);
dcassert(i != -1);
SearchInfo* si = ctrlResults.getItemData(i);
SearchResult* sr = si->sr;
if(sr->getType() == SearchResult::TYPE_FILE) {
tstring target = Text::toT(SETTING(DOWNLOAD_DIRECTORY)) + si->columns[COLUMN_FILENAME];
if(WinUtil::browseFile(target, m_hWnd)) {
WinUtil::addLastDir(Util::getFilePath(target));
ctrlResults.forEachSelectedT(SearchInfo::DownloadTarget(target));
}
} else {
tstring target = Text::toT(SETTING(DOWNLOAD_DIRECTORY));
if(WinUtil::browseDirectory(target, m_hWnd)) {
WinUtil::addLastDir(target);
ctrlResults.forEachSelectedT(SearchInfo::Download(target));
}
}
} else {
tstring target = Text::toT(SETTING(DOWNLOAD_DIRECTORY));
if(WinUtil::browseDirectory(target, m_hWnd)) {
WinUtil::addLastDir(target);
ctrlResults.forEachSelectedT(SearchInfo::Download(target));
}
}
return 0;
}
LRESULT SearchFrame::onDownloadWholeTo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
tstring target = Text::toT(SETTING(DOWNLOAD_DIRECTORY));
if(WinUtil::browseDirectory(target, m_hWnd)) {
WinUtil::addLastDir(target);
ctrlResults.forEachSelectedT(SearchInfo::DownloadWhole(target));
}
return 0;
}
LRESULT SearchFrame::onDownloadTarget(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
dcassert(wID >= IDC_DOWNLOAD_TARGET);
size_t newId = (size_t)wID - IDC_DOWNLOAD_TARGET;
if(newId < WinUtil::lastDirs.size()) {
ctrlResults.forEachSelectedT(SearchInfo::Download(WinUtil::lastDirs[newId]));
} else {
dcassert((newId - WinUtil::lastDirs.size()) < targets.size());
ctrlResults.forEachSelectedT(SearchInfo::DownloadTarget(Text::toT(targets[newId - WinUtil::lastDirs.size()])));
}
return 0;
}
LRESULT SearchFrame::onDownloadWholeTarget(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
dcassert((wID-IDC_DOWNLOAD_WHOLE_TARGET) < (int)WinUtil::lastDirs.size());
ctrlResults.forEachSelectedT(SearchInfo::DownloadWhole(WinUtil::lastDirs[wID-IDC_DOWNLOAD_WHOLE_TARGET]));
return 0;
}
LRESULT SearchFrame::onDownloadFavoriteDirs(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
dcassert(wID >= IDC_DOWNLOAD_FAVORITE_DIRS);
size_t newId = (size_t)wID - IDC_DOWNLOAD_FAVORITE_DIRS;
StringPairList spl = FavoriteManager::getInstance()->getFavoriteDirs();
if(newId < spl.size()) {
ctrlResults.forEachSelectedT(SearchInfo::Download(Text::toT(spl[newId].first)));
} else {
dcassert((newId - spl.size()) < targets.size());
ctrlResults.forEachSelectedT(SearchInfo::DownloadTarget(Text::toT(targets[newId - spl.size()])));
}
return 0;
}
LRESULT SearchFrame::onDownloadWholeFavoriteDirs(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
StringPairList spl = FavoriteManager::getInstance()->getFavoriteDirs();
dcassert((wID-IDC_DOWNLOAD_WHOLE_FAVORITE_DIRS) < (int)spl.size());
ctrlResults.forEachSelectedT(SearchInfo::DownloadWhole(Text::toT(spl[wID-IDC_DOWNLOAD_WHOLE_FAVORITE_DIRS].first)));
return 0;
}
LRESULT SearchFrame::onDoubleClickResults(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) {
ctrlResults.forEachSelectedT(SearchInfo::Download(Text::toT(SETTING(DOWNLOAD_DIRECTORY))));
return 0;
}
LRESULT SearchFrame::onClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
if(!closed) {
SearchManager::getInstance()->removeListener(this);
ClientManager* clientMgr = ClientManager::getInstance();
clientMgr->removeListener(this);
frames.erase(m_hWnd);
closed = true;
PostMessage(WM_CLOSE);
return 0;
} else {
for(int i = 0; i < ctrlResults.GetItemCount(); i++) {
delete ctrlResults.getItemData(i);
}
ctrlResults.DeleteAllItems();
for(int i = 0; i < ctrlHubs.GetItemCount(); i++) {
delete ctrlHubs.getItemData(i);
}
ctrlHubs.DeleteAllItems();
WinUtil::saveHeaderOrder(ctrlResults, SettingsManager::SEARCHFRAME_ORDER,
SettingsManager::SEARCHFRAME_WIDTHS, COLUMN_LAST, columnIndexes, columnSizes);
bHandled = FALSE;
return 0;
}
}
void SearchFrame::UpdateLayout(BOOL bResizeBars)
{
RECT rect;
GetClientRect(&rect);
// position bars and offset their dimensions
UpdateBarsPosition(rect, bResizeBars);
if(ctrlStatus.IsWindow()) {
CRect sr;
int w[4];
ctrlStatus.GetClientRect(sr);
int tmp = (sr.Width()) > 316 ? 216 : ((sr.Width() > 116) ? sr.Width()-100 : 16);
w[0] = 15;
w[1] = sr.right - tmp;
w[2] = w[1] + (tmp-16)/2;
w[3] = w[1] + (tmp-16);
ctrlStatus.SetParts(4, w);
// Layout showUI button in statusbar part #0
ctrlStatus.GetRect(0, sr);
ctrlShowUI.MoveWindow(sr);
}
if(showUI)
{
int const width = 220, spacing = 50, labelH = 16, comboH = 140, lMargin = 2, rMargin = 4;
CRect rc = rect;
rc.left += width;
ctrlResults.MoveWindow(rc);
// "Search for"
rc.right = width - rMargin;
rc.left = lMargin;
rc.top += 25;
rc.bottom = rc.top + comboH + 21;
ctrlSearchBox.MoveWindow(rc);
searchLabel.MoveWindow(rc.left + lMargin, rc.top - labelH, width - rMargin, labelH-1);
// "Purge"
rc.right = rc.left + spacing;
rc.left = lMargin;
rc.top += 25;
rc.bottom = rc.top + 21;
ctrlPurge.MoveWindow(rc);
// "Size"
int w2 = width - rMargin - lMargin;
rc.top += spacing;
rc.bottom = rc.top + comboH;
rc.right = w2/3;
ctrlMode.MoveWindow(rc);
sizeLabel.MoveWindow(rc.left + lMargin, rc.top - labelH, width - rMargin, labelH-1);
rc.left = rc.right + lMargin;
rc.right += w2/3;
rc.bottom = rc.top + 21;
ctrlSize.MoveWindow(rc);
rc.left = rc.right + lMargin;
rc.right = width - rMargin;
rc.bottom = rc.top + comboH;
ctrlSizeMode.MoveWindow(rc);
// "File type"
rc.left = lMargin;
rc.right = width - rMargin;
rc.top += spacing;
rc.bottom = rc.top + comboH + 21;
ctrlFiletype.MoveWindow(rc);
rc.bottom -= comboH;
typeLabel.MoveWindow(rc.left + lMargin, rc.top - labelH, width - rMargin, labelH-1);
// "Search options"
rc.left = lMargin;
rc.right = width - rMargin;
rc.top += spacing;
rc.bottom += spacing;
ctrlSlots.MoveWindow(rc);
optionLabel.MoveWindow(rc.left + lMargin, rc.top - labelH, width - rMargin, labelH-1);
rc.top += labelH + 3;
rc.bottom += labelH + 3;
ctrlTTH.MoveWindow(rc);
// "Hubs"
rc.left = lMargin;
rc.right = width - rMargin;
rc.top += spacing;
rc.bottom = rc.top + comboH;
if (rc.bottom + labelH + 21 > rect.bottom) {
rc.bottom = rect.bottom - labelH - 21;
if (rc.bottom < rc.top + (labelH*3)/2)
rc.bottom = rc.top + (labelH*3)/2;
}
ctrlHubs.MoveWindow(rc);
hubsLabel.MoveWindow(rc.left + lMargin, rc.top - labelH, width - rMargin, labelH-1);
// "Search"
rc.right = width - rMargin;
rc.left = rc.right - 100;
rc.top = rc.bottom + labelH;
rc.bottom = rc.top + 21;
ctrlDoSearch.MoveWindow(rc);
}
else
{
CRect rc = rect;
ctrlResults.MoveWindow(rc);
rc.SetRect(0,0,0,0);
ctrlSearchBox.MoveWindow(rc);
ctrlMode.MoveWindow(rc);
ctrlPurge.MoveWindow(rc);
ctrlSize.MoveWindow(rc);
ctrlSizeMode.MoveWindow(rc);
ctrlFiletype.MoveWindow(rc);
}
POINT pt;
pt.x = 10;
pt.y = 10;
HWND hWnd = ctrlSearchBox.ChildWindowFromPoint(pt);
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, ucLineParams))
return;
StringMap ucParams = ucLineParams;
set<CID> users;
int sel = -1;
while((sel = ctrlResults.GetNextItem(sel, LVNI_SELECTED)) != -1) {
SearchResult* sr = ctrlResults.getItemData(sel)->sr;
if(!sr->getUser()->isOnline())
continue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -