📄 hubframe.cpp
字号:
/*
* Copyright (C) 2001-2006 Jacek Sieka, arnetheduck on gmail point 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/StringTokenizer.h"
#include "../client/FavoriteManager.h"
#include "../client/LogManager.h"
#include "../client/AdcCommand.h"
#include "../client/ConnectionManager.h"
#include "../client/SearchManager.h"
HubFrame::FrameMap HubFrame::frames;
int HubFrame::columnSizes[] = { 100, 75, 75, 100, 75, 100, 125 };
int HubFrame::columnIndexes[] = { COLUMN_NICK, COLUMN_SHARED, COLUMN_DESCRIPTION, COLUMN_TAG, COLUMN_CONNECTION, COLUMN_EMAIL, COLUMN_CID };
static ResourceManager::Strings columnNames[] = { ResourceManager::NICK, ResourceManager::SHARED,
ResourceManager::DESCRIPTION, ResourceManager::TAG, ResourceManager::CONNECTION, ResourceManager::EMAIL, ResourceManager::CID };
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 | WS_VSCROLL |
ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE, WS_EX_CLIENTEDGE);
ctrlMessageContainer.SubclassWindow(ctrlMessage.m_hWnd);
ctrlMessage.SetFont(WinUtil::font);
ctrlFilter.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
ES_AUTOHSCROLL, WS_EX_CLIENTEDGE);
ctrlFilterContainer.SubclassWindow(ctrlFilter.m_hWnd);
ctrlFilter.SetFont(WinUtil::font);
ctrlFilterSel.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_HSCROLL |
WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_CLIENTEDGE);
ctrlFilterSelContainer.SubclassWindow(ctrlFilterSel.m_hWnd);
ctrlFilterSel.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);
ctrlUsers.SetExtendedListViewStyle(LVS_EX_LABELTIP | LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT);
SetSplitterPanes(ctrlClient.m_hWnd, ctrlUsers.m_hWnd, false);
SetSplitterExtendedStyle(SPLIT_PROPORTIONAL);
m_nProportionalPos = 7500;
ctrlShowUsers.Create(ctrlStatus.m_hWnd, rcDefault, _T("+/-"), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
ctrlShowUsers.SetButtonStyle(BS_AUTOCHECKBOX, false);
ctrlShowUsers.SetFont(WinUtil::systemFont);
ctrlShowUsers.SetCheck(showUsers ? BST_CHECKED : BST_UNCHECKED);
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, CTSTRING_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.setSortColumn(COLUMN_NICK);
ctrlUsers.SetImageList(WinUtil::userImages, LVSIL_SMALL);
CToolInfo ti(TTF_SUBCLASS, ctrlStatus.m_hWnd);
ctrlLastLines.Create(ctrlStatus.m_hWnd, rcDefault, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, WS_EX_TOPMOST);
ctrlLastLines.SetWindowPos(HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
ctrlLastLines.AddTool(&ti);
userMenu.CreatePopupMenu();
appendUserItems(userMenu);
userMenu.AppendMenu(MF_STRING, IDC_COPY_NICK, CTSTRING(COPY_NICK));
userMenu.SetMenuDefaultItem(IDC_GETLIST);
tabMenu = CreatePopupMenu();
tabMenu.AppendMenu(MF_STRING, IDC_ADD_AS_FAVORITE, CTSTRING(ADD_TO_FAVORITES));
tabMenu.AppendMenu(MF_STRING, ID_FILE_RECONNECT, CTSTRING(MENU_RECONNECT));
showJoins = BOOLSETTING(SHOW_JOINS);
favShowJoins = BOOLSETTING(FAV_SHOW_JOINS);
for(int j=0; j<COLUMN_LAST; j++) {
ctrlFilterSel.AddString(CTSTRING_I(columnNames[j]));
}
ctrlFilterSel.AddString(CTSTRING(ANY));
ctrlFilterSel.SetCurSel(COLUMN_LAST);
bHandled = FALSE;
client->connect();
FavoriteHubEntry *fhe = FavoriteManager::getInstance()->getFavoriteHubEntry(Text::fromT(server));
if(fhe != NULL){
//retrieve window position
CRect rc(fhe->getLeft(), fhe->getTop(), fhe->getRight(), fhe->getBottom());
//check that we have a window position stored
if(! (rc.top == 0 && rc.bottom == 0 && rc.left == 0 && rc.right == 0) )
MoveWindow(rc, TRUE);
}
TimerManager::getInstance()->addListener(this);
return 1;
}
void HubFrame::openWindow(const tstring& aServer) {
FrameIter i = frames.find(aServer);
if(i == frames.end()) {
HubFrame* frm = new HubFrame(aServer);
frames[aServer] = frm;
frm->CreateEx(WinUtil::mdiClient);
} else {
if(::IsIconic(i->second->m_hWnd))
::ShowWindow(i->second->m_hWnd, SW_RESTORE);
i->second->MDIActivate(i->second->m_hWnd);
}
}
void HubFrame::onEnter() {
if(ctrlMessage.GetWindowTextLength() > 0) {
AutoArray<TCHAR> msg(ctrlMessage.GetWindowTextLength()+1);
ctrlMessage.GetWindowText(msg, ctrlMessage.GetWindowTextLength()+1);
tstring s(msg, ctrlMessage.GetWindowTextLength());
// save command in history, reset current buffer pointer to the newest command
curCommandPosition = prevCommands.size(); //this places it one position beyond a legal subscript
if (!curCommandPosition || curCommandPosition > 0 && prevCommands[curCommandPosition - 1] != s) {
++curCommandPosition;
prevCommands.push_back(s);
}
currentCommand = _T("");
// Special command
if(s[0] == _T('/')) {
tstring cmd = s;
tstring param;
tstring message;
tstring status;
if(WinUtil::checkCommand(cmd, param, message, status)) {
if(!message.empty()) {
client->hubMessage(Text::fromT(message));
}
if(!status.empty()) {
addClientLine(status);
}
} else if(Util::stricmp(cmd.c_str(), _T("join"))==0) {
if(!param.empty()) {
redirect = param;
if(BOOLSETTING(JOIN_OPEN_NEW_WINDOW)) {
HubFrame::openWindow(param);
} else {
BOOL whatever = FALSE;
onFollow(0, 0, 0, whatever);
}
} else {
addClientLine(TSTRING(SPECIFY_SERVER));
}
} else if(Util::stricmp(cmd.c_str(), _T("clear")) == 0) {
ctrlClient.SetWindowText(_T(""));
} else if(Util::stricmp(cmd.c_str(), _T("ts")) == 0) {
timeStamps = !timeStamps;
if(timeStamps) {
addClientLine(TSTRING(TIMESTAMPS_ENABLED));
} else {
addClientLine(TSTRING(TIMESTAMPS_DISABLED));
}
} else if( (Util::stricmp(cmd.c_str(), _T("password")) == 0) && waitingForPW ) {
client->setPassword(Text::fromT(param));
client->password(Text::fromT(param));
waitingForPW = false;
} else if( Util::stricmp(cmd.c_str(), _T("showjoins")) == 0 ) {
showJoins = !showJoins;
if(showJoins) {
addClientLine(TSTRING(JOIN_SHOWING_ON));
} else {
addClientLine(TSTRING(JOIN_SHOWING_OFF));
}
} else if( Util::stricmp(cmd.c_str(), _T("favshowjoins")) == 0 ) {
favShowJoins = !favShowJoins;
if(favShowJoins) {
addClientLine(TSTRING(FAV_JOIN_SHOWING_ON));
} else {
addClientLine(TSTRING(FAV_JOIN_SHOWING_OFF));
}
} else if(Util::stricmp(cmd.c_str(), _T("close")) == 0) {
PostMessage(WM_CLOSE);
} else if(Util::stricmp(cmd.c_str(), _T("userlist")) == 0) {
ctrlShowUsers.SetCheck(showUsers ? BST_UNCHECKED : BST_CHECKED);
} else if(Util::stricmp(cmd.c_str(), _T("connection")) == 0) {
addClientLine(Text::toT((STRING(IP) + client->getLocalIp() + ", " + STRING(PORT) + Util::toString(ConnectionManager::getInstance()->getPort()) + "/" + Util::toString(SearchManager::getInstance()->getPort()))));
} else if((Util::stricmp(cmd.c_str(), _T("favorite")) == 0) || (Util::stricmp(cmd.c_str(), _T("fav")) == 0)) {
addAsFavorite();
} else if((Util::stricmp(cmd.c_str(), _T("removefavorite")) == 0) || (Util::stricmp(cmd.c_str(), _T("removefav")) == 0)) {
removeFavoriteHub();
} else if(Util::stricmp(cmd.c_str(), _T("getlist")) == 0){
if( !param.empty() ){
UserInfo* ui = findUser(param);
if(ui) {
ui->getList();
}
}
} else if(Util::stricmp(cmd.c_str(), _T("log")) == 0) {
StringMap params;
params["hubNI"] = client->getHubName();
params["hubURL"] = client->getHubUrl();
params["myNI"] = client->getMyNick();
if(param.empty()) {
WinUtil::openFile(Text::toT(Util::validateFileName(SETTING(LOG_DIRECTORY) + Util::formatParams(SETTING(LOG_FILE_MAIN_CHAT), params, true))));
} else if(Util::stricmp(param.c_str(), _T("status")) == 0) {
WinUtil::openFile(Text::toT(Util::validateFileName(SETTING(LOG_DIRECTORY) + Util::formatParams(SETTING(LOG_FILE_STATUS), params, true))));
}
} else if(Util::stricmp(cmd.c_str(), _T("help")) == 0) {
addLine(_T("*** ") + WinUtil::commands + _T(", /join <hub-ip>, /clear, /ts, /showjoins, /favshowjoins, /close, /userlist, /connection, /favorite, /pm <user> [message], /getlist <user>, /log <status, system, downloads, uploads>, /removefavorite"));
} else if(Util::stricmp(cmd.c_str(), _T("pm")) == 0) {
string::size_type j = param.find(_T(' '));
if(j != string::npos) {
tstring nick = param.substr(0, j);
UserInfo* ui = findUser(nick);
if(ui) {
if(param.size() > j + 1)
PrivateFrame::openWindow(ui->user, param.substr(j+1));
else
PrivateFrame::openWindow(ui->user);
}
} else if(!param.empty()) {
UserInfo* ui = findUser(param);
if(ui) {
PrivateFrame::openWindow(ui->user);
}
}
} else {
if (BOOLSETTING(SEND_UNKNOWN_COMMANDS)) {
client->hubMessage(Text::fromT(s));
} else {
addClientLine(TSTRING(UNKNOWN_COMMAND) + cmd);
}
}
ctrlMessage.SetWindowText(_T(""));
} else if(waitingForPW) {
addClientLine(TSTRING(DONT_REMOVE_SLASH_PASSWORD));
ctrlMessage.SetWindowText(_T("/password "));
ctrlMessage.SetFocus();
ctrlMessage.SetSel(10, 10);
} else {
client->hubMessage(Text::fromT(s));
ctrlMessage.SetWindowText(_T(""));
}
} else {
MessageBeep(MB_ICONEXCLAMATION);
}
}
struct CompareItems {
CompareItems(int aCol) : col(aCol) { }
bool operator()(const HubFrame::UserInfo& a, const HubFrame::UserInfo& b) const {
return HubFrame::UserInfo::compareItems(&a, &b, col) < 0;
}
const int col;
};
const tstring& HubFrame::getNick(const User::Ptr& aUser) {
UserMapIter i = userMap.find(aUser);
if(i == userMap.end())
return Util::emptyStringT;
UserInfo* ui = i->second;
return ui->columns[COLUMN_NICK];
}
void HubFrame::addAsFavorite() {
FavoriteHubEntry* existingHub = FavoriteManager::getInstance()->getFavoriteHubEntry(client->getHubUrl());
if(!existingHub) {
FavoriteHubEntry aEntry;
TCHAR buf[256];
this->GetWindowText(buf, 255);
aEntry.setServer(Text::fromT(server));
aEntry.setName(Text::fromT(buf));
aEntry.setDescription(Text::fromT(buf));
aEntry.setConnect(false);
aEntry.setNick(client->getMyNick());
FavoriteManager::getInstance()->addFavorite(aEntry);
addClientLine(TSTRING(FAVORITE_HUB_ADDED));
} else {
addClientLine(TSTRING(FAVORITE_HUB_ALREADY_EXISTS));
}
}
void HubFrame::removeFavoriteHub() {
FavoriteHubEntry* removeHub = FavoriteManager::getInstance()->getFavoriteHubEntry(client->getHubUrl());
if(removeHub) {
FavoriteManager::getInstance()->removeFavorite(removeHub);
addClientLine(TSTRING(FAVORITE_HUB_REMOVED));
} else {
addClientLine(TSTRING(FAVORITE_HUB_DOES_NOT_EXIST));
}
}
int HubFrame::getImage(const Identity& u) {
int image = u.isOp() ? IMAGE_OP : IMAGE_USER;
if(u.getUser()->isSet(User::DCPLUSPLUS))
image+=2;
if(SETTING(INCOMING_CONNECTIONS) == SettingsManager::INCOMING_FIREWALL_PASSIVE && !u.isTcpActive()) {
// Users we can't connect to...
image+=4;
}
return image;
}
LRESULT HubFrame::onCopyNick(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
int i=-1;
string nicks;
while( (i = ctrlUsers.GetNextItem(i, LVNI_SELECTED)) != -1) {
nicks += (ctrlUsers.getItemData(i))->getIdentity().getNick();
nicks += ' ';
}
if(!nicks.empty()) {
// remove last space
nicks.erase(nicks.length() - 1);
WinUtil::setClipboard(Text::toT(nicks));
}
return 0;
}
LRESULT HubFrame::onDoubleClickUsers(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) {
NMITEMACTIVATE* item = (NMITEMACTIVATE*)pnmh;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -