⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctrlchatframe.cpp

📁 p2p软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// 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 + -