📄 hubframe.cpp
字号:
StringList l;
l.push_back(u->getNick());
l.push_back(Util::formatBytes(u->getBytesShared()));
l.push_back(u->getDescription());
l.push_back(u->getTag());
l.push_back(u->getConnection());
l.push_back(u->getEmail());
ctrlUsers.insert(l, getImage(u), (LPARAM)ui);
return newUser;
} else {
i = ctrlUsers.insert(ctrlUsers.GetItemCount(), u->getNick(), getImage(u), (LPARAM)ui);
}
} else {
ctrlUsers.SetItem(i, 0, LVIF_IMAGE, NULL, getImage(u), 0, 0, NULL);
}
ctrlUsers.SetItemText(i, COLUMN_SHARED, Util::formatBytes(u->getBytesShared()).c_str());
ctrlUsers.SetItemText(i, COLUMN_DESCRIPTION, u->getDescription().c_str());
ctrlUsers.SetItemText(i, COLUMN_TAG, u->getTag().c_str());
ctrlUsers.SetItemText(i, COLUMN_CONNECTION, u->getConnection().c_str());
ctrlUsers.SetItemText(i, COLUMN_EMAIL, u->getEmail().c_str());
if(sorted && ctrlUsers.getSortColumn() != COLUMN_NICK) {
needSort = true;
}
if(!newUser && ui)
delete ui;
return newUser;
}
LRESULT HubFrame::onSpeaker(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
if(wParam == UPDATE_USER) {
UserInfo* ui = (UserInfo*)lParam;
User::Ptr& u = ui->user;
if(updateUser(u, true, ui) && showJoins) {
addLine("*** " + STRING(JOINS) + ui->user->getNick());
}
} else if(wParam == UPDATE_USERS) {
User::List* ul = (User::List*)lParam;
ctrlUsers.SetRedraw(FALSE);
for(User::Iter i = ul->begin(); i != ul->end(); ++i) {
updateUser(*i);
}
ctrlUsers.SetRedraw(TRUE);
ctrlUsers.resort();
delete ul;
} else if(wParam == REMOVE_USER) {
UserInfo* ui = (UserInfo*)lParam;
int j = ctrlUsers.find( ui->user->getNick() );
if( j != -1 ) {
delete (UserInfo*)ctrlUsers.GetItemData(j);
ctrlUsers.DeleteItem(j);
if(showJoins) {
addLine("*** " + STRING(PARTS) + ui->user->getNick());
}
}
delete ui;
} else if(wParam == DISCONNECTED) {
clearUserList();
setTabColor(RGB(255, 0, 0));
} else if(wParam == CONNECTED) {
addClientLine(STRING(CONNECTED));
setTabColor(RGB(0, 255, 0));
} else if(wParam == ADD_CHAT_LINE) {
string* x = (string*)lParam;
addLine(*x);
delete x;
} else if(wParam == ADD_STATUS_LINE) {
string* x = (string*)lParam;
addClientLine(*x);
delete x;
} else if(wParam == ADD_SILENT_STATUS_LINE) {
string* x = (string*)lParam;
addClientLine(*x, false);
delete x;
} else if(wParam == SET_WINDOW_TITLE) {
string* x = (string*)lParam;
SetWindowText(x->c_str());
delete x;
} else if(wParam == STATS) {
ctrlStatus.SetText(1, (Util::toString(client->getUserCount()) + " " + STRING(HUB_USERS)).c_str());
if(client->getUserInfo())
ctrlStatus.SetText(2, Util::formatBytes(client->getAvailable()).c_str());
else
ctrlStatus.SetText(2, "");
if(needSort) {
ctrlUsers.resort();
needSort = false;
}
} else if(wParam == GET_PASSWORD) {
if(client->getPassword().size() > 0) {
client->password(client->getPassword());
} else {
ctrlMessage.SetWindowText("/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, m_hWndMDIClient, getTab());
} else {
addLine(STRING(PRIVATE_MESSAGE_FROM) + i->user->getNick() + ": " + i->msg);
}
} else {
if(BOOLSETTING(IGNORE_OFFLINE)) {
addClientLine(STRING(IGNORED_MESSAGE) + i->msg, false);
} else if(BOOLSETTING(POPUP_OFFLINE)) {
PrivateFrame::gotMessage(i->user, i->msg, m_hWndMDIClient, getTab());
} else {
addLine(STRING(PRIVATE_MESSAGE_FROM) + i->user->getNick() + ": " + 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);
// 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(!client->getUserInfo()) {
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, client->getUserInfo());
int i = 0;
int j = ctrlUsers.GetItemCount();
while(i < j) {
delete (UserInfo*)ctrlUsers.GetItemData(i);
i++;
}
WinUtil::saveHeaderOrder(ctrlUsers, SettingsManager::HUBFRAME_ORDER,
SettingsManager::HUBFRAME_WIDTHS, COLUMN_LAST, columnIndexes, columnSizes);
MDIDestroy(m_hWnd);
return 0;
}
}
static int textUnderCursor(POINT p, CEdit& ctrl, string& x) {
int i = ctrl.CharFromPos(p);
int line = ctrl.LineFromChar(i);
int c = LOWORD(i) - ctrl.LineIndex(line);
int len = ctrl.LineLength(i) + 1;
if(len < 3) {
return 0;
}
char* buf = new char[len];
ctrl.GetLine(line, buf, len);
x = string(buf, len-1);
delete buf;
string::size_type start = x.rfind(' ', c);
string::size_type start2 = x.rfind('<', c);
if(start == string::npos)
start = 0;
else
start++;
if(start2 == string::npos)
start2 = 0;
else
start2++;
return max(start, start2);
}
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) };
string x;
string::size_type start = (string::size_type)textUnderCursor(pt, ctrlClient, x);
if( (Util::strnicmp(x.c_str() + start, "http://", 7) == 0) ||
(Util::strnicmp(x.c_str() + start, "www.", 4) == 0) ||
(Util::strnicmp(x.c_str() + start, "ftp://", 6) == 0) ) {
bHandled = true;
// Web links...
string::size_type end = x.find(' ', start + 7);
if(end == string::npos) {
end = x.length();
}
if(end < start + 10) {
return 0;
}
ShellExecute(NULL, NULL, x.substr(start, end-start).c_str(), NULL, NULL, SW_SHOWNORMAL);
} else if(Util::strnicmp(x.c_str() + start, "dchub://", 8) == 0) {
bHandled = true;
string server, file;
short port = 411;
Util::decodeUrl((x.c_str() + start), server, port, file);
HubFrame::openWindow(m_hWndMDIClient, getTab(), server + ":" + Util::toString(port));
} else {
string::size_type end = x.find_first_of("> \t\r\n", start+1);
if(end == string::npos || end == start + 1) {
return 0;
}
// Nickname click, let's see if we can find one like it in the name list...
int pos = ctrlUsers.find(x.substr(start + 1, end - start - 1));
if(pos != -1) {
bHandled = true;
if (wParam & MK_CONTROL) { // MK_CONTROL = 0x0008
PrivateFrame::openWindow(((UserInfo*)ctrlUsers.GetItemData(pos))->user, m_hWndMDIClient, getTab());
} else if (wParam & MK_SHIFT) {
try {
QueueManager::getInstance()->addList(((UserInfo*)ctrlUsers.GetItemData(pos))->user);
} catch(const Exception& e) {
addClientLine(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 string& 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("");
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"] = aLine;
LOG(client->getServer(), Util::formatParams(SETTING(LOG_FORMAT_MAIN_CHAT), params));
}
if(timeStamps) {
ctrlClient.AppendText(("\r\n[" + Util::getShortTimeString() + "] " + aLine).c_str());
} else {
ctrlClient.AppendText(("\r\n" + aLine).c_str());
}
if(noscroll) {
ctrlClient.SetRedraw(TRUE);
}
setDirty();
}
LRESULT HubFrame::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
ctrlClient.GetClientRect(&rc);
if(uMsg == WM_CONTEXTMENU)
ctrlClient.ScreenToClient(&pt);
bool showMenu = false;
if (PtInRect(&rc, pt)) {
string x;
string::size_type start = (string::size_type)textUnderCursor(pt, ctrlClient, x);
string::size_type end = x.find_first_of(" >\t\r\n", start+1);
if(end == string::npos || 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.find(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);
ctrlClient.ClientToScreen(&pt);
showMenu = true;
} else {
bHandled = FALSE;
}
} else {
ctrlClient.ClientToScreen(&pt);
// Get the bounding rectangle of the client area.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -