📄 ctrlchatframe.cpp
字号:
//
// CtrlChatFrame.cpp
//
// Copyright (c) Shareaza Development Team, 2002-2004.
// This file is part of SHAREAZA (www.shareaza.com)
//
// Shareaza 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.
//
// Shareaza 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 Shareaza; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
#include "StdAfx.h"
#include "Shareaza.h"
#include "Settings.h"
#include "CtrlChatFrame.h"
#include "RichElement.h"
#include "ChatWindows.h"
#include "ChatCore.h"
#include "ChatSession.h"
#include "CoolInterface.h"
#include "Emoticons.h"
#include "WndChat.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNAMIC(CChatFrame, CWnd)
BEGIN_MESSAGE_MAP(CChatFrame, CWnd)
//{{AFX_MSG_MAP(CChatFrame)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_UPDATE_COMMAND_UI(ID_CHAT_BOLD, OnUpdateChatBold)
ON_COMMAND(ID_CHAT_BOLD, OnChatBold)
ON_UPDATE_COMMAND_UI(ID_CHAT_ITALIC, OnUpdateChatItalic)
ON_COMMAND(ID_CHAT_ITALIC, OnChatItalic)
ON_UPDATE_COMMAND_UI(ID_CHAT_UNDERLINE, OnUpdateChatUnderline)
ON_COMMAND(ID_CHAT_UNDERLINE, OnChatUnderline)
ON_COMMAND(ID_CHAT_COLOUR, OnChatColour)
ON_UPDATE_COMMAND_UI(ID_CHAT_CONNECT, OnUpdateChatConnect)
ON_COMMAND(ID_CHAT_CONNECT, OnChatConnect)
ON_UPDATE_COMMAND_UI(ID_CHAT_DISCONNECT, OnUpdateChatDisconnect)
ON_COMMAND(ID_CHAT_DISCONNECT, OnChatDisconnect)
ON_COMMAND(ID_CHAT_CLEAR, OnChatClear)
ON_COMMAND(ID_CHAT_EMOTICONS, OnChatEmoticons)
ON_WM_MEASUREITEM()
ON_WM_DRAWITEM()
ON_WM_TIMER()
ON_WM_SETFOCUS()
ON_NOTIFY(RVN_CLICK, IDC_CHAT_TEXT, OnClickView)
ON_UPDATE_COMMAND_UI(ID_CHAT_TIMESTAMP, OnUpdateChatTimestamp)
ON_COMMAND(ID_CHAT_TIMESTAMP, OnChatTimestamp)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#define EDIT_HISTORY 256
#define NEWLINE_FORMAT _T("2")
/////////////////////////////////////////////////////////////////////////////
// CChatFrame construction
CChatFrame::CChatFrame()
{
m_pSession = NULL;
m_pIconMenu = NULL;
m_pChildWnd = NULL;
m_pDesktopWnd = NULL;
}
CChatFrame::~CChatFrame()
{
ASSERT( m_pSession == NULL );
}
/////////////////////////////////////////////////////////////////////////////
// CChatFrame system message handlers
int CChatFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if ( CWnd::OnCreate( lpCreateStruct ) == -1 ) return -1;
CRect rc;
GetClientRect( &rc );
m_wndView.Create( WS_CHILD|WS_VISIBLE, rc, this, IDC_CHAT_TEXT );
m_wndView.SetDocument( &m_pContent );
m_wndView.SetSelectable( TRUE );
m_wndView.SetFollowBottom( TRUE );
m_pContent.m_szMargin = CSize( 8, 4 );
m_wndToolBar.Create( this, WS_CHILD|WS_VISIBLE );
m_wndToolBar.SetBarStyle( m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM );
m_wndEdit.Create( WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_AUTOVSCROLL, rc, this, IDC_CHAT_EDIT );
m_wndEdit.SetFont( &theApp.m_gdiFont );
m_nHistory = 0;
SetDesktopMode( FALSE );
ChatWindows.Add( this );
return 0;
}
void CChatFrame::OnDestroy()
{
CSingleLock pLock( &ChatCore.m_pSection, TRUE );
if ( m_pSession != NULL )
{
m_pSession->OnCloseWindow();
m_pSession = NULL;
}
ChatWindows.Remove( this );
pLock.Unlock();
CWnd::OnDestroy();
}
void CChatFrame::OnSkinChange()
{
}
/////////////////////////////////////////////////////////////////////////////
// CChatFrame desktop mode
void CChatFrame::SetDesktopMode(BOOL bDesktop)
{
if ( bDesktop && m_pDesktopWnd != NULL ) return;
if ( ! bDesktop && m_pChildWnd != NULL ) return;
ShowWindow( SW_HIDE );
SetParent( NULL );
if ( m_pDesktopWnd != NULL )
{
// m_pDesktopWnd->m_pFrame = NULL;
m_pDesktopWnd->DestroyWindow();
m_pDesktopWnd = NULL;
}
if ( m_pChildWnd != NULL )
{
m_pChildWnd->m_pFrame = NULL;
m_pChildWnd->DestroyWindow();
m_pChildWnd = NULL;
}
if ( bDesktop )
{
// TODO: m_pDesktopWnd = new CChatDesktopWnd( this );
}
else
{
m_pChildWnd = new CChatWnd( this );
}
}
void CChatFrame::SetAlert(BOOL bAlert)
{
PostMessage( WM_TIMER, 1 );
}
/////////////////////////////////////////////////////////////////////////////
// CChatFrame text input controller
BOOL CChatFrame::PreTranslateMessage(MSG* pMsg)
{
if ( pMsg->message == WM_KEYDOWN )
{
if ( pMsg->wParam == VK_RETURN )
{
m_wndEdit.GetWindowText( m_sCurrent );
if ( m_sCurrent.IsEmpty() ) return TRUE;
m_sCurrent = m_sCurrent.SpanExcluding( _T("\r\n") );
OnLocalText( m_sCurrent );
m_pHistory.Add( m_sCurrent );
if ( m_pHistory.GetSize() > EDIT_HISTORY ) m_pHistory.RemoveAt( 0 );
m_nHistory = m_pHistory.GetSize();
m_sCurrent.Empty();
m_wndEdit.SetWindowText( m_sCurrent );
return TRUE;
}
else if ( pMsg->wParam == VK_ESCAPE )
{
m_wndEdit.SetWindowText( _T("") );
m_nHistory = m_pHistory.GetSize();
m_sCurrent.Empty();
return TRUE;
}
else if ( pMsg->wParam == VK_UP )
{
MoveHistory( -1 );
return TRUE;
}
else if ( pMsg->wParam == VK_DOWN )
{
MoveHistory( 1 );
return TRUE;
}
else if ( pMsg->wParam == VK_PRIOR )
{
m_wndView.PostMessage( WM_VSCROLL, MAKELONG( SB_PAGEUP, 0 ), NULL );
return TRUE;
}
else if ( pMsg->wParam == VK_NEXT )
{
m_wndView.PostMessage( WM_VSCROLL, MAKELONG( SB_PAGEDOWN, 0 ), NULL );
return TRUE;
}
else if ( pMsg->wParam == VK_HOME && ( GetAsyncKeyState( VK_CONTROL ) & 0x8000 ) )
{
m_wndView.PostMessage( WM_VSCROLL, MAKELONG( SB_TOP, 0 ), NULL );
return TRUE;
}
else if ( pMsg->wParam == VK_END && ( GetAsyncKeyState( VK_CONTROL ) & 0x8000 ) )
{
m_wndView.PostMessage( WM_VSCROLL, MAKELONG( SB_BOTTOM, 0 ), NULL );
return TRUE;
}
else if ( pMsg->wParam == 'B' && ( GetAsyncKeyState( VK_CONTROL ) & 0x8000 ) )
{
OnChatBold();
return TRUE;
}
else if ( pMsg->wParam == 'I' && ( GetAsyncKeyState( VK_CONTROL ) & 0x8000 ) )
{
OnChatItalic();
return TRUE;
}
else if ( pMsg->wParam == 'U' && ( GetAsyncKeyState( VK_CONTROL ) & 0x8000 ) )
{
OnChatUnderline();
return TRUE;
}
else if ( pMsg->wParam == 'K' && ( GetAsyncKeyState( VK_CONTROL ) & 0x8000 ) )
{
OnChatColour();
return TRUE;
}
}
return CWnd::PreTranslateMessage( pMsg );
}
void CChatFrame::MoveHistory(int nDelta)
{
if ( m_nHistory == m_pHistory.GetSize() )
{
m_wndEdit.GetWindowText( m_sCurrent );
}
m_nHistory += nDelta;
m_nHistory = max( 0, min( m_pHistory.GetSize(), m_nHistory ) );
if ( m_nHistory == m_pHistory.GetSize() )
{
m_wndEdit.SetWindowText( m_sCurrent );
}
else
{
m_wndEdit.SetWindowText( m_pHistory.GetAt( m_nHistory ) );
}
int nLen = m_wndEdit.GetWindowTextLength();
m_wndEdit.SetSel( nLen, nLen );
}
BOOL CChatFrame::IsInRange(LPCTSTR pszToken)
{
CString strRange, strToken;
int nStart, nEnd;
m_wndEdit.GetSel( nStart, nEnd );
if ( nStart != nEnd ) return FALSE;
m_wndEdit.GetWindowText( strRange );
if ( nStart <= 0 ) return FALSE;
if ( nStart < strRange.GetLength() ) strRange = strRange.Left( nStart );
strRange.MakeLower();
strRange.MakeReverse();
strToken.Format( _T("]%s["), pszToken );
nStart = strRange.Find( strToken );
strToken.Format( _T("]%s/["), pszToken );
nEnd = strRange.Find( strToken );
if ( nStart < 0 ) return FALSE;
if ( nEnd < 0 ) return TRUE;
return ( nEnd > nStart );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -