⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 searchfrm.cpp

📁 p2p技术C源代码.rar
💻 CPP
📖 第 1 页 / 共 3 页
字号:
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 + -