📄 hubframe.cpp
字号:
/*
* Copyright (C) 2001-2003 Jacek Sieka, j_s@telia.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "stdafx.h"
#include "../client/DCPlusPlus.h"
#include "Resource.h"
#include "HubFrame.h"
#include "LineDlg.h"
#include "SearchFrm.h"
#include "PrivateFrame.h"
#include "../client/QueueManager.h"
#include "../client/ShareManager.h"
#include "../client/Util.h"
#include "../client/UploadManager.h"
#include "../client/StringTokenizer.h"
#include "../client/HubManager.h"
#include "../client/LogManager.h"
HubFrame::FrameMap HubFrame::frames;
int HubFrame::columnSizes[] = { 100, 75, 75, 100, 75, 100 };
int HubFrame::columnIndexes[] = { COLUMN_NICK, COLUMN_SHARED, COLUMN_DESCRIPTION, COLUMN_TAG, COLUMN_CONNECTION, COLUMN_EMAIL };
static ResourceManager::Strings columnNames[] = { ResourceManager::NICK, ResourceManager::SHARED,
ResourceManager::DESCRIPTION, ResourceManager::TAG, ResourceManager::CONNECTION, ResourceManager::EMAIL };
LRESULT HubFrame::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
CreateSimpleStatusBar(ATL_IDS_IDLEMESSAGE, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP);
ctrlStatus.Attach(m_hWndStatusBar);
ctrlClient.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
WS_VSCROLL | ES_MULTILINE | ES_NOHIDESEL | ES_READONLY, WS_EX_CLIENTEDGE);
ctrlClient.FmtLines(TRUE);
ctrlClient.LimitText(0);
ctrlClient.SetFont(WinUtil::font);
clientContainer.SubclassWindow(ctrlClient.m_hWnd);
ctrlMessage.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE, WS_EX_CLIENTEDGE);
ctrlMessageContainer.SubclassWindow(ctrlMessage.m_hWnd);
ctrlMessage.SetFont(WinUtil::font);
ctrlUsers.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
WS_HSCROLL | WS_VSCROLL | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS, WS_EX_CLIENTEDGE, IDC_USERS);
if(BOOLSETTING(FULL_ROW_SELECT)) {
ctrlUsers.SetExtendedListViewStyle(LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT);
} else {
ctrlUsers.SetExtendedListViewStyle(LVS_EX_HEADERDRAGDROP);
}
SetSplitterPanes(ctrlClient.m_hWnd, ctrlUsers.m_hWnd, false);
SetSplitterExtendedStyle(SPLIT_PROPORTIONAL);
m_nProportionalPos = 7500;
ctrlShowUsers.Create(ctrlStatus.m_hWnd, rcDefault, "+/-", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
ctrlShowUsers.SetButtonStyle(BS_AUTOCHECKBOX, false);
ctrlShowUsers.SetFont(WinUtil::systemFont);
ctrlShowUsers.SetCheck(client->getUserInfo());
showUsersContainer.SubclassWindow(ctrlShowUsers.m_hWnd);
WinUtil::splitTokens(columnIndexes, SETTING(HUBFRAME_ORDER), COLUMN_LAST);
WinUtil::splitTokens(columnSizes, SETTING(HUBFRAME_WIDTHS), COLUMN_LAST);
for(int j=0; j<COLUMN_LAST; j++) {
int fmt = (j == COLUMN_SHARED) ? LVCFMT_RIGHT : LVCFMT_LEFT;
ctrlUsers.InsertColumn(j, CSTRING_I(columnNames[j]), fmt, columnSizes[j], j);
}
ctrlUsers.SetColumnOrderArray(COLUMN_LAST, columnIndexes);
ctrlUsers.SetBkColor(WinUtil::bgColor);
ctrlUsers.SetTextBkColor(WinUtil::bgColor);
ctrlUsers.SetTextColor(WinUtil::textColor);
ctrlUsers.setSort(COLUMN_NICK, ExListViewCtrl::SORT_FUNC, true, sortNick);
ctrlUsers.SetImageList(WinUtil::userImages, LVSIL_SMALL);
userMenu.CreatePopupMenu();
userMenu.AppendMenu(MF_STRING, IDC_GETLIST, CSTRING(GET_FILE_LIST));
userMenu.AppendMenu(MF_STRING, IDC_PRIVATEMESSAGE, CSTRING(SEND_PRIVATE_MESSAGE));
userMenu.AppendMenu(MF_STRING, IDC_GRANTSLOT, CSTRING(GRANT_EXTRA_SLOT));
userMenu.AppendMenu(MF_STRING, IDC_ADD_TO_FAVORITES, CSTRING(ADD_TO_FAVORITES));
userMenu.AppendMenu(MF_STRING, IDC_COPY_NICK, CSTRING(COPY_NICK));
userMenu.AppendMenu(MF_SEPARATOR, 0, (LPCTSTR)NULL);
userMenu.AppendMenu(MF_STRING, IDC_REFRESH, CSTRING(REFRESH_USER_LIST));
opMenu.CreatePopupMenu();
opMenu.AppendMenu(MF_STRING, IDC_GETLIST, CSTRING(GET_FILE_LIST));
opMenu.AppendMenu(MF_STRING, IDC_PRIVATEMESSAGE, CSTRING(SEND_PRIVATE_MESSAGE));
opMenu.AppendMenu(MF_STRING, IDC_GRANTSLOT, CSTRING(GRANT_EXTRA_SLOT));
opMenu.AppendMenu(MF_STRING, IDC_COPY_NICK, CSTRING(COPY_NICK));
opMenu.AppendMenu(MF_STRING, IDC_ADD_TO_FAVORITES, CSTRING(ADD_TO_FAVORITES));
opMenu.AppendMenu(MF_SEPARATOR, 0, (LPCTSTR)NULL);
opMenu.AppendMenu(MF_STRING, IDC_REFRESH, CSTRING(REFRESH_USER_LIST));
opMenu.AppendMenu(MF_SEPARATOR, 0, (LPCTSTR)NULL);
opMenu.AppendMenu(MF_STRING, IDC_KICK, CSTRING(KICK_USER));
opMenu.AppendMenu(MF_STRING, IDC_REDIRECT, CSTRING(REDIRECT));
showJoins = BOOLSETTING(SHOW_JOINS);
bHandled = FALSE;
client->connect(server);
return 1;
}
void HubFrame::openWindow(HWND aParent, FlatTabCtrl* aTab, const string& aServer, const string& aNick /* = Util::emptyString */, const string& aPassword /* = Util::emptyString */, const string& aDescription /* = Util::emptyString */) {
FrameIter i = frames.find(aServer);
if(i == frames.end()) {
HubFrame* frm = new HubFrame(aServer, aNick, aPassword, aDescription);
frames[aServer] = frm;
frm->setTab(aTab);
frm->CreateEx(aParent);
} else {
i->second->MDIActivate(i->second->m_hWnd);
}
}
void HubFrame::onEnter() {
char* message;
if(ctrlMessage.GetWindowTextLength() > 0) {
message = new char[ctrlMessage.GetWindowTextLength()+1];
ctrlMessage.GetWindowText(message, ctrlMessage.GetWindowTextLength()+1);
string s(message, ctrlMessage.GetWindowTextLength());
delete[] message;
// Special command
if(s[0] == '/') {
string param;
string message;
string status;
if(WinUtil::checkCommand(m_hWndMDIClient, s, param, message, status)) {
if(!message.empty()) {
client->sendMessage(message);
}
if(!status.empty()) {
addClientLine(status);
}
} else if(Util::stricmp(s.c_str(), "join")==0) {
if(!param.empty()) {
client->connect(param);
} else {
addClientLine(STRING(SPECIFY_SERVER));
}
} else if(Util::stricmp(s.c_str(), "clear") == 0) {
ctrlClient.SetWindowText("");
} else if(Util::stricmp(s.c_str(), "ts") == 0) {
timeStamps = !timeStamps;
if(timeStamps) {
addClientLine(STRING(TIMESTAMPS_ENABLED));
} else {
addClientLine(STRING(TIMESTAMPS_DISABLED));
}
} else if( (Util::stricmp(s.c_str(), "password") == 0) && waitingForPW ) {
client->setPassword(param);
client->password(param);
waitingForPW = false;
} else if( Util::stricmp(s.c_str(), "showjoins") == 0 ) {
showJoins = !showJoins;
if(showJoins) {
addClientLine(STRING(JOIN_SHOWING_ON));
} else {
addClientLine(STRING(JOIN_SHOWING_OFF));
}
} else if(Util::stricmp(s.c_str(), "close") == 0) {
PostMessage(WM_CLOSE);
} else if(Util::stricmp(s.c_str(), "userlist") == 0) {
ctrlShowUsers.SetCheck(client->getUserInfo() ? BST_UNCHECKED : BST_CHECKED);
} else if(Util::stricmp(s.c_str(), "connection") == 0) {
addClientLine((STRING(IP) + client->getLocalIp() + ", " + STRING(PORT) + Util::toString(SETTING(IN_PORT))));
} else if((Util::stricmp(s.c_str(), "favorite") == 0) || (Util::stricmp(s.c_str(), "fav") == 0)) {
FavoriteHubEntry aEntry;
char buf[256];
this->GetWindowText(buf, 255);
aEntry.setServer(server);
aEntry.setName(buf);
aEntry.setDescription(buf);
aEntry.setConnect(TRUE);
HubManager::getInstance()->addFavorite(aEntry);
addLine(STRING(FAVORITE_HUB_ADDED));
} else if(Util::stricmp(s.c_str(), "help") == 0) {
addLine("*** " + WinUtil::commands + ", /join <hub-ip>, /clear, /ts, /showjoins, /close, /userlist, /connection, /favorite");
}
} else {
client->sendMessage(s);
}
ctrlMessage.SetWindowText("");
} else {
MessageBeep(MB_ICONEXCLAMATION);
}
}
LRESULT HubFrame::onGetList(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
int i=-1;
if(client->isConnected()) {
while( (i = ctrlUsers.GetNextItem(i, LVNI_SELECTED)) != -1) {
try {
QueueManager::getInstance()->addList(((UserInfo*)ctrlUsers.GetItemData(i))->user);
} catch(const Exception& e) {
addClientLine(e.getError());
}
}
}
return 0;
}
LRESULT HubFrame::onAddToFavorites(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
int i=-1;
if(client->isConnected()) {
while( (i = ctrlUsers.GetNextItem(i, LVNI_SELECTED)) != -1) {
HubManager::getInstance()->addFavoriteUser(((UserInfo*)ctrlUsers.GetItemData(i))->user);
}
}
return 0;
}
LRESULT HubFrame::onCopyNick(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
int i=-1;
if(client->isConnected()) {
string nicks;
while( (i = ctrlUsers.GetNextItem(i, LVNI_SELECTED)) != -1) {
nicks += ((UserInfo*)ctrlUsers.GetItemData(i))->user->getNick();
nicks += ' ';
}
if(!nicks.empty()) {
// remove last space
nicks.erase(nicks.length() - 1);
if(!OpenClipboard()) {
return 0;
}
EmptyClipboard();
// Allocate a global memory object for the text.
HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (nicks.size() + 1));
if (hglbCopy == NULL) {
CloseClipboard();
return FALSE;
}
// Lock the handle and copy the text to the buffer.
char* lptstrCopy = (char*)GlobalLock(hglbCopy);
memcpy(lptstrCopy, nicks.c_str(), nicks.length() + 1);
GlobalUnlock(hglbCopy);
// Place the handle on the clipboard.
SetClipboardData(CF_TEXT, hglbCopy);
CloseClipboard();
}
}
return 0;
}
LRESULT HubFrame::onPrivateMessage(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
int i=-1;
if(client->isConnected()) {
while( (i = ctrlUsers.GetNextItem(i, LVNI_SELECTED)) != -1) {
PrivateFrame::openWindow(((UserInfo*)ctrlUsers.GetItemData(i))->user, m_hWndMDIClient, getTab());
}
}
return 0;
}
LRESULT HubFrame::onDoubleClickUsers(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) {
NMITEMACTIVATE* item = (NMITEMACTIVATE*)pnmh;
if(client->isConnected() && item->iItem != -1) {
try {
QueueManager::getInstance()->addList(((UserInfo*)ctrlUsers.GetItemData(item->iItem))->user);
} catch(const Exception& e) {
addClientLine(e.getError());
}
}
return 0;
}
LRESULT HubFrame::onKick(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
LineDlg dlg;
dlg.title = STRING(KICK_USER);
dlg.description = STRING(ENTER_REASON);
dlg.line = lastKick;
if(dlg.DoModal() == IDOK) {
lastKick = dlg.line;
int i = -1;
int k = 0;
bool op = false;
while( (k < 15) && (!op) && ((i = ctrlUsers.GetNextItem(i, LVNI_SELECTED)) != -1) ) {
UserInfo* ui = (UserInfo*)ctrlUsers.GetItemData(i);
if(ui->user->isSet(User::OP))
op = true;
ui->user->kick(dlg.line);
k++;
}
}
return 0;
};
LRESULT HubFrame::onGrantSlot(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
int i = -1;
while( (i = ctrlUsers.GetNextItem(i, LVNI_SELECTED)) != -1) {
UploadManager::getInstance()->reserveSlot(((UserInfo*)ctrlUsers.GetItemData(i))->user);
}
return 0;
};
LRESULT HubFrame::onRedirect(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
LineDlg dlg1, dlg2;
dlg1.title = STRING(REDIRECT_USER);
dlg1.description = STRING(ENTER_REASON);
dlg1.line = lastRedir;
if(dlg1.DoModal() == IDOK) {
dlg2.title = STRING(REDIRECT_USER);
dlg2.description = STRING(ENTER_SERVER);
dlg2.line = lastServer;
if(dlg2.DoModal() == IDOK) {
lastRedir = dlg1.line;
lastServer = dlg2.line;
int i = -1;
while( (i = ctrlUsers.GetNextItem(i, LVNI_SELECTED)) != -1) {
client->opForceMove(((UserInfo*)ctrlUsers.GetItemData(i))->user, dlg2.line, STRING(YOU_ARE_BEING_REDIRECTED) + dlg2.line + ": " + dlg1.line);
}
}
}
return 0;
};
bool HubFrame::updateUser(const User::Ptr& u, bool sorted /* = false */, UserInfo* ui /* = NULL */) {
int i = ctrlUsers.find(u->getNick());
bool newUser = false;
if(i == -1) {
newUser = true;
if(ui == NULL)
ui = new UserInfo(u);
if(sorted) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -