?? privateframe.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 "PrivateFrame.h"
#include "SearchFrm.h"
#include "../client/Client.h"
#include "../client/ClientManager.h"
#include "../client/Util.h"
#include "../client/LogManager.h"
#include "../client/UploadManager.h"
#include "../client/ShareManager.h"
#include "../client/HubManager.h"
CriticalSection PrivateFrame::cs;
PrivateFrame::FrameMap PrivateFrame::frames;
LRESULT PrivateFrame::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_AUTOVSCROLL | ES_MULTILINE | ES_NOHIDESEL | ES_READONLY, WS_EX_CLIENTEDGE);
ctrlClient.FmtLines(TRUE);
ctrlClient.LimitText(0);
ctrlClient.SetFont(WinUtil::font);
ctrlMessage.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
ES_AUTOHSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, WS_EX_CLIENTEDGE);
ctrlMessageContainer.SubclassWindow(ctrlMessage.m_hWnd);
ctrlMessage.SetFont(WinUtil::font);
PostMessage(WM_SPEAKER, USER_UPDATED);
created = true;
ClientManager::getInstance()->addListener(this);
bHandled = FALSE;
return 1;
}
void PrivateFrame::gotMessage(const User::Ptr& aUser, const string& aMessage, HWND aParent, FlatTabCtrl* aTab) {
PrivateFrame* p = NULL;
Lock l(cs);
FrameIter i = frames.find(aUser);
if(i == frames.end()) {
bool found = false;
for(i = frames.begin(); i != frames.end(); ++i) {
if( (!i->first->isOnline()) &&
(i->first->getNick() == aUser->getNick()) &&
(i->first->getLastHubIp() == aUser->getLastHubIp()) ) {
found = true;
p = i->second;
frames.erase(i);
frames[aUser] = p;
p->setUser(aUser);
p->addLine(aMessage);
if(BOOLSETTING(PRIVATE_MESSAGE_BEEP)) {
MessageBeep(MB_OK);
}
break;
}
}
if(!found) {
p = new PrivateFrame(aUser, aParent);
frames[aUser] = p;
p->setTab(aTab);
p->addLine(aMessage);
if(Util::getAway()) {
// if no_awaymsg_to_bots is set, and aUser has an empty connection type (i.e. probably is a bot), then don't send
if(!(BOOLSETTING(NO_AWAYMSG_TO_BOTS) && aUser->getConnection().empty()))
p->sendMessage(Util::getAwayMessage());
}
if(BOOLSETTING(PRIVATE_MESSAGE_BEEP) || BOOLSETTING(PRIVATE_MESSAGE_BEEP_OPEN)) {
MessageBeep(MB_OK);
}
}
} else {
if(BOOLSETTING(PRIVATE_MESSAGE_BEEP)) {
MessageBeep(MB_OK);
}
i->second->addLine(aMessage);
}
}
void PrivateFrame::openWindow(const User::Ptr& aUser, HWND aParent, FlatTabCtrl* aTab) {
PrivateFrame* p = NULL;
Lock l(cs);
FrameIter i = frames.find(aUser);
if(i == frames.end()) {
p = new PrivateFrame(aUser, aParent);
frames[aUser] = p;
p->setTab(aTab);
p->CreateEx(aParent);
} else {
i->second->MDIActivate(i->second->m_hWnd);
}
}
LRESULT PrivateFrame::onChar(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) {
switch(wParam) {
case VK_RETURN:
if( (GetKeyState(VK_SHIFT) & 0x8000) ||
(GetKeyState(VK_CONTROL) & 0x8000) ||
(GetKeyState(VK_MENU) & 0x8000) ) {
bHandled = FALSE;
} else {
if(uMsg == WM_KEYDOWN) {
onEnter();
}
}
break;
default:
bHandled = FALSE;
}
return 0;
}
void PrivateFrame::onEnter()
{
char* message;
bool resetText = true;
if(ctrlMessage.GetWindowTextLength() > 0) {
message = new char[ctrlMessage.GetWindowTextLength()+1];
ctrlMessage.GetWindowText(message, ctrlMessage.GetWindowTextLength()+1);
string s(message, ctrlMessage.GetWindowTextLength());
delete message;
// Process special commands
if(s[0] == '/') {
string param;
string message;
string status;
if(WinUtil::checkCommand(m_hWndMDIClient, s, param, message, status)) {
if(!message.empty()) {
sendMessage(message);
}
if(!status.empty()) {
addClientLine(status);
}
} else if(Util::stricmp(s.c_str(), "clear") == 0) {
ctrlClient.SetWindowText("");
} else if(Util::stricmp(s.c_str(), "grant") == 0) {
UploadManager::getInstance()->reserveSlot(getUser());
addClientLine(STRING(SLOT_GRANTED));
} else if(Util::stricmp(s.c_str(), "close") == 0) {
PostMessage(WM_CLOSE);
} else if((Util::stricmp(s.c_str(), "favorite") == 0) || (Util::stricmp(s.c_str(), "fav") == 0)) {
HubManager::getInstance()->addFavoriteUser(getUser());
addLine(STRING(FAVORITE_USER_ADDED));
} else if(Util::stricmp(s.c_str(), "help") == 0) {
addLine("*** " + WinUtil::commands + ", /clear, /grant, /close, /favorite");
}
} else {
if(user->isOnline()) {
sendMessage(s);
} else {
ctrlStatus.SetText(0, CSTRING(USER_WENT_OFFLINE));
resetText = false;
}
}
if(resetText)
ctrlMessage.SetWindowText("");
}
}
LRESULT PrivateFrame::onClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) {
if(!closed) {
ClientManager::getInstance()->removeListener(this);
closed = true;
PostMessage(WM_CLOSE);
return 0;
} else {
Lock l(cs);
frames.erase(user);
MDIDestroy(m_hWnd);
return 0;
}
}
void PrivateFrame::addLine(const string& aLine) {
if(!created) {
CreateEx(parent);
}
if(BOOLSETTING(LOG_PRIVATE_CHAT)) {
StringMap params;
params["message"] = aLine;
LOG(user->getNick(), Util::formatParams(SETTING(LOG_FORMAT_PRIVATE_CHAT), params));
}
if(BOOLSETTING(TIME_STAMPS)) {
ctrlClient.AppendText(("\r\n[" + Util::getShortTimeString() + "] " + aLine).c_str());
} else {
ctrlClient.AppendText(("\r\n" + aLine).c_str());
}
addClientLine("Last change: " + Util::getTimeString());
setDirty();
}
void PrivateFrame::UpdateLayout(BOOL bResizeBars /* = TRUE */) {
RECT rect;
GetClientRect(&rect);
// position bars and offset their dimensions
UpdateBarsPosition(rect, bResizeBars);
if(ctrlStatus.IsWindow()) {
CRect sr;
int w[1];
ctrlStatus.GetClientRect(sr);
w[0] = sr.right - 16;
ctrlStatus.SetParts(1, w);
}
int h = WinUtil::fontHeight + 4;
CRect rc = rect;
rc.bottom -= h + 10;
ctrlClient.MoveWindow(rc);
rc = rect;
rc.bottom -= 2;
rc.top = rc.bottom - h - 5;
rc.left +=2;
rc.right -=2;
ctrlMessage.MoveWindow(rc);
}
// ClientManagerListener
void PrivateFrame::onAction(ClientManagerListener::Types type, const User::Ptr& aUser) throw() {
if(type == ClientManagerListener::USER_UPDATED && aUser == user) {
PostMessage(WM_SPEAKER, USER_UPDATED);
}
}
/**
* @file
* $Id: PrivateFrame.cpp,v 1.14 2003/07/15 14:53:12 arnetheduck Exp $
*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -