#include "SunClientPrecompiledHeader.h" #include "uiCommunityChat.h" #include "uiCommunityMan/uiCommunityMan.h" #include "uiSystemMan/uiSystemMan.h" #include "Hero.h" #include "GlobalFunc.h" #include "GameConst_Color.h" #include "interfacemanager.h" const int c_iFriendChatMsgLine = 5; //------------------------------------------------------------------------------ WzID uiCommunityChat::m_wzId[COMMUNITY_CHAT_MAX] = { StrToWzID("L001"), //COMMUNITY_CHAT_LIST = 0, StrToWzID("ED00"), //COMMUNITY_CHAT_EDIT, StrToWzID("VS00"), //COMMUNITY_CHAT_VSCR, StrToWzID("B999"), //COMMUNITY_BUTTON_EXIT StrToWzID("B001"), //COMMUNITY_BUTTON_MINIMIZE StrToWzID("T000"), //COMMUNITY_TXT_FRIEND_NAME }; //------------------------------------------------------------------------------ /** */ uiCommunityChat::uiCommunityChat(InterfaceManager *pUIMan) : uiBase(pUIMan), m_bControlsInitialized(false) { this->m_pCommunityMan = static_cast(this->GetUIMan()->GetUserInterfaceManager(UIMAN_COMMUNITY)); assert (m_pCommunityMan); if (!this->m_pCommunityMan) { #ifdef _DEBUG uiSystemMan * pSystemMan = (uiSystemMan *)g_InterfaceManager.GetUserInterfaceManager(UIMAN_SYSTEM); if(pSystemMan) pSystemMan->Sys_VerifyLock(_T("m_pCommunityManÀÌ ¾ø½À´Ï´Ù.")); #endif this->ShowInterface(FALSE); return; } ZeroMemory(m_ptszFriendNameTo, sizeof(m_ptszFriendNameTo)); m_pCommTxtControl = NULL; m_pCommChatListCtrl = NULL; m_pCommChatVScrollCtrl = NULL; m_pCommChatEditCtrl = NULL; } //------------------------------------------------------------------------------ /** */ uiCommunityChat::~uiCommunityChat() { this->Release(); } //------------------------------------------------------------------------------ /** */ void uiCommunityChat::Init(CDrawBase* pDrawBase) { uiBase::Init(pDrawBase); this->InitControls(); } //---------------------------------------------------------------------------- /** */ void uiCommunityChat::InitChatList() { if (!m_pCommChatListCtrl) { assert(!"¿Ö ¸®½ºÆ®°¡ ¾ø¾î!!"); } m_pCommChatListCtrl->SetUnuseSelBar(FALSE); m_pCommChatListCtrl->DeleteItemAll(); m_pCommChatListCtrl->SetFontID(c_wiCommunityFont); m_vstrMsg.clear(); } //------------------------------------------------------------------------------ /** */ void uiCommunityChat::Release() { if(m_pCommChatListCtrl) { m_pCommChatListCtrl->DeleteItemAll(); } m_vstrMsg.clear(); if(GetManager()) { GetManager()->DeleteChatDlgId(this->GetDialogWZ()->GetDlgID()); } } //------------------------------------------------------------------------------ /** */ void uiCommunityChat::InitControls() { m_bShow = false; // »ç¿ë¾ÈÇÏ´Â ÄÁÆ®·Ñ: ¼û±âÀÚ CControlWZ * pControl = getControl(COMMUNITY_BUTTON_MINIMIZE); if(pControl) pControl->ShowWindowWZ(WZ_HIDE); m_pCommChatListCtrl = static_cast(getControl(COMMUNITY_CHAT_LIST)); if(m_pCommChatListCtrl) { m_pCommChatListCtrl->DeleteItemAll(); } // EditBox ¼³Á¤ m_pCommChatEditCtrl = static_cast(getControl(COMMUNITY_CHAT_EDIT)); if(m_pCommChatEditCtrl) { m_pCommChatEditCtrl->SetLimitText(MSG_CW_FRIEND_CHAT_SYN::_MAX_CHATMSG_SIZE-2); m_pCommChatEditCtrl->SetColorText( RGBA( 255, 255, 255, 255)); m_pCommChatEditCtrl->SetColorCaret(c_InterfaceCaretColor); m_pCommChatEditCtrl->SetColorSelText( RGBA( 255, 255, 255, 255) ); m_pCommChatEditCtrl->SetFontID(c_wiCommunityFont); } m_pCommChatVScrollCtrl = static_cast(getControl(COMMUNITY_CHAT_VSCR)); assert(m_pCommChatVScrollCtrl); CCtrlStaticWZ *m_pCommTxtControl = static_cast(getControl(COMMUNITY_TXT_FRIEND_NAME)); assert(m_pCommTxtControl); if(m_pCommTxtControl) GlobalFunc::SetCaption(m_pCommTxtControl, _T("")); InitChatList(); this->m_bControlsInitialized = true; } //------------------------------------------------------------------------------ void uiCommunityChat::OnShowWindow( BOOL val ) { if (val) { this->MoveDefaultWindowPos(); if (!this->m_bControlsInitialized) { this->ShowInterface(FALSE); return; } keyMsg msg; ZeroMemory(&msg,sizeof(msg)); msg.dwType=this->GetDialogWZ()->GetDlgID(); msg.wParam=this->GetDialogWZ()->GetDlgID(); msg.DoSomething=GlobalFunc::DoDeleteWindow; g_KeyQueueManager.PushBack(msg); m_bShow = true; if(m_pCommChatEditCtrl) { m_pCommChatEditCtrl->ClearText(); } } else { m_bShow = true; g_KeyQueueManager.DeleteMsg(this->GetDialogWZ()->GetDlgID()); } } //------------------------------------------------------------------------------ /** */ BOOL uiCommunityChat::_isEnable() { if(GENERALPARAM->IsNet()) { if (this->IsLock()) return FALSE; if(!g_pHero) return FALSE; if(g_pHero && g_pHero->IsShowFullMap()) return FALSE; if(!GetManager()) return FALSE; return TRUE; } else { return TRUE; } } //------------------------------------------------------------------------------ /** */ void uiCommunityChat::MessageProc( SI_MESSAGE * pMessage ) { if (!_isEnable()) return; TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; switch( pMessage->eResultMsg ) { case RT_MSG_EDIT_ENTERKEYDOWN: { if(!m_pCommChatEditCtrl) break; if( getCtrlIDToPos( pMessage->dwCtrlID ) == COMMUNITY_CHAT_EDIT ) { ZeroMemory(m_szbuf, sizeof(m_szbuf)); ZeroMemory(m_szResult, sizeof(m_szResult)); m_pCommChatEditCtrl->GetTextWZ( m_szbuf, MAX_COMMUNITY_CHATMSG_SIZE ); StrnCopy(m_szResult, m_szbuf, _tcslen(m_szbuf)); int msgLen = (int)_tcslen( m_szbuf )+1; // ±ÝÁö´Ü¾î check if(GlobalFunc::IsSlang(m_szResult, false) == TRUE) { // »ç¿ë ±ÝÁö ´Ü¾îÀÔ´Ï´Ù g_InterfaceManager.GetInterfaceString( eST_CANNOT_USE_WORD, szMessage, INTERFACE_STRING_LENGTH ); AddString(szMessage, RGBA(255,0,0,255)); m_pCommChatEditCtrl->ClearText(); GlobalFunc::SetFocus( (SolarDialog *)this, m_pCommChatEditCtrl ); return; } //ÀÚ½ÅÀÇ ¸»Àº ¼­¹ö¿¡¼­ ÀÀ´äÀÌ ¾øÀ½À¸·Î Á÷Á¢ Ä£´Ù. if((GetManager()->IsRecvMessage() == FALSE) && _tcslen(m_ptszFriendNameTo)) { if(msgLen>1) { MSG_CW_FRIEND_CHAT_SYN sync; sync.byMsgLength = _tcslen(m_szbuf); ZeroMemory(sync.ptszChatMsg, sizeof(sync.ptszChatMsg)); ZeroMemory(sync.ptszFriendNameTo, sizeof(sync.ptszFriendNameTo)); StrnCopy(sync.ptszChatMsg, m_szbuf, sync.byMsgLength); StrnCopy(sync.ptszFriendNameTo, m_ptszFriendNameTo, MAX_CHARNAME_LENGTH); //GlobalFunc::SendPacket(CI_CHATSERVERIDX, &sync, sizeof (sync)); GlobalFunc::SendPacket(CI_CHATSERVERIDX, &sync, sync.GetSize()); } } else { // ´ëÈ­ °ÅºÎ »óÅÂÀÔ´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_REJECT_CHAT_STATE, szMessage, INTERFACE_STRING_LENGTH ); AddString(szMessage,RGBA(255,255,255,255)); m_pCommChatEditCtrl->ClearText(); GlobalFunc::SetFocus((SolarDialog *)this, m_pCommChatEditCtrl); break; } if(g_pHero && (msgLen>1)) { AddString( g_pHero->GetName(), m_szbuf); m_pCommChatEditCtrl->ClearText(); } GlobalFunc::SetFocus((SolarDialog *)this, m_pCommChatEditCtrl); } } break; case RT_MSG_LBUTTONCLICK: { switch( getCtrlIDToPos( pMessage->dwCtrlID ) ) { case COMMUNITY_BUTTON_EXIT: { m_bShow = false; } break; case COMMUNITY_CHAT_LIST: { SetFocusChatEdit(); } break; } } break; case RT_MSG_SB_LINETOP: { //.À­ÂÊ È­»ìÇ¥¸¦ ´­·¶´Ù. // //.¾Æ·§ÂÊ È­»ìÇ¥¸¦ ´­·¶´Ù if(m_pCommChatVScrollCtrl) { int pos = m_pCommChatVScrollCtrl->GetScrollPosWZ();//ÇöÀç ½ºÅ©·Ñ °ªÀ» ¹Þ¾Æ ¿Â´Ù. int mmin = 0 , mmax = 0; m_pCommChatVScrollCtrl->GetScrollRangeWZ( &mmin, &mmax );//½ºÅ©·Ñ °ªÀÇ ÃÖ´ë ÃÖ¼Ò¸¦ ¾ò¾î ¿Â´Ù. if(pos>mmin)// ÇöÀç ÀÔ·ÂµÈ ¶óÀμö º¸´Ù ÀÛÀ¸¸é { pos--;//ÇÑÁÙ °¨¼Ò ½Ã۰í m_pCommChatVScrollCtrl->SetScrollPosWZ(pos); } } this->SetFocusChatEdit(); } break; case RT_MSG_SB_LINEBOTTOM: { //.¾Æ·§ÂÊ È­»ìÇ¥¸¦ ´­·¶´Ù if(m_pCommChatVScrollCtrl) { int pos = m_pCommChatVScrollCtrl->GetScrollPosWZ();//ÇöÀç ½ºÅ©·Ñ °ªÀ» ¹Þ¾Æ ¿Â´Ù. int mmin = 0 , mmax = 0; m_pCommChatVScrollCtrl->GetScrollRangeWZ( &mmin, &mmax );//½ºÅ©·Ñ °ªÀÇ ÃÖ´ë ÃÖ¼Ò¸¦ ¾ò¾î ¿Â´Ù. if(posSetScrollPosWZ(pos); } } this->SetFocusChatEdit(); } break; case RT_MSG_SB_PAGETOP: { //.À­ÂÊ ¸öÅëÀ» ´­·¶´Ù. this->SetFocusChatEdit(); } break; case RT_MSG_SB_PAGEBOTTOM: { //.¾Æ·¡ÂÊ ¸öÅëÀ» ´­·¶´Ù. this->SetFocusChatEdit(); } break; default: { SolarDialog::MessageProc( pMessage ); } break; } } //---------------------------------------------------------------------------- /** */ void uiCommunityChat::AddString(LPCTSTR ptszFriendNameFrom, LPCTSTR ptszChatMsg, COLORREF TextColor) { if(GetManager() && GetManager()->IsRecvMessage()==FALSE) { TCHAR m_szResult[MAX_COMMUNITY_CHATMSG_SIZE*2] = {0,}; Snprintf (m_szResult, (MAX_COMMUNITY_CHATMSG_SIZE*2)-1, _T("%s:%s"), ptszFriendNameFrom, ptszChatMsg); AddString(m_szResult,TextColor); } } //---------------------------------------------------------------------------- /** */ void uiCommunityChat::AddString(LPCTSTR ptszChatMsg, COLORREF TextColor) { if(!m_pCommChatListCtrl || !m_pCommChatVScrollCtrl) return; const int c_iLen = MAX_COMMUNITY_CHATMSG_SIZE*2; TCHAR szWideString[c_iLen] = {0,}; StrnCopy(szWideString , ptszChatMsg, c_iLen); RECT rc = m_pCommChatListCtrl->GetSizeRect(); #ifdef __LTJ_TEXT_OUTPUT_AT_LIST_MOD int iListWidth = rc.right - rc.left - 15; #else int iListWidth = rc.right - rc.left - 5; #endif m_vstrMsg.clear(); #ifdef _INTERNATIONAL_UI GlobalFunc::ProcessWordWrapByFontSize( &m_vstrMsg, szWideString, c_wiCommunityFont, _tcslen(szWideString), iListWidth ,TRUE); #else GlobalFunc::ProcessWordWrapByFontSize( &m_vstrMsg, szWideString, c_wiCommunityFont, _tcslen(szWideString), iListWidth); #endif//_INTERNATIONAL_UI int index = 0; for (size_t i=0; im_vstrMsg.size(); ++i) { TCHAR *pszStr = const_cast(this->m_vstrMsg[i].c_str()); if (pszStr && _tcslen(pszStr)) { /////////////////////////////// index = m_pCommChatListCtrl->InsertItemBack(); GlobalFunc::SetItemText( m_pCommChatListCtrl, index, pszStr ); m_pCommChatListCtrl->SetItemFontID( index, 0, c_wiCommunityFont); m_pCommChatListCtrl->SetItemTextColor( index, 0, TextColor); m_pCommChatListCtrl->SetItemSelTextColor( index, 0, TextColor); m_pCommChatListCtrl->SetItemBKColor( index, 0, RGBA(255,255,255,0) ); } } // ½ºÅ©·Ñ ó¸® int iRange = 0; if(index > (c_iFriendChatMsgLine-1)) { iRange = index - c_iFriendChatMsgLine + 1; } m_pCommChatVScrollCtrl->SetScrollRangeWZ(0,iRange); //½ºÅ©·Ñ ¹üÀ§´Â ÀÔ·ÂµÈ ¶óÀμö·Î ÇÑ´Ù. m_pCommChatVScrollCtrl->SetScrollPosWZ(iRange); } //---------------------------------------------------------------------------- /** */ TCHAR* uiCommunityChat::GetCurChatMessage() { if (m_pCommChatEditCtrl) { m_pCommChatEditCtrl->GetTextWZ(m_szCurChatMessage, MAX_COMMUNITY_CHATMSG_SIZE); return m_szCurChatMessage; } else { return NULL; } } //------------------------------------------------------------------------------ /** */ void uiCommunityChat::OnUpdateSolarDialog() { if(!m_bShow) { ShowDialog(FALSE); SetDestroyWindow(TRUE); return; } if (!_isEnable()) return; TCHAR * pszInputMessage = this->GetCurChatMessage(); // äÆÃ ÁßÀÎ Áö Check BOOL rt = BOOL( _tcslen( this->GetCurChatMessage() ) ); if(m_pCommChatVScrollCtrl && m_pCommChatListCtrl) { m_pCommChatListCtrl->SetBeginDrawIndex( m_pCommChatVScrollCtrl->GetScrollPosWZ() ); } } //------------------------------------------------------------------------------ /** */ void uiCommunityChat::OnRenderSolarDialog() { if (!_isEnable()) return; if(m_pCommTxtControl) { RECT rc; rc = m_pCommTxtControl->GetSizeRect(); this->GetDrawBase()->x_pManagerTextOut->StartToUseFont( c_wiCommunityFont ); this->GetDrawBase()->x_pManagerTextOut->DrawText( m_ptszFriendNameTo, &rc, WzColor_RGBA(255, 255, 255, 255), WzColor_RGBA(0,0,0,0), TP_HCENTER); this->GetDrawBase()->x_pManagerTextOut->EndUseFont(); } else { m_pCommTxtControl = static_cast(getControl(COMMUNITY_TXT_FRIEND_NAME)); } } //------------------------------------------------------------------------------ /** */ BOOL uiCommunityChat::HaveFocus() { if( m_pCommChatEditCtrl ) { if( m_pCommChatEditCtrl->HaveFocus()) { return TRUE; } } return FALSE; } //------------------------------------------------------------------------------ /** */ void uiCommunityChat::SetFriendName(TCHAR *pszName) { ZeroMemory(m_ptszFriendNameTo, sizeof(m_ptszFriendNameTo)); StrnCopy(m_ptszFriendNameTo, pszName, MAX_CHARNAME_LENGTH); } //------------------------------------------------------------------------------ /** */ BOOL uiCommunityChat::IsHaveFocusInEdit() { return this->m_pCommChatEditCtrl->HaveFocus(); } //---------------------------------------------------------------------------- /** */ void uiCommunityChat::SetFocusChatEdit() { if ( m_pCommChatEditCtrl ) { GlobalFunc::SetFocus( (SolarDialog *)this, m_pCommChatEditCtrl ); } }