📄 hubframe.cpp
字号:
if(item->iItem != -1) {
ctrlUsers.getItemData(item->iItem)->getList();
}
return 0;
}
bool HubFrame::updateUser(const UserTask& u) {
UserMapIter i = userMap.find(u.user);
if(i == userMap.end()) {
UserInfo* ui = new UserInfo(u);
userMap.insert(make_pair(u.user, ui));
if(!ui->getIdentity().isHidden() && showUsers)
ctrlUsers.insertItem(ui, getImage(u.identity));
if(!filter.empty())
updateUserList(ui);
return true;
} else {
UserInfo* ui = i->second;
if(!ui->getIdentity().isHidden() && u.identity.isHidden() && showUsers) {
ctrlUsers.deleteItem(ui);
}
resort = ui->update(u.identity, ctrlUsers.getSortColumn()) || resort;
if(showUsers) {
int pos = ctrlUsers.findItem(ui);
if(pos != -1) {
ctrlUsers.updateItem(pos);
ctrlUsers.SetItem(pos, 0, LVIF_IMAGE, NULL, getImage(u.identity), 0, 0, NULL);
}
updateUserList(ui);
}
return false;
}
}
void HubFrame::removeUser(const User::Ptr& aUser) {
UserMapIter i = userMap.find(aUser);
if(i == userMap.end()) {
// Should never happen?
dcassert(i != userMap.end());
return;
}
UserInfo* ui = i->second;
if(!ui->getIdentity().isHidden() && showUsers)
ctrlUsers.deleteItem(ui);
userMap.erase(i);
delete ui;
}
HubFrame::UserInfo* HubFrame::findUser(const tstring& nick) {
for(UserMapIter i = userMap.begin(); i != userMap.end(); ++i) {
if(i->second->columns[COLUMN_NICK] == nick)
return i->second;
}
return 0;
}
bool HubFrame::UserInfo::update(const Identity& identity, int sortCol) {
bool needsSort = (getIdentity().isOp() != identity.isOp());
tstring old;
if(sortCol != -1)
old = columns[sortCol];
columns[COLUMN_NICK] = Text::toT(identity.getNick());
columns[COLUMN_SHARED] = Text::toT(Util::formatBytes(identity.getBytesShared()));
columns[COLUMN_DESCRIPTION] = Text::toT(identity.getDescription());
columns[COLUMN_TAG] = Text::toT(identity.getTag());
columns[COLUMN_CONNECTION] = Text::toT(identity.getConnection());
columns[COLUMN_EMAIL] = Text::toT(identity.getEmail());
columns[COLUMN_CID] = Text::toT(identity.getUser()->getCID().toBase32());
if(sortCol != -1) {
needsSort = needsSort || (old != columns[sortCol]);
}
setIdentity(identity);
return needsSort;
}
static const COLORREF RED = RGB(255, 0, 0);
static const COLORREF GREEN = RGB(0, 255, 0);
LRESULT HubFrame::onSpeaker(UINT /*uMsg*/, WPARAM /* wParam */, LPARAM /* lParam */, BOOL& /*bHandled*/) {
TaskList t;
{
Lock l(taskCS);
taskList.swap(t);
}
ctrlUsers.SetRedraw(FALSE);
for(TaskIter i = t.begin(); i != t.end(); ++i) {
Task* task = *i;
if(task->speaker == UPDATE_USER) {
updateUser(*static_cast<UserTask*>(task));
} else if(task->speaker == UPDATE_USER_JOIN) {
UserTask& u = *static_cast<UserTask*>(task);
if(updateUser(u)) {
if (showJoins || (favShowJoins && FavoriteManager::getInstance()->isFavoriteUser(u.user))) {
addLine(_T("*** ") + TSTRING(JOINS) + Text::toT(u.identity.getNick()));
}
}
} else if(task->speaker == REMOVE_USER) {
UserTask& u = *static_cast<UserTask*>(task);
removeUser(u.user);
if (showJoins || (favShowJoins && FavoriteManager::getInstance()->isFavoriteUser(u.user))) {
addLine(Text::toT("*** " + STRING(PARTS) + u.identity.getNick()));
}
} else if(task->speaker == CONNECTED) {
addClientLine(TSTRING(CONNECTED));
setTabColor(GREEN);
} else if(task->speaker == DISCONNECTED) {
clearUserList();
setTabColor(RED);
} else if(task->speaker == ADD_CHAT_LINE) {
addLine(static_cast<StringTask*>(task)->msg);
} else if(task->speaker == ADD_STATUS_LINE) {
addClientLine(static_cast<StringTask*>(task)->msg);
} else if(task->speaker == ADD_SILENT_STATUS_LINE) {
addClientLine(static_cast<StringTask*>(task)->msg, false);
} else if(task->speaker == SET_WINDOW_TITLE) {
SetWindowText(static_cast<StringTask*>(task)->msg.c_str());
} else if(task->speaker == STATS) {
ctrlStatus.SetText(1, Text::toT(Util::toString(showUsers ? ctrlUsers.GetItemCount() : getUserCount()) +
"/" + Util::toString(getUserCount()) + " " + STRING(HUB_USERS)).c_str());
ctrlStatus.SetText(2, Text::toT(Util::formatBytes(getAvailable())).c_str());
} else if(task->speaker == GET_PASSWORD) {
if(client->getPassword().size() > 0) {
client->password(client->getPassword());
addClientLine(TSTRING(STORED_PASSWORD_SENT));
} else {
if(!BOOLSETTING(PROMPT_PASSWORD)) {
ctrlMessage.SetWindowText(_T("/password "));
ctrlMessage.SetFocus();
ctrlMessage.SetSel(10, 10);
waitingForPW = true;
} else {
LineDlg linePwd;
linePwd.title = CTSTRING(ENTER_PASSWORD);
linePwd.description = CTSTRING(ENTER_PASSWORD);
linePwd.password = true;
if(linePwd.DoModal(m_hWnd) == IDOK) {
client->setPassword(Text::fromT(linePwd.line));
client->password(Text::fromT(linePwd.line));
waitingForPW = false;
} else {
client->disconnect(true);
}
}
}
} else if(task->speaker == PRIVATE_MESSAGE) {
PMTask& pm = *static_cast<PMTask*>(task);
if(pm.replyTo->isOnline()) {
if(BOOLSETTING(POPUP_PMS) || PrivateFrame::isOpen(pm.replyTo)) {
PrivateFrame::gotMessage(pm.from, pm.to, pm.replyTo, pm.msg);
} else {
addLine(TSTRING(PRIVATE_MESSAGE_FROM) + getNick(pm.from) + _T(": ") + pm.msg);
}
} else {
if(BOOLSETTING(IGNORE_OFFLINE)) {
addClientLine(TSTRING(IGNORED_MESSAGE) + pm.msg, false);
} else if(BOOLSETTING(POPUP_OFFLINE)) {
PrivateFrame::gotMessage(pm.from, pm.to, pm.replyTo, pm.msg);
} else {
addLine(TSTRING(PRIVATE_MESSAGE_FROM) + getNick(pm.from) + _T(": ") + pm.msg);
}
}
}
delete task;
}
if(resort && showUsers) {
ctrlUsers.resort();
resort = false;
}
ctrlUsers.SetRedraw(TRUE);
return 0;
}
void HubFrame::UpdateLayout(BOOL bResizeBars /* = TRUE */) {
RECT rect;
GetClientRect(&rect);
// position bars and offset their dimensions
UpdateBarsPosition(rect, bResizeBars);
if(ctrlStatus.IsWindow()) {
CRect sr;
int w[4];
ctrlStatus.GetClientRect(sr);
int tmp = (sr.Width()) > 332 ? 232 : ((sr.Width() > 132) ? sr.Width()-100 : 32);
w[0] = sr.right - tmp;
w[1] = w[0] + (tmp-32)/2;
w[2] = w[0] + (tmp-32);
w[3] = w[2] + 16;
ctrlStatus.SetParts(4, w);
ctrlLastLines.SetMaxTipWidth(w[0]);
// Strange, can't get the correct width of the last field...
ctrlStatus.GetRect(2, sr);
sr.left = sr.right + 2;
sr.right = sr.left + 16;
ctrlShowUsers.MoveWindow(sr);
}
int h = WinUtil::fontHeight + 4;
CRect rc = rect;
rc.bottom -= h + 10;
if(!showUsers) {
if(GetSinglePaneMode() == SPLIT_PANE_NONE)
SetSinglePaneMode(SPLIT_PANE_LEFT);
} else {
if(GetSinglePaneMode() != SPLIT_PANE_NONE)
SetSinglePaneMode(SPLIT_PANE_NONE);
}
SetSplitterRect(rc);
rc = rect;
rc.bottom -= 2;
rc.top = rc.bottom - h - 5;
rc.left +=2;
rc.right -= showUsers ? 202 : 2;
ctrlMessage.MoveWindow(rc);
if(showUsers){
rc.left = rc.right + 4;
rc.right = rc.left + 116;
ctrlFilter.MoveWindow(rc);
rc.left = rc.right + 4;
rc.right = rc.left + 76;
rc.top = rc.top + 0;
rc.bottom = rc.bottom + 120;
ctrlFilterSel.MoveWindow(rc);
}
}
LRESULT HubFrame::onClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) {
if(!closed) {
TimerManager::getInstance()->removeListener(this);
client->removeListener(this);
client->disconnect(true);
closed = true;
PostMessage(WM_CLOSE);
return 0;
} else {
SettingsManager::getInstance()->set(SettingsManager::GET_USER_INFO, showUsers);
FavoriteManager::getInstance()->removeUserCommand(Text::fromT(server));
clearUserList();
clearTaskList();
WinUtil::saveHeaderOrder(ctrlUsers, SettingsManager::HUBFRAME_ORDER,
SettingsManager::HUBFRAME_WIDTHS, COLUMN_LAST, columnIndexes, columnSizes);
FavoriteHubEntry *fhe = FavoriteManager::getInstance()->getFavoriteHubEntry(Text::fromT(server));
if(fhe != NULL && !IsIconic()){
CRect rc;
//Get position of window
GetWindowRect(&rc);
//convert the position so it's relative to main window
::ScreenToClient(GetParent(), &rc.TopLeft());
::ScreenToClient(GetParent(), &rc.BottomRight());
//save the position
fhe->setBottom((u_int16_t)(rc.bottom > 0 ? rc.bottom : 0));
fhe->setTop((u_int16_t)(rc.top > 0 ? rc.top : 0));
fhe->setLeft((u_int16_t)(rc.left > 0 ? rc.left : 0));
fhe->setRight((u_int16_t)(rc.right > 0 ? rc.right : 0));
FavoriteManager::getInstance()->save();
}
bHandled = FALSE;
return 0;
}
}
void HubFrame::clearUserList() {
ctrlUsers.DeleteAllItems();
for(UserMapIter i = userMap.begin(); i != userMap.end(); ++i) {
delete i->second;
}
userMap.clear();
}
void HubFrame::clearTaskList() {
Lock l(taskCS);
for_each(taskList.begin(), taskList.end(), DeleteFunction());
taskList.clear();
}
LRESULT HubFrame::onLButton(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
HWND focus = GetFocus();
bHandled = false;
if(focus == ctrlClient.m_hWnd) {
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
tstring x;
tstring::size_type start = (tstring::size_type)WinUtil::textUnderCursor(pt, ctrlClient, x);
tstring::size_type end = x.find(_T(" "), start);
if(end == tstring::npos)
end = x.length();
bHandled = WinUtil::parseDBLClick(x, start, end);
if (!bHandled) {
string::size_type end = x.find_first_of(_T(" >\t"), start+1);
if(end == tstring::npos) // get EOL as well
end = x.length();
else if(end == start + 1)
return 0;
// Nickname click, let's see if we can find one like it in the name list...
tstring nick = x.substr(start, end - start);
UserInfo* ui = findUser(nick);
if(ui) {
bHandled = true;
if (wParam & MK_CONTROL) { // MK_CONTROL = 0x0008
PrivateFrame::openWindow(ui->user);
} else if (wParam & MK_SHIFT) {
try {
QueueManager::getInstance()->addList(ui->user, QueueItem::FLAG_CLIENT_VIEW);
} catch(const Exception& e) {
addClientLine(Text::toT(e.getError()));
}
} else if(showUsers) {
int items = ctrlUsers.GetItemCount();
int pos = -1;
ctrlUsers.SetRedraw(FALSE);
for(int i = 0; i < items; ++i) {
if(ctrlUsers.getItemData(i) == ui)
pos = i;
ctrlUsers.SetItemState(i, (i == pos) ? LVIS_SELECTED | LVIS_FOCUSED : 0, LVIS_SELECTED | LVIS_FOCUSED);
}
ctrlUsers.SetRedraw(TRUE);
ctrlUsers.EnsureVisible(pos, FALSE);
}
}
}
}
return 0;
}
void HubFrame::addLine(const tstring& aLine) {
if(ctrlClient.GetWindowTextLength() > 25000) {
// We want to limit the buffer to 25000 characters...after that, w95 becomes sad...
ctrlClient.SetRedraw(FALSE);
ctrlClient.SetSel(0, ctrlClient.LineIndex(ctrlClient.LineFromChar(2000)), TRUE);
ctrlClient.ReplaceSel(_T(""));
ctrlClient.SetRedraw(TRUE);
}
BOOL noscroll = TRUE;
POINT p = ctrlClient.PosFromChar(ctrlClient.GetWindowTextLength() - 1);
CRect r;
ctrlClient.GetClientRect(r);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -