📄 hubframe.cpp
字号:
dcassert(frames.find(server) != frames.end());
dcassert(frames[server] == this);
frames.erase(server);
server = redirect;
frames[server] = this;
// the client is dead, long live the client!
client->removeListener(this);
ClientManager::getInstance()->putClient(client);
clearUserList();
clearTaskList();
client = ClientManager::getInstance()->getClient(Text::fromT(server));
client->addListener(this);
client->connect();
}
return 0;
}
LRESULT HubFrame::onEnterUsers(int /*idCtrl*/, LPNMHDR /* pnmh */, BOOL& /*bHandled*/) {
int item = ctrlUsers.GetNextItem(-1, LVNI_FOCUSED);
if(item != -1) {
try {
QueueManager::getInstance()->addList((ctrlUsers.getItemData(item))->user, QueueItem::FLAG_CLIENT_VIEW);
} catch(const Exception& e) {
addClientLine(Text::toT(e.getError()));
}
}
return 0;
}
LRESULT HubFrame::onGetToolTip(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) {
NMTTDISPINFO* nm = (NMTTDISPINFO*)pnmh;
lastLines.clear();
for(TStringIter i = lastLinesList.begin(); i != lastLinesList.end(); ++i) {
lastLines += *i;
lastLines += _T("\r\n");
}
if(lastLines.size() > 2) {
lastLines.erase(lastLines.size() - 2);
}
nm->lpszText = const_cast<TCHAR*>(lastLines.c_str());
return 0;
}
void HubFrame::addClientLine(const tstring& aLine, bool inChat /* = true */) {
tstring line = Text::toT("[" + Util::getShortTimeString() + "] ") + aLine;
ctrlStatus.SetText(0, line.c_str());
while(lastLinesList.size() + 1 > MAX_CLIENT_LINES)
lastLinesList.erase(lastLinesList.begin());
lastLinesList.push_back(line);
if (BOOLSETTING(BOLD_HUB)) {
setDirty();
}
if(BOOLSETTING(STATUS_IN_CHAT) && inChat) {
addLine(_T("*** ") + aLine);
}
if(BOOLSETTING(LOG_STATUS_MESSAGES)) {
StringMap params;
client->getHubIdentity().getParams(params, "hub", false);
params["hubURL"] = client->getHubUrl();
client->getMyIdentity().getParams(params, "my", true);
params["message"] = Text::fromT(aLine);
LOG(LogManager::STATUS, params);
}
}
void HubFrame::closeDisconnected() {
for(FrameIter i=frames.begin(); i!= frames.end(); ++i) {
if (!(i->second->client->isConnected())) {
i->second->PostMessage(WM_CLOSE);
}
}
}
void HubFrame::on(TimerManagerListener::Second, DWORD /*aTick*/) throw() {
updateStatusBar();
if(updateUsers) {
updateUsers = false;
PostMessage(WM_SPEAKER);
}
}
void HubFrame::on(Connecting, Client*) throw() {
speak(ADD_STATUS_LINE, STRING(CONNECTING_TO) + client->getHubUrl() + "...");
speak(SET_WINDOW_TITLE, client->getHubUrl());
}
void HubFrame::on(Connected, Client*) throw() {
speak(CONNECTED);
}
void HubFrame::on(BadPassword, Client*) throw() {
client->setPassword(Util::emptyString);
}
void HubFrame::on(UserUpdated, Client*, const OnlineUser& user) throw() {
speak(UPDATE_USER_JOIN, user);
}
void HubFrame::on(UsersUpdated, Client*, const OnlineUser::List& aList) throw() {
Lock l(taskCS);
taskList.reserve(aList.size());
for(OnlineUser::List::const_iterator i = aList.begin(); i != aList.end(); ++i) {
taskList.push_back(new UserTask(UPDATE_USER, *(*i)));
}
updateUsers = true;
}
void HubFrame::on(UserRemoved, Client*, const OnlineUser& user) throw() {
speak(REMOVE_USER, user);
}
void HubFrame::on(Redirect, Client*, const string& line) throw() {
if(ClientManager::getInstance()->isConnected(line)) {
speak(ADD_STATUS_LINE, STRING(REDIRECT_ALREADY_CONNECTED));
return;
}
redirect = Text::toT(line);
if(BOOLSETTING(AUTO_FOLLOW)) {
PostMessage(WM_COMMAND, IDC_FOLLOW, 0);
} else {
speak(ADD_STATUS_LINE, STRING(PRESS_FOLLOW) + line);
}
}
void HubFrame::on(Failed, Client*, const string& line) throw() {
speak(ADD_STATUS_LINE, line);
speak(DISCONNECTED);
}
void HubFrame::on(GetPassword, Client*) throw() {
speak(GET_PASSWORD);
}
void HubFrame::on(HubUpdated, Client*) throw() {
speak(SET_WINDOW_TITLE, Util::validateMessage(client->getHubName() + " " + client->getHubDescription(), true, false) + " (" + client->getHubUrl() + ")");
}
void HubFrame::on(Message, Client*, const OnlineUser& from, const string& msg) throw() {
speak(ADD_CHAT_LINE, Util::toDOS("<" + from.getIdentity().getNick() + "> " + msg));
}
void HubFrame::on(StatusMessage, Client*, const string& line) {
if(SETTING(FILTER_MESSAGES)) {
if((line.find("Hub-Security") != string::npos) && (line.find("was kicked by") != string::npos)) {
// Do nothing...
} else if((line.find("is kicking") != string::npos) && (line.find("because:") != string::npos)) {
speak(ADD_SILENT_STATUS_LINE, Util::toDOS(line));
} else {
speak(ADD_CHAT_LINE, Util::toDOS(line));
}
} else {
speak(ADD_CHAT_LINE, Util::toDOS(line));
}
}
void HubFrame::on(PrivateMessage, Client*, const OnlineUser& from, const OnlineUser& to, const OnlineUser& replyTo, const string& line) throw() {
speak(from, to, replyTo, Util::toDOS("<" + from.getIdentity().getNick() + "> " + line));
}
void HubFrame::on(NickTaken, Client*) throw() {
speak(ADD_STATUS_LINE, STRING(NICK_TAKEN));
}
void HubFrame::on(SearchFlood, Client*, const string& line) throw() {
speak(ADD_STATUS_LINE, STRING(SEARCH_SPAM_FROM) + line);
}
LRESULT HubFrame::onFilterChar(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) {
if(uMsg == WM_CHAR && wParam == VK_TAB) {
handleTab(WinUtil::isShift());
return 0;
}
TCHAR *buf = new TCHAR[ctrlFilter.GetWindowTextLength()+1];
ctrlFilter.GetWindowText(buf, ctrlFilter.GetWindowTextLength()+1);
filter = buf;
delete[] buf;
updateUserList();
bHandled = FALSE;
return 0;
}
LRESULT HubFrame::onSelChange(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled) {
TCHAR *buf = new TCHAR[ctrlFilter.GetWindowTextLength()+1];
ctrlFilter.GetWindowText(buf, ctrlFilter.GetWindowTextLength()+1);
filter = buf;
delete[] buf;
updateUserList();
bHandled = FALSE;
return 0;
}
bool HubFrame::parseFilter(FilterModes& mode, int64_t& size) {
tstring::size_type start = tstring::npos;
tstring::size_type end = tstring::npos;
int64_t multiplier = 1;
if(filter.compare(0, 2, _T(">=")) == 0) {
mode = FilterModes::GREATER_EQUAL;
start = 2;
} else if(filter.compare(0, 2, _T("<=")) == 0) {
mode = FilterModes::LESS_EQUAL;
start = 2;
} else if(filter.compare(0, 2, _T("==")) == 0) {
mode = FilterModes::EQUAL;
start = 2;
} else if(filter.compare(0, 2, _T("!=")) == 0) {
mode = FilterModes::NOT_EQUAL;
start = 2;
} else if(filter[0] == _T('<')) {
mode = FilterModes::LESS;
start = 1;
} else if(filter[0] == _T('>')) {
mode = FilterModes::GREATER;
start = 1;
} else if(filter[0] == _T('=')) {
mode = FilterModes::EQUAL;
start = 1;
}
if(start == tstring::npos)
return false;
if(filter.length() <= start)
return false;
if((end = Util::findSubString(filter, _T("TiB"))) != tstring::npos) {
multiplier = 1024LL * 1024LL * 1024LL * 1024LL;
} else if((end = Util::findSubString(filter, _T("GiB"))) != tstring::npos) {
multiplier = 1024*1024*1024;
} else if((end = Util::findSubString(filter, _T("MiB"))) != tstring::npos) {
multiplier = 1024*1024;
} else if((end = Util::findSubString(filter, _T("KiB"))) != tstring::npos) {
multiplier = 1024;
} else if((end = Util::findSubString(filter, _T("TB"))) != tstring::npos) {
multiplier = 1000LL * 1000LL * 1000LL * 1000LL;
} else if((end = Util::findSubString(filter, _T("GB"))) != tstring::npos) {
multiplier = 1000*1000*1000;
} else if((end = Util::findSubString(filter, _T("MB"))) != tstring::npos) {
multiplier = 1000*1000;
} else if((end = Util::findSubString(filter, _T("kB"))) != tstring::npos) {
multiplier = 1000;
} else if((end = Util::findSubString(filter, _T("B"))) != tstring::npos) {
multiplier = 1;
}
if(end == tstring::npos) {
end = filter.length();
}
tstring tmpSize = filter.substr(start, end-start);
size = static_cast<int64_t>(Util::toDouble(Text::fromT(tmpSize)) * multiplier);
return true;
}
void HubFrame::updateUserList(UserInfo* ui) {
int64_t size = -1;
FilterModes mode = FilterModes::NONE;
int sel = ctrlFilterSel.GetCurSel();
bool doSizeCompare = parseFilter(mode, size) && sel == COLUMN_SHARED;
//single update?
//avoid refreshing the whole list and just update the current item
//instead
if(ui != NULL) {
if(filter.empty()) {
if(ctrlUsers.findItem(ui) == -1) {
ctrlUsers.insertItem(ui, getImage(ui->getIdentity()));
}
} else {
if(matchFilter(*ui, sel, doSizeCompare, mode, size)) {
if(ctrlUsers.findItem(ui) == -1) {
ctrlUsers.insertItem(ui, getImage(ui->getIdentity()));
}
} else {
//deleteItem checks to see that the item exists in the list
//unnecessary to do it twice.
ctrlUsers.deleteItem(ui);
}
}
} else {
ctrlUsers.SetRedraw(FALSE);
ctrlUsers.DeleteAllItems();
if(filter.empty()) {
for(UserMapIter i = userMap.begin(); i != userMap.end(); ++i){
if(i->second != NULL)
ctrlUsers.insertItem(i->second, getImage(i->second->getIdentity()));
}
} else {
for(UserMapIter i = userMap.begin(); i != userMap.end(); ++i){
if( i->second != NULL ) {
if(matchFilter(*i->second, sel, doSizeCompare, mode, size)) {
ctrlUsers.insertItem(i->second, getImage(i->second->getIdentity()));
}
}
}
}
ctrlUsers.SetRedraw(TRUE);
}
}
void HubFrame::handleTab(bool reverse) {
HWND focus = GetFocus();
if(reverse) {
if(focus == ctrlFilterSel.m_hWnd) {
ctrlFilter.SetFocus();
} else if(focus == ctrlFilter.m_hWnd) {
ctrlMessage.SetFocus();
} else if(focus == ctrlMessage.m_hWnd) {
ctrlUsers.SetFocus();
} else if(focus == ctrlUsers.m_hWnd) {
ctrlClient.SetFocus();
} else if(focus == ctrlClient.m_hWnd) {
ctrlFilterSel.SetFocus();
}
} else {
if(focus == ctrlClient.m_hWnd) {
ctrlUsers.SetFocus();
} else if(focus == ctrlUsers.m_hWnd) {
ctrlMessage.SetFocus();
} else if(focus == ctrlMessage.m_hWnd) {
ctrlFilter.SetFocus();
} else if(focus == ctrlFilter.m_hWnd) {
ctrlFilterSel.SetFocus();
} else if(focus == ctrlFilterSel.m_hWnd) {
ctrlClient.SetFocus();
}
}
}
bool HubFrame::matchFilter(const UserInfo& ui, int sel, bool doSizeCompare, FilterModes mode, int64_t size) {
if(filter.empty())
return true;
bool insert = false;
if(doSizeCompare) {
switch(mode) {
case FilterModes::EQUAL: insert = (size == ui.getIdentity().getBytesShared()); break;
case FilterModes::GREATER_EQUAL: insert = (size <= ui.getIdentity().getBytesShared()); break;
case FilterModes::LESS_EQUAL: insert = (size >= ui.getIdentity().getBytesShared()); break;
case FilterModes::GREATER: insert = (size < ui.getIdentity().getBytesShared()); break;
case FilterModes::LESS: insert = (size > ui.getIdentity().getBytesShared()); break;
case FilterModes::NOT_EQUAL: insert = (size != ui.getIdentity().getBytesShared()); break;
}
} else {
if(sel >= COLUMN_LAST) {
for(int i = COLUMN_FIRST; i < COLUMN_LAST; ++i) {
if(Util::findSubString(ui.getText(i), filter) != string::npos) {
insert = true;
break;
}
}
} else {
if(Util::findSubString(ui.getText(sel), filter) != string::npos)
insert = true;
}
}
return insert;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -