📄 searchfrm.cpp
字号:
/*
* Copyright (C) 2001-2003 Jacek Sieka, j_s@telia.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "stdafx.h"
#include "../client/DCPlusPlus.h"
#include "Resource.h"
#include "SearchFrm.h"
#include "LineDlg.h"
#include "PrivateFrame.h"
#include "../client/QueueManager.h"
#include "../client/StringTokenizer.h"
#include "../client/HubManager.h"
StringList SearchFrame::lastSearches;
int SearchFrame::columnIndexes[] = { COLUMN_NICK, COLUMN_FILENAME, COLUMN_TYPE, COLUMN_SIZE,
COLUMN_PATH, COLUMN_SLOTS, COLUMN_CONNECTION, COLUMN_HUB, COLUMN_EXACT_SIZE };
int SearchFrame::columnSizes[] = { 100, 200, 50, 80, 100, 40, 70, 150, 80 };
static ResourceManager::Strings columnNames[] = { ResourceManager::USER, ResourceManager::FILE, ResourceManager::TYPE, ResourceManager::SIZE,
ResourceManager::PATH, ResourceManager::SLOTS, ResourceManager::CONNECTION,
ResourceManager::HUB, ResourceManager::EXACT_SIZE };
LRESULT SearchFrame::onCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
CreateSimpleStatusBar(ATL_IDS_IDLEMESSAGE, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP);
ctrlStatus.Attach(m_hWndStatusBar);
ctrlSearchBox.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
WS_VSCROLL | CBS_DROPDOWN | CBS_AUTOHSCROLL, 0);
for(StringIter i = lastSearches.begin(); i != lastSearches.end(); ++i) {
ctrlSearchBox.InsertString(0, i->c_str());
}
searchBoxContainer.SubclassWindow(ctrlSearchBox.m_hWnd);
ctrlSearchBox.SetExtendedUI();
ctrlMode.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
WS_HSCROLL | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_CLIENTEDGE);
modeContainer.SubclassWindow(ctrlMode.m_hWnd);
ctrlSize.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
ES_AUTOHSCROLL, WS_EX_CLIENTEDGE);
sizeContainer.SubclassWindow(ctrlSize.m_hWnd);
ctrlSizeMode.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
WS_HSCROLL | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_CLIENTEDGE);
sizeModeContainer.SubclassWindow(ctrlSizeMode.m_hWnd);
ctrlFiletype.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
WS_HSCROLL | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_CLIENTEDGE);
fileTypeContainer.SubclassWindow(ctrlFiletype.m_hWnd);
ctrlResults.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
WS_HSCROLL | WS_VSCROLL | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS, WS_EX_CLIENTEDGE, IDC_RESULTS);
resultsContainer.SubclassWindow(ctrlResults.m_hWnd);
if(BOOLSETTING(FULL_ROW_SELECT)) {
ctrlResults.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);
} else {
ctrlResults.SetExtendedListViewStyle(LVS_EX_HEADERDRAGDROP);
}
ctrlResults.SetImageList(WinUtil::fileImages, LVSIL_SMALL);
searchLabel.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
searchLabel.SetFont(WinUtil::systemFont, FALSE);
searchLabel.SetWindowText(CSTRING(SEARCH_FOR));
sizeLabel.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
sizeLabel.SetFont(WinUtil::systemFont, FALSE);
sizeLabel.SetWindowText(CSTRING(SIZE));
typeLabel.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
typeLabel.SetFont(WinUtil::systemFont, FALSE);
typeLabel.SetWindowText(CSTRING(FILE_TYPE));
optionLabel.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
optionLabel.SetFont(WinUtil::systemFont, FALSE);
optionLabel.SetWindowText(CSTRING(SEARCH_OPTIONS));
ctrlSlots.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, NULL, IDC_FREESLOTS);
ctrlSlots.SetButtonStyle(BS_AUTOCHECKBOX, FALSE);
ctrlSlots.SetFont(WinUtil::systemFont, FALSE);
ctrlSlots.SetWindowText(CSTRING(ONLY_FREE_SLOTS));
slotsContainer.SubclassWindow(ctrlSlots.m_hWnd);
ctrlShowUI.Create(ctrlStatus.m_hWnd, rcDefault, "+/-", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
ctrlShowUI.SetButtonStyle(BS_AUTOCHECKBOX, false);
ctrlShowUI.SetCheck(1);
showUIContainer.SubclassWindow(ctrlShowUI.m_hWnd);
ctrlDoSearch.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
BS_PUSHBUTTON , 0, IDC_SEARCH);
ctrlDoSearch.SetWindowText(CSTRING(SEARCH));
ctrlDoSearch.SetFont(WinUtil::systemFont);
doSearchContainer.SubclassWindow(ctrlDoSearch.m_hWnd);
ctrlSearchBox.SetFont(WinUtil::systemFont, FALSE);
ctrlSize.SetFont(WinUtil::systemFont, FALSE);
ctrlMode.SetFont(WinUtil::systemFont, FALSE);
ctrlSizeMode.SetFont(WinUtil::systemFont, FALSE);
ctrlFiletype.SetFont(WinUtil::systemFont, FALSE);
ctrlMode.AddString(CSTRING(NORMAL));
ctrlMode.AddString(CSTRING(AT_LEAST));
ctrlMode.AddString(CSTRING(AT_MOST));
ctrlMode.SetCurSel(1);
ctrlSizeMode.AddString(CSTRING(B));
ctrlSizeMode.AddString(CSTRING(KB));
ctrlSizeMode.AddString(CSTRING(MB));
ctrlSizeMode.AddString(CSTRING(GB));
ctrlSizeMode.SetCurSel(2);
ctrlFiletype.AddString(CSTRING(ANY));
ctrlFiletype.AddString(CSTRING(AUDIO));
ctrlFiletype.AddString(CSTRING(COMPRESSED));
ctrlFiletype.AddString(CSTRING(DOCUMENT));
ctrlFiletype.AddString(CSTRING(EXECUTABLE));
ctrlFiletype.AddString(CSTRING(PICTURE));
ctrlFiletype.AddString(CSTRING(VIDEO));
ctrlFiletype.AddString(CSTRING(DIRECTORY));
ctrlFiletype.SetCurSel(0);
// Create listview columns
WinUtil::splitTokens(columnIndexes, SETTING(SEARCHFRAME_ORDER), COLUMN_LAST);
WinUtil::splitTokens(columnSizes, SETTING(SEARCHFRAME_WIDTHS), COLUMN_LAST);
for(int j=0; j<COLUMN_LAST; j++) {
int fmt = (j == COLUMN_SIZE || j == COLUMN_EXACT_SIZE) ? LVCFMT_RIGHT : LVCFMT_LEFT;
ctrlResults.InsertColumn(j, CSTRING_I(columnNames[j]), fmt, columnSizes[j], j);
}
ctrlResults.SetColumnOrderArray(COLUMN_LAST, columnIndexes);
ctrlResults.SetBkColor(WinUtil::bgColor);
ctrlResults.SetTextBkColor(WinUtil::bgColor);
ctrlResults.SetTextColor(WinUtil::textColor);
ctrlResults.SetFont(WinUtil::systemFont, FALSE); // use Util::font instead to obey Appearace settings
SetWindowText(CSTRING(SEARCH));
targetDirMenu.CreatePopupMenu();
targetMenu.CreatePopupMenu();
resultsMenu.CreatePopupMenu();
opMenu.CreatePopupMenu();
resultsMenu.AppendMenu(MF_STRING, IDC_DOWNLOAD, CSTRING(DOWNLOAD));
resultsMenu.AppendMenu(MF_POPUP, (UINT)(HMENU)targetMenu, CSTRING(DOWNLOAD_TO));
resultsMenu.AppendMenu(MF_STRING, IDC_DOWNLOADDIR, CSTRING(DOWNLOAD_WHOLE_DIR));
resultsMenu.AppendMenu(MF_POPUP, (UINT)(HMENU)targetDirMenu, CSTRING(DOWNLOAD_WHOLE_DIR_TO));
resultsMenu.AppendMenu(MF_SEPARATOR, 0, (LPCTSTR)NULL);
resultsMenu.AppendMenu(MF_STRING, IDC_GETLIST, CSTRING(GET_FILE_LIST));
resultsMenu.AppendMenu(MF_STRING, IDC_PRIVATEMESSAGE, CSTRING(SEND_PRIVATE_MESSAGE));
resultsMenu.AppendMenu(MF_STRING, IDC_ADD_TO_FAVORITES, CSTRING(ADD_TO_FAVORITES));
resultsMenu.AppendMenu(MF_STRING, IDC_REMOVE, CSTRING(REMOVE));
opMenu.AppendMenu(MF_STRING, IDC_DOWNLOAD, CSTRING(DOWNLOAD));
opMenu.AppendMenu(MF_POPUP, (UINT)(HMENU)targetMenu, CSTRING(DOWNLOAD_TO));
opMenu.AppendMenu(MF_STRING, IDC_DOWNLOADDIR, CSTRING(DOWNLOAD_WHOLE_DIR));
opMenu.AppendMenu(MF_POPUP, (UINT)(HMENU)targetDirMenu, CSTRING(DOWNLOAD_WHOLE_DIR_TO));
opMenu.AppendMenu(MF_SEPARATOR, 0, (LPCTSTR)NULL);
opMenu.AppendMenu(MF_STRING, IDC_GETLIST, CSTRING(GET_FILE_LIST));
opMenu.AppendMenu(MF_STRING, IDC_PRIVATEMESSAGE, CSTRING(SEND_PRIVATE_MESSAGE));
opMenu.AppendMenu(MF_STRING, IDC_ADD_TO_FAVORITES, CSTRING(ADD_TO_FAVORITES));
opMenu.AppendMenu(MF_STRING, IDC_REMOVE, CSTRING(REMOVE));
opMenu.AppendMenu(MF_SEPARATOR, 0, (LPCTSTR)NULL);
opMenu.AppendMenu(MF_STRING, IDC_KICK, CSTRING(KICK_USER));
opMenu.AppendMenu(MF_STRING, IDC_REDIRECT, CSTRING(REDIRECT));
if(!initialString.empty()) {
search = StringTokenizer(initialString, ' ').getTokens();
lastSearches.push_back(initialString);
ctrlSearchBox.InsertString(0, initialString.c_str());
ctrlSearchBox.SetCurSel(0);
ctrlSizeMode.SetCurSel(initialMode);
ctrlSize.SetWindowText(Util::toString(initialSize).c_str());
ctrlFiletype.SetCurSel(initialType);
SearchManager::getInstance()->search(initialString, initialSize, initialType, initialMode);
ctrlStatus.SetText(1, (STRING(SEARCHING_FOR) + initialString + "...").c_str());
}
bHandled = FALSE;
return 1;
}
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);
SearchResult* sr = (SearchResult*)ctrlResults.GetItemData(i);
if(sr->getType() == SearchResult::TYPE_FILE) {
string target = SETTING(DOWNLOAD_DIRECTORY) + sr->getFileName();
if(WinUtil::browseFile(target, m_hWnd)) {
WinUtil::addLastDir(Util::getFilePath(target));
try {
QueueManager::getInstance()->add(sr->getFile(), sr->getSize(), sr->getUser(), target);
} catch(const Exception& e) {
ctrlStatus.SetText(1, e.getError().c_str());
}
}
} else {
string target = SETTING(DOWNLOAD_DIRECTORY);
if(WinUtil::browseDirectory(target, m_hWnd)) {
WinUtil::addLastDir(target);
downloadSelected(target);
}
}
} else {
string target = SETTING(DOWNLOAD_DIRECTORY);
if(WinUtil::browseDirectory(target, m_hWnd)) {
WinUtil::addLastDir(target);
downloadSelected(target);
}
}
return 0;
}
LRESULT SearchFrame::onDownloadWholeTo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
string target = SETTING(DOWNLOAD_DIRECTORY);
if(WinUtil::browseDirectory(target, m_hWnd)) {
WinUtil::addLastDir(target);
downloadWholeSelected(target);
}
return 0;
}
void SearchFrame::onEnter() {
char* message;
if(ctrlSearch.GetWindowTextLength() > 0 && lastSearch + 3*1000 < TimerManager::getInstance()->getTick()) {
message = new char[ctrlSearch.GetWindowTextLength()+1];
ctrlSearch.GetWindowText(message, ctrlSearch.GetWindowTextLength()+1);
string s(message, ctrlSearch.GetWindowTextLength());
delete[] message;
message = new char[ctrlSize.GetWindowTextLength()+1];
ctrlSize.GetWindowText(message, ctrlSize.GetWindowTextLength()+1);
string size(message, ctrlSize.GetWindowTextLength());
delete[] message;
double lsize = Util::toDouble(size);
switch(ctrlSizeMode.GetCurSel()) {
case 1:
lsize*=1024.0; break;
case 2:
lsize*=1024.0*1024.0; break;
case 3:
lsize*=1024.0*1024.0*1024.0; break;
}
int64_t llsize = (int64_t)lsize;
for(int i = 0; i != ctrlResults.GetItemCount(); i++) {
delete (SearchResult*)ctrlResults.GetItemData(i);
}
ctrlResults.DeleteAllItems();
SearchManager::SizeModes mode((SearchManager::SizeModes)ctrlMode.GetCurSel());
if(llsize == 0)
mode = SearchManager::SIZE_DONTCARE;
SearchManager::getInstance()->search(s, llsize,
(SearchManager::TypeModes)ctrlFiletype.GetCurSel(), mode);
if(BOOLSETTING(CLEAR_SEARCH)){
ctrlSearch.SetWindowText("");
} else {
lastSearch = TimerManager::getInstance()->getTick();
}
// Add new searches to the last-search dropdown list
if(find(lastSearches.begin(), lastSearches.end(), s) == lastSearches.end())
{
if(ctrlSearchBox.GetCount() > 9)
ctrlSearchBox.DeleteString(9);
ctrlSearchBox.InsertString(0, s.c_str());
while(lastSearches.size() > 9) {
lastSearches.erase(lastSearches.begin());
}
lastSearches.push_back(s);
}
ctrlStatus.SetText(1, (STRING(SEARCHING_FOR) + s + "...").c_str());
{
Lock l(cs);
search = StringTokenizer(s, ' ').getTokens();
}
SetWindowText((STRING(SEARCH) + " - " + s).c_str());
}
}
void SearchFrame::onSearchResult(SearchResult* aResult) {
// Check that this is really a relevant search result...
{
Lock l(cs);
if(search.empty()) {
return;
}
for(StringIter j = search.begin(); j != search.end(); ++j) {
if(Util::findSubString(aResult->getFile(), *j) == -1) {
return;
}
}
}
// Reject results without free slots if selected
if(onlyFree && aResult->getFreeSlots() < 1)
return;
SearchResult* copy = new SearchResult(*aResult);
string file, path;
if(aResult->getType() == SearchResult::TYPE_FILE) {
if(aResult->getFile().rfind('\\') == string::npos) {
file = aResult->getFile();
} else {
file = Util::getFileName(aResult->getFile());
path = Util::getFilePath(aResult->getFile());
}
} else {
file = aResult->getFileName();
path = aResult->getFile();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -