📄 directorylistingfrm.cpp
字号:
if(history.size() > 1 && historyIndex < history.size()) {
size_t n = min(historyIndex, history.size() - 1);
deque<string> tmp = history;
selectItem(Text::toT(history[n]));
historyIndex = n + 1;
history = tmp;
}
}
LRESULT DirectoryListingFrame::onDoubleClickFiles(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) {
NMITEMACTIVATE* item = (NMITEMACTIVATE*) pnmh;
HTREEITEM t = ctrlTree.GetSelectedItem();
if(t != NULL && item->iItem != -1) {
ItemInfo* ii = (ItemInfo*) ctrlList.GetItemData(item->iItem);
if(ii->type == ItemInfo::FILE) {
try {
dl->download(ii->file, SETTING(DOWNLOAD_DIRECTORY) + Text::fromT(ii->getText(COLUMN_FILENAME)), false, WinUtil::isShift());
} catch(const Exception& e) {
ctrlStatus.SetText(STATUS_TEXT, Text::toT(e.getError()).c_str());
}
} else {
HTREEITEM ht = ctrlTree.GetChildItem(t);
while(ht != NULL) {
if((DirectoryListing::Directory*)ctrlTree.GetItemData(ht) == ii->dir) {
ctrlTree.SelectItem(ht);
break;
}
ht = ctrlTree.GetNextSiblingItem(ht);
}
}
}
return 0;
}
LRESULT DirectoryListingFrame::onDownloadDir(WORD , WORD , HWND , BOOL& ) {
HTREEITEM t = ctrlTree.GetSelectedItem();
if(t != NULL) {
DirectoryListing::Directory* dir = (DirectoryListing::Directory*)ctrlTree.GetItemData(t);
try {
dl->download(dir, SETTING(DOWNLOAD_DIRECTORY), WinUtil::isShift());
} catch(const Exception& e) {
ctrlStatus.SetText(STATUS_TEXT, Text::toT(e.getError()).c_str());
}
}
return 0;
}
LRESULT DirectoryListingFrame::onDownloadDirTo(WORD , WORD , HWND , BOOL& ) {
HTREEITEM t = ctrlTree.GetSelectedItem();
if(t != NULL) {
DirectoryListing::Directory* dir = (DirectoryListing::Directory*)ctrlTree.GetItemData(t);
tstring target = Text::toT(SETTING(DOWNLOAD_DIRECTORY));
if(WinUtil::browseDirectory(target, m_hWnd)) {
WinUtil::addLastDir(target);
try {
dl->download(dir, Text::fromT(target), WinUtil::isShift());
} catch(const Exception& e) {
ctrlStatus.SetText(STATUS_TEXT, Text::toT(e.getError()).c_str());
}
}
}
return 0;
}
void DirectoryListingFrame::downloadList(const tstring& aTarget, bool view /* = false */) {
int i=-1;
while( (i = ctrlList.GetNextItem(i, LVNI_SELECTED)) != -1) {
ItemInfo* ii = (ItemInfo*)ctrlList.GetItemData(i);
tstring target = aTarget.empty() ? Text::toT(SETTING(DOWNLOAD_DIRECTORY)) : aTarget;
try {
if(ii->type == ItemInfo::FILE) {
if(view) {
File::deleteFile(Text::fromT(target) + Util::validateFileName(ii->file->getName()));
}
dl->download(ii->file, Text::fromT(target + ii->getText(COLUMN_FILENAME)), view, WinUtil::isShift() || view);
} else if(!view) {
dl->download(ii->dir, Text::fromT(target), WinUtil::isShift());
}
} catch(const Exception& e) {
ctrlStatus.SetText(STATUS_TEXT, Text::toT(e.getError()).c_str());
}
}
}
LRESULT DirectoryListingFrame::onDownload(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
downloadList(Text::toT(SETTING(DOWNLOAD_DIRECTORY)));
return 0;
}
LRESULT DirectoryListingFrame::onDownloadTo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlList.GetSelectedCount() == 1) {
ItemInfo* ii = (ItemInfo*)ctrlList.GetItemData(ctrlList.GetNextItem(-1, LVNI_SELECTED));
try {
if(ii->type == ItemInfo::FILE) {
tstring target = Text::toT(SETTING(DOWNLOAD_DIRECTORY)) + ii->getText(COLUMN_FILENAME);
if(WinUtil::browseFile(target, m_hWnd)) {
WinUtil::addLastDir(Util::getFilePath(target));
dl->download(ii->file, Text::fromT(target), false, WinUtil::isShift());
}
} else {
tstring target = Text::toT(SETTING(DOWNLOAD_DIRECTORY));
if(WinUtil::browseDirectory(target, m_hWnd)) {
WinUtil::addLastDir(target);
dl->download(ii->dir, Text::fromT(target), WinUtil::isShift());
}
}
} catch(const Exception& e) {
ctrlStatus.SetText(STATUS_TEXT, Text::toT(e.getError()).c_str());
}
} else {
tstring target = Text::toT(SETTING(DOWNLOAD_DIRECTORY));
if(WinUtil::browseDirectory(target, m_hWnd)) {
WinUtil::addLastDir(target);
downloadList(target);
}
}
return 0;
}
LRESULT DirectoryListingFrame::onViewAsText(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
downloadList(Text::toT(Util::getTempPath()), true);
return 0;
}
LRESULT DirectoryListingFrame::onSearchByTTH(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
ItemInfo* ii = ctrlList.getSelectedItem();
if(ii != NULL && ii->type == ItemInfo::FILE && ii->file->getTTH() != NULL) {
WinUtil::searchHash(ii->file->getTTH());
}
return 0;
}
LRESULT DirectoryListingFrame::onBitziLookup(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
ItemInfo* ii = ctrlList.getSelectedItem();
if(ii != NULL && ii->type == ItemInfo::FILE && ii->file->getTTH() != NULL) {
WinUtil::bitziLink(ii->file->getTTH());
}
return 0;
}
LRESULT DirectoryListingFrame::onCopyMagnet(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
ItemInfo* ii = ctrlList.getSelectedItem();
if(ii != NULL && ii->type == ItemInfo::FILE && ii->file->getTTH() != NULL) {
WinUtil::copyMagnet(ii->file->getTTH(), ii->getText(COLUMN_FILENAME));
}
return 0;
}
LRESULT DirectoryListingFrame::onMatchQueue(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
int x = QueueManager::getInstance()->matchListing(*dl);
AutoArray<TCHAR> buf(STRING(MATCHED_FILES).length() + 32);
_stprintf(buf, CTSTRING(MATCHED_FILES), x);
ctrlStatus.SetText(STATUS_TEXT, buf);
return 0;
}
LRESULT DirectoryListingFrame::onListDiff(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
tstring file;
if(WinUtil::browseFile(file, m_hWnd, false, Text::toT(Util::getListPath()), _T("File Lists\0*.xml.bz2\0All Files\0*.*\0"))) {
DirectoryListing dirList(dl->getUser());
dirList.loadFile(Text::fromT(file));
dl->getRoot()->filterList(dirList);
refreshTree(Util::emptyStringT);
initStatus();
updateStatus();
}
return 0;
}
LRESULT DirectoryListingFrame::onGoToDirectory(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlList.GetSelectedCount() != 1)
return 0;
tstring fullPath;
ItemInfo* ii = (ItemInfo*)ctrlList.GetItemData(ctrlList.GetNextItem(-1, LVNI_SELECTED));
if(ii->type == ItemInfo::FILE) {
if(!ii->file->getAdls())
return 0;
DirectoryListing::Directory* pd = ii->file->getParent();
while(pd != NULL && pd != dl->getRoot()) {
fullPath = Text::toT(pd->getName()) + _T("\\") + fullPath;
pd = pd->getParent();
}
} else if(ii->type == ItemInfo::DIRECTORY) {
if(!(ii->dir->getAdls() && ii->dir->getParent() != dl->getRoot()))
return 0;
fullPath = Text::toT(((DirectoryListing::AdlDirectory*)ii->dir)->getFullPath());
}
selectItem(fullPath);
return 0;
}
HTREEITEM DirectoryListingFrame::findItem(HTREEITEM ht, const tstring& name) {
string::size_type i = name.find('\\');
if(i == string::npos)
return ht;
for(HTREEITEM child = ctrlTree.GetChildItem(ht); child != NULL; child = ctrlTree.GetNextSiblingItem(child)) {
DirectoryListing::Directory* d = (DirectoryListing::Directory*)ctrlTree.GetItemData(child);
if(Text::toT(d->getName()) == name.substr(0, i)) {
return findItem(child, name.substr(i+1));
}
}
return NULL;
}
void DirectoryListingFrame::selectItem(const tstring& name) {
HTREEITEM ht = findItem(treeRoot, name);
if(ht != NULL) {
ctrlTree.EnsureVisible(ht);
ctrlTree.SelectItem(ht);
}
}
HRESULT DirectoryListingFrame::onContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
fileMenu.RemoveMenu(IDC_GO_TO_DIRECTORY, MF_BYCOMMAND);
if (reinterpret_cast<HWND>(wParam) == ctrlList && ctrlList.GetSelectedCount() > 0) {
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
if(pt.x == -1 && pt.y == -1) {
WinUtil::getContextMenuPos(ctrlList, pt);
}
int n = 0;
ItemInfo* ii = (ItemInfo*)ctrlList.GetItemData(ctrlList.GetNextItem(-1, LVNI_SELECTED));
while(targetMenu.GetMenuItemCount() > 0) {
targetMenu.DeleteMenu(0, MF_BYPOSITION);
}
if (ctrlList.GetSelectedCount() == 1 && ii->type == ItemInfo::FILE && ii->file->getTTH() != NULL) {
fileMenu.EnableMenuItem(IDC_SEARCH_ALTERNATES, MFS_ENABLED);
fileMenu.EnableMenuItem(IDC_BITZI_LOOKUP, MFS_ENABLED);
fileMenu.EnableMenuItem(IDC_COPY_MAGNET, MFS_ENABLED);
} else {
fileMenu.EnableMenuItem(IDC_SEARCH_ALTERNATES, MFS_GRAYED);
fileMenu.EnableMenuItem(IDC_BITZI_LOOKUP, MFS_GRAYED);
fileMenu.EnableMenuItem(IDC_COPY_MAGNET, MFS_GRAYED);
}
if(ctrlList.GetSelectedCount() == 1 && ii->type == ItemInfo::FILE) {
//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));
targets.clear();
if(ii->file->getTTH() != NULL) {
QueueManager::getInstance()->getTargetsByRoot(targets, *ii->file->getTTH());
} else {
QueueManager::getInstance()->getTargetsBySize(targets, ii->file->getSize(), Util::getFileExt(ii->file->getName()));
}
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());
}
}
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());
}
}
if(ii->file->getAdls()) {
fileMenu.AppendMenu(MF_STRING, IDC_GO_TO_DIRECTORY, CTSTRING(GO_TO_DIRECTORY));
}
prepareMenu(fileMenu, UserCommand::CONTEXT_FILELIST, ClientManager::getInstance()->getHubs(dl->getUser()->getCID()));
fileMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
cleanMenu(fileMenu);
} else {
//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());
}
}
if(ii->type == ItemInfo::DIRECTORY && ii->type == ItemInfo::DIRECTORY &&
ii->dir->getAdls() && ii->dir->getParent() != dl->getRoot()) {
fileMenu.AppendMenu(MF_STRING, IDC_GO_TO_DIRECTORY, CTSTRING(GO_TO_DIRECTORY));
}
prepareMenu(fileMenu, UserCommand::CONTEXT_FILELIST, ClientManager::getInstance()->getHubs(dl->getUser()->getCID()));
fileMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
cleanMenu(fileMenu);
}
return TRUE;
} else if(reinterpret_cast<HWND>(wParam) == ctrlTree && ctrlTree.GetSelectedItem() != NULL) {
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
if(pt.x == -1 && pt.y == -1) {
WinUtil::getContextMenuPos(ctrlTree, pt);
} else {
ctrlTree.ScreenToClient(&pt);
UINT a = 0;
HTREEITEM ht = ctrlTree.HitTest(pt, &a);
if(ht != NULL && ht != ctrlTree.GetSelectedItem())
ctrlTree.SelectItem(ht);
ctrlTree.ClientToScreen(&pt);
}
// Strange, windows doesn't change the selection on right-click... (!)
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++) {
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_TARGET_DIR + (++n), i->c_str());
}
}
directoryMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -