📄 hubframe.cpp
字号:
if(textStart == string::npos)
textStart = 0;
else
textStart++;
int start = ctrlUsers.GetNextItem(-1, LVNI_FOCUSED) + 1;
int i = start;
int j = ctrlUsers.GetItemCount();
bool firstPass = i < j;
if(!firstPass)
i = 0;
while(firstPass || (!firstPass && i < start)) {
UserInfo* ui = ctrlUsers.getItemData(i);
const tstring& nick = ui->columns[COLUMN_NICK];
bool found = (Util::strnicmp(nick, complete, complete.length()) == 0);
tstring::size_type x = 0;
if(!found) {
// Check if there's one or more [ISP] tags to ignore...
tstring::size_type y = 0;
while(nick[y] == _T('[')) {
x = nick.find(_T(']'), y);
if(x != string::npos) {
if(Util::strnicmp(nick.c_str() + x + 1, complete.c_str(), complete.length()) == 0) {
found = true;
break;
}
} else {
break;
}
y = x + 1; // assuming that nick[y] == '\0' is legal
}
}
if(found) {
if((start - 1) != -1) {
ctrlUsers.SetItemState(start - 1, 0, LVNI_SELECTED | LVNI_FOCUSED);
}
ctrlUsers.SetItemState(i, LVNI_FOCUSED | LVNI_SELECTED, LVNI_FOCUSED | LVNI_SELECTED);
ctrlUsers.EnsureVisible(i, FALSE);
ctrlMessage.SetSel(textStart, ctrlMessage.GetWindowTextLength(), TRUE);
ctrlMessage.ReplaceSel(nick.c_str());
return;
}
i++;
if(i == j) {
firstPass = false;
i = 0;
}
}
} else {
HWND focus = GetFocus();
if(focus == ctrlClient.m_hWnd) {
ctrlMessage.SetFocus();
} else if(focus == ctrlMessage.m_hWnd) {
ctrlUsers.SetFocus();
} else if(focus == ctrlUsers.m_hWnd) {
ctrlClient.SetFocus();
}
}
}
LRESULT HubFrame::onChar(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) {
if(!complete.empty() && wParam != VK_TAB && uMsg == WM_KEYDOWN)
complete.clear();
if (uMsg != WM_KEYDOWN) {
switch(wParam) {
case VK_RETURN:
if( (GetKeyState(VK_CONTROL) & 0x8000) || (GetKeyState(VK_MENU) & 0x8000) ) {
bHandled = FALSE;
}
break;
case VK_TAB:
bHandled = TRUE;
break;
default:
bHandled = FALSE;
break;
}
return 0;
}
switch(wParam) {
case VK_TAB:
onTab();
break;
case VK_RETURN:
if( (GetKeyState(VK_CONTROL) & 0x8000) ||
(GetKeyState(VK_MENU) & 0x8000) ) {
bHandled = FALSE;
} else {
onEnter();
}
break;
case VK_UP:
if ( (GetKeyState(VK_MENU) & 0x8000) || ( ((GetKeyState(VK_CONTROL) & 0x8000) == 0) ^ (BOOLSETTING( SETTINGS_USE_CTRL_FOR_LINE_HISTORY ) == true) ) ) {
//scroll up in chat command history
//currently beyond the last command?
if (curCommandPosition > 0) {
//check whether current command needs to be saved
if (curCommandPosition == prevCommands.size()) {
auto_ptr<TCHAR> messageContents(new TCHAR[ctrlMessage.GetWindowTextLength()+2]);
ctrlMessage.GetWindowText(messageContents.get(), ctrlMessage.GetWindowTextLength()+1);
currentCommand = tstring(messageContents.get());
}
//replace current chat buffer with current command
ctrlMessage.SetWindowText(prevCommands[--curCommandPosition].c_str());
}
// move cursor to end of line
ctrlMessage.SetSel(ctrlMessage.GetWindowTextLength(), ctrlMessage.GetWindowTextLength());
} else {
bHandled = FALSE;
}
break;
case VK_DOWN:
if ( (GetKeyState(VK_MENU) & 0x8000) || ( ((GetKeyState(VK_CONTROL) & 0x8000) == 0) ^ (BOOLSETTING( SETTINGS_USE_CTRL_FOR_LINE_HISTORY ) == true) ) ) {
//scroll down in chat command history
//currently beyond the last command?
if (curCommandPosition + 1 < prevCommands.size()) {
//replace current chat buffer with current command
ctrlMessage.SetWindowText(prevCommands[++curCommandPosition].c_str());
} else if (curCommandPosition + 1 == prevCommands.size()) {
//revert to last saved, unfinished command
ctrlMessage.SetWindowText(currentCommand.c_str());
++curCommandPosition;
}
// move cursor to end of line
ctrlMessage.SetSel(ctrlMessage.GetWindowTextLength(), ctrlMessage.GetWindowTextLength());
} else {
bHandled = FALSE;
}
break;
case VK_PRIOR: // page up
ctrlClient.SendMessage(WM_VSCROLL, SB_PAGEUP);
break;
case VK_NEXT: // page down
ctrlClient.SendMessage(WM_VSCROLL, SB_PAGEDOWN);
break;
case VK_HOME:
if (!prevCommands.empty() && (GetKeyState(VK_CONTROL) & 0x8000) || (GetKeyState(VK_MENU) & 0x8000)) {
curCommandPosition = 0;
auto_ptr<TCHAR> messageContents(new TCHAR[ctrlMessage.GetWindowTextLength()+2]);
ctrlMessage.GetWindowText(messageContents.get(), ctrlMessage.GetWindowTextLength()+1);
currentCommand = tstring(messageContents.get());
ctrlMessage.SetWindowText(prevCommands[curCommandPosition].c_str());
} else {
bHandled = FALSE;
}
break;
case VK_END:
if ((GetKeyState(VK_CONTROL) & 0x8000) || (GetKeyState(VK_MENU) & 0x8000)) {
curCommandPosition = prevCommands.size();
ctrlMessage.SetWindowText(currentCommand.c_str());
} else {
bHandled = FALSE;
}
break;
default:
bHandled = FALSE;
}
return 0;
}
LRESULT HubFrame::onShowUsers(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) {
bHandled = FALSE;
if((wParam == BST_CHECKED)) {
showUsers = true;
User::NickMap& lst = client->lockUserList();
ctrlUsers.SetRedraw(FALSE);
for(User::NickIter i = lst.begin(); i != lst.end(); ++i) {
updateUser(i->second);
}
client->unlockUserList();
ctrlUsers.SetRedraw(TRUE);
ctrlUsers.resort();
} else {
showUsers = false;
clearUserList();
}
SettingsManager::getInstance()->set(SettingsManager::GET_USER_INFO, showUsers);
UpdateLayout(FALSE);
return 0;
}
LRESULT HubFrame::onFollow(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(!redirect.empty()) {
string s, f;
u_int16_t p = 411;
Util::decodeUrl(Text::fromT(redirect), s, p, f);
if(ClientManager::getInstance()->isConnected(s, p)) {
addClientLine(TSTRING(REDIRECT_ALREADY_CONNECTED));
return 0;
}
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();
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(client->isConnected() && (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(TAB_DIRTY)) {
setDirty();
}
if(BOOLSETTING(STATUS_IN_CHAT) && inChat) {
addLine(_T("*** ") + aLine);
}
if(BOOLSETTING(LOG_STATUS_MESSAGES)) {
StringMap params;
params["hub"] = client->getName();
params["hubaddr"] = client->getAddressPort();
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, UPDATE_USERS);
}
}
void HubFrame::on(Connecting, Client*) throw() {
speak(ADD_STATUS_LINE, STRING(CONNECTING_TO) + client->getAddressPort() + "...");
speak(SET_WINDOW_TITLE, client->getAddressPort());
}
void HubFrame::on(Connected, Client*) throw() {
speak(CONNECTED);
}
void HubFrame::on(BadPassword, Client*) throw() {
client->setPassword(Util::emptyString);
}
void HubFrame::on(UserUpdated, Client*, const User::Ptr& user) throw() {
if(getUserInfo() && !user->isSet(User::HIDDEN))
speak(UPDATE_USER, user);
}
void HubFrame::on(UsersUpdated, Client*, const User::List& aList) throw() {
Lock l(updateCS);
updateList.reserve(aList.size());
for(User::List::const_iterator i = aList.begin(); i != aList.end(); ++i) {
if(!(*i)->isSet(User::HIDDEN))
updateList.push_back(make_pair(*i, UPDATE_USERS));
}
if(!updateList.empty()) {
PostMessage(WM_SPEAKER, UPDATE_USERS);
}
}
void HubFrame::on(UserRemoved, Client*, const User::Ptr& user) throw() {
if(getUserInfo())
speak(REMOVE_USER, user);
}
void HubFrame::on(Redirect, Client*, const string& line) throw() {
string s, f;
u_int16_t p = 411;
Util::decodeUrl(line, s, p, f);
if(ClientManager::getInstance()->isConnected(s, p)) {
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->getName(), true, false) + " (" + client->getAddressPort() + ")");
}
void HubFrame::on(Message, Client*, const string& line) throw() {
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 User::Ptr& user, const string& line) throw() {
speak(PRIVATE_MESSAGE, user, Util::toDOS(line));
}
void HubFrame::on(NickTaken, Client*) throw() {
speak(ADD_STATUS_LINE, STRING(NICK_TAKEN));
speak(DISCONNECTED);
}
void HubFrame::on(SearchFlood, Client*, const string& line) throw() {
speak(ADD_STATUS_LINE, STRING(SEARCH_SPAM_FROM) + line);
}
/**
* @file
* $Id: HubFrame.cpp,v 1.101 2005/03/19 16:17:42 arnetheduck Exp $
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -