📄 hubframe.cpp
字号:
break;
case REMOVE_USER:
int j = findUser(u);
if( j != -1 ) {
UserInfo* ui = ctrlUsers.getItemData(j);
ctrlUsers.DeleteItem(j);
if (showJoins || (favShowJoins && u->isFavoriteUser())) {
addLine(Text::toT("*** " + STRING(PARTS) + u->getNick()));
}
dcassert(userMap[u] == ui);
userMap.erase(u);
delete ui;
}
break;
}
}
updateList.clear();
}
if(ctrlUsers.getSortColumn() != COLUMN_NICK)
ctrlUsers.resort();
ctrlUsers.SetRedraw(TRUE);
} else if(wParam == DISCONNECTED) {
clearUserList();
setTabColor(RGB(255, 0, 0));
} else if(wParam == CONNECTED) {
addClientLine(TSTRING(CONNECTED));
setTabColor(RGB(0, 255, 0));
} else if(wParam == ADD_CHAT_LINE) {
tstring* x = (tstring*)lParam;
addLine(*x);
delete x;
} else if(wParam == ADD_STATUS_LINE) {
tstring* x = (tstring*)lParam;
addClientLine(*x);
delete x;
} else if(wParam == ADD_SILENT_STATUS_LINE) {
tstring* x = (tstring*)lParam;
addClientLine(*x, false);
delete x;
} else if(wParam == SET_WINDOW_TITLE) {
tstring* x = (tstring*)lParam;
SetWindowText(x->c_str());
delete x;
} else if(wParam == STATS) {
ctrlStatus.SetText(1, Text::toT(Util::toString(client->getUserCount()) + " " + STRING(HUB_USERS)).c_str());
ctrlStatus.SetText(2, Text::toT(Util::formatBytes(client->getAvailable())).c_str());
} else if(wParam == GET_PASSWORD) {
if(client->getPassword().size() > 0) {
client->password(client->getPassword());
addClientLine(TSTRING(STORED_PASSWORD_SENT));
} else {
ctrlMessage.SetWindowText(_T("/password "));
ctrlMessage.SetFocus();
ctrlMessage.SetSel(10, 10);
waitingForPW = true;
}
} else if(wParam == PRIVATE_MESSAGE) {
PMInfo* i = (PMInfo*)lParam;
if(i->user->isOnline()) {
if(BOOLSETTING(POPUP_PMS) || PrivateFrame::isOpen(i->user)) {
PrivateFrame::gotMessage(i->user, i->msg);
} else {
addLine(TSTRING(PRIVATE_MESSAGE_FROM) + Text::toT(i->user->getNick()) + _T(": ") + i->msg);
}
} else {
if(BOOLSETTING(IGNORE_OFFLINE)) {
addClientLine(TSTRING(IGNORED_MESSAGE) + i->msg, false);
} else if(BOOLSETTING(POPUP_OFFLINE)) {
PrivateFrame::gotMessage(i->user, i->msg);
} else {
addLine(TSTRING(PRIVATE_MESSAGE_FROM) + Text::toT(i->user->getNick()) + _T(": ") + i->msg);
}
}
delete i;
}
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]);
ctrlLastLines.SetWindowPos(HWND_TOPMOST, sr.left, sr.top, sr.Width(), sr.Height(), SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
// 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 -=2;
ctrlMessage.MoveWindow(rc);
}
LRESULT HubFrame::onClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) {
if(!closed) {
TimerManager::getInstance()->removeListener(this);
client->removeListener(this);
client->disconnect();
closed = true;
PostMessage(WM_CLOSE);
return 0;
} else {
SettingsManager::getInstance()->set(SettingsManager::GET_USER_INFO, showUsers);
HubManager::getInstance()->removeUserCommand(Text::fromT(server));
userMap.clear();
int i = 0;
int j = ctrlUsers.GetItemCount();
while(i < j) {
delete ctrlUsers.getItemData(i);
i++;
}
WinUtil::saveHeaderOrder(ctrlUsers, SettingsManager::HUBFRAME_ORDER,
SettingsManager::HUBFRAME_WIDTHS, COLUMN_LAST, columnIndexes, columnSizes);
FavoriteHubEntry *fhe = HubManager::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));
HubManager::getInstance()->save();
}
bHandled = FALSE;
return 0;
}
}
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;
string::size_type start = (string::size_type)WinUtil::textUnderCursor(pt, ctrlClient, x);
string::size_type end = x.find(_T(" "), start);
if(end == string::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 == string::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...
int pos = ctrlUsers.findItem(x.substr(start, end - start));
if(pos != -1) {
bHandled = true;
if (wParam & MK_CONTROL) { // MK_CONTROL = 0x0008
PrivateFrame::openWindow((ctrlUsers.getItemData(pos))->user);
} else if (wParam & MK_SHIFT) {
try {
QueueManager::getInstance()->addList((ctrlUsers.getItemData(pos))->user, QueueItem::FLAG_CLIENT_VIEW);
} catch(const Exception& e) {
addClientLine(Text::toT(e.getError()));
}
} else {
int items = ctrlUsers.GetItemCount();
ctrlUsers.SetRedraw(FALSE);
for(int i = 0; i < items; ++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);
if( r.PtInRect(p) || MDIGetActive() != m_hWnd)
noscroll = FALSE;
else {
ctrlClient.SetRedraw(FALSE); // Strange!! This disables the scrolling...????
}
if(BOOLSETTING(LOG_MAIN_CHAT)) {
StringMap params;
params["message"] = Text::fromT(aLine);
params["hub"] = client->getName();
params["hubaddr"] = client->getAddressPort();
params["mynick"] = client->getNick();
LOG(LogManager::CHAT, params);
}
if(timeStamps) {
ctrlClient.AppendText((Text::toT("\r\n[" + Util::getShortTimeString() + "] ") + aLine).c_str());
} else {
ctrlClient.AppendText((_T("\r\n") + aLine).c_str());
}
if(noscroll) {
ctrlClient.SetRedraw(TRUE);
}
if (BOOLSETTING(TAB_DIRTY)) {
setDirty();
}
}
LRESULT HubFrame::onTabContextMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) {
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; // location of mouse click
tabMenuShown = true;
prepareMenu(tabMenu, ::UserCommand::CONTEXT_HUB, Text::toT(client->getAddressPort()), client->getOp());
tabMenu.AppendMenu(MF_SEPARATOR);
tabMenu.AppendMenu(MF_STRING, IDC_CLOSE_WINDOW, CTSTRING(CLOSE));
tabMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_BOTTOMALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
tabMenu.DeleteMenu(tabMenu.GetMenuItemCount()-1, MF_BYPOSITION);
tabMenu.DeleteMenu(tabMenu.GetMenuItemCount()-1, MF_BYPOSITION);
cleanMenu(tabMenu);
return TRUE;
}
LRESULT HubFrame::onContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) {
RECT rc;
POINT pt;
GetCursorPos(&pt); //need cursor pos
ctrlClient.GetWindowRect(&rc);
bool doMenu = false;
if (PtInRect(&rc, pt)) {
tstring x;
ctrlClient.ScreenToClient(&pt);
string::size_type start = (string::size_type)WinUtil::textUnderCursor(pt, ctrlClient, x);
ctrlClient.ClientToScreen(&pt);
string::size_type end = x.find_first_of(_T(" >\t"), start+1);
if(end == string::npos) // get EOL as well
end = x.length();
else if(end == start + 1) {
bHandled = FALSE;
return FALSE;
}
// Nickname click, let's see if we can find one like it in the name list...
int pos = ctrlUsers.findItem(x.substr(start, end - start));
if(pos != -1) {
int items = ctrlUsers.GetItemCount();
ctrlUsers.SetRedraw(FALSE);
for(int i = 0; i < items; ++i) {
ctrlUsers.SetItemState(i, (i == pos) ? LVIS_SELECTED | LVIS_FOCUSED : 0, LVIS_SELECTED | LVIS_FOCUSED);
}
ctrlUsers.SetRedraw(TRUE);
ctrlUsers.EnsureVisible(pos, FALSE);
doMenu = true;
}
}
if((doMenu || ((HWND)wParam == ctrlUsers)) && ctrlUsers.GetSelectedCount() > 0) {
tabMenuShown = false;
prepareMenu(userMenu, ::UserCommand::CONTEXT_CHAT, Text::toT(client->getAddressPort()), client->getOp());
checkAdcItems(userMenu);
userMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
cleanMenu(userMenu);
return TRUE;
} else {
bHandled = FALSE; //needed to popup context menu under userlist
}
return FALSE;
}
void HubFrame::runUserCommand(::UserCommand& uc) {
if(!WinUtil::getUCParams(m_hWnd, uc, ucParams))
return;
ucParams["mynick"] = client->getNick();
ucParams["mycid"] = client->getMe()->getCID().toBase32();
if(tabMenuShown) {
client->escapeParams(ucParams);
client->sendUserCmd(Util::formatParams(uc.getCommand(), ucParams));
} else {
int sel = -1;
while((sel = ctrlUsers.GetNextItem(sel, LVNI_SELECTED)) != -1) {
UserInfo* u = (UserInfo*) ctrlUsers.GetItemData(sel);
StringMap tmp = ucParams;
u->user->getParams(tmp);
client->escapeParams(tmp);
client->sendUserCmd(Util::formatParams(uc.getCommand(), tmp));
}
}
return;
};
void HubFrame::onTab() {
if( BOOLSETTING(TAB_COMPLETION) &&
(GetFocus() == ctrlMessage.m_hWnd) &&
!(GetAsyncKeyState(VK_SHIFT) & 0x8000) )
{
int n = ctrlMessage.GetWindowTextLength();
AutoArray<TCHAR> buf(n+1);
ctrlMessage.GetWindowText(buf, n+1);
tstring text(buf, n);
string::size_type textStart = text.find_last_of(_T(" \n\t"));
if(complete.empty()) {
if(textStart != string::npos) {
complete = text.substr(textStart + 1);
} else {
complete = text;
}
if(complete.empty()) {
// Still empty, no text entered...
return;
}
int y = ctrlUsers.GetItemCount();
for(int x = 0; x < y; ++x)
ctrlUsers.SetItemState(x, 0, LVNI_FOCUSED | LVNI_SELECTED);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -