Files
Leviathan/Client/Game/game/Interface/SUIGuildMemberTab.cpp
T
2026-06-01 12:46:52 +02:00

1906 lines
58 KiB
C++

#include "stdafx.h"
#include <toolkit/XStringUtil.h>
#include <toolkit/nsl.h>
#include <toolkit/nsluni.h>
#include "KUIControlButton.h"
#include "KUIListControl.h"
#include "KUIControlStatic.h"
#include "KUIControlScroll.h"
#include "SGameManager.h"
#include "SGameMessage.h"
//#include "SGameMessageUI.h"
#include "SMessengerMgr.h"
#include "SPlayerInfoMgr.h"
#include "SStringDB.h"
#include "SJobDB.h"
#include "SUIMemberPopupWnd.h"
#include "SUIGuildMemberTab.h"
namespace
{
const int g_MemoDecoSize = sizeof( "<size:8><#4d4d4d><hcenter><left>" );
///< 0:LogOff | 1:LogIn | 2:친구목록에서 차단당한 상태(내가 차단한게 아니고 MemberInfo 정보 당사자가 나를 차단한 경우)
char g_StrConnectIcon[][40] = { "common_mark_titanium_offline", "common_mark_titanium_block", "common_mark_titanium_online" };
////
//// 정렬조건. 0 온라인, 1 직업, 2 레벨, 3 아이디
//bool compConn( SPlayerSlot * p1, SPlayerSlot * p2 ){
// return p1->GetLogin() > p2->GetLogin();
//}
//bool compJop( SPlayerSlot * p1, SPlayerSlot * p2 ){
// return p1->GetJobID() > p2->GetJobID();
//}
//bool compLevel( SPlayerSlot * p1, SPlayerSlot * p2 ){
// return p1->GetLevel() > p2->GetLevel();
//}
//bool compName( SPlayerSlot * p1, SPlayerSlot * p2 ){
// return std::string( p1->GetName() ) > std::string( p2->GetName() );
//}
//// 정렬용 함수포인터 배열.
//typedef bool (* fpComp)( SPlayerSlot *, SPlayerSlot * );
//fpComp g_arrComp[ MAX_BTN_SORT_STATE ] = { compConn, compJop, compLevel, compName };
char g_arrStrSortIcon[][MAX_BTN_SORT_STATE_SIZE][60] = {
{ "common_button_titanium_line_nomal_online", "common_button_titanium_line_up_online", "common_button_titanium_line_down_online" },
{ "common_button_titanium_line_nomal_job", "common_button_titanium_line_up_job", "common_button_titanium_line_down_job" },
/*{ "common_button_titanium_line_nomal", "common_button_titanium_line_up", "common_button_titanium_line_down" },
{ "common_button_titanium_line_nomal", "common_button_titanium_line_up", "common_button_titanium_line_down" }, */
{ "common_button_titanium_line_nomal", "common_button_titanium_line_nomal", "common_button_titanium_line_nomal" },
{ "common_button_titanium_line_nomal", "common_button_titanium_line_nomal", "common_button_titanium_line_nomal" },
{ "common_button_titanium_line_nomal", "common_button_titanium_line_nomal", "common_button_titanium_line_nomal" },
};
//
// 정렬조건. 0 온라인, 1 직업, 2 레벨, 3 아이디
// down 내림차순, up 오름차순
//
bool compConn_down( SPlayerSlot * p1, SPlayerSlot * p2 ){
return p1->GetLogin() > p2->GetLogin();
}
bool compConn_up( SPlayerSlot * p1, SPlayerSlot * p2 ){
return p1->GetLogin() < p2->GetLogin();
}
bool compJop_down( SPlayerSlot * p1, SPlayerSlot * p2 ){
return p1->GetJobID() > p2->GetJobID();
}
bool compJop_up( SPlayerSlot * p1, SPlayerSlot * p2 ){
return p1->GetJobID() < p2->GetJobID();
}
bool compLevel_down( SPlayerSlot * p1, SPlayerSlot * p2 ){
return p1->GetLevel() > p2->GetLevel();
}
bool compLevel_up( SPlayerSlot * p1, SPlayerSlot * p2 ){
return p1->GetLevel() < p2->GetLevel();
}
bool compName_down( SPlayerSlot * p1, SPlayerSlot * p2 ){
return std::string( p1->GetName() ) > std::string( p2->GetName() );
}
bool compName_up( SPlayerSlot * p1, SPlayerSlot * p2 ){
return std::string( p1->GetName() ) < std::string( p2->GetName() );
}
bool compPoint_down( SPlayerSlot * p1, SPlayerSlot * p2 ){
return p1->GetPoint() > p2->GetPoint();
}
bool compPoint_up( SPlayerSlot * p1, SPlayerSlot * p2 ){
return p1->GetPoint() < p2->GetPoint();
}
// 정렬용 함수포인터 배열.
typedef bool (* fpComp_down)( SPlayerSlot *, SPlayerSlot * );
fpComp_down g_arrComp_down[ MAX_BTN_SORT_STATE_SIZE ] = { compConn_down, compJop_down, compLevel_down, compName_down, compPoint_down };
typedef bool (* fpComp_up)( SPlayerSlot *, SPlayerSlot * );
fpComp_up g_arrComp_up[ MAX_BTN_SORT_STATE_SIZE ] = { compConn_up, compJop_up, compLevel_up, compName_up, compPoint_up };
}
// bintitle 2010.04.09
// 해당 컨트롤의 영역만큼 문자열을 자르고, 마지막 문자는 '..' 으로 변환하여 반환한다.
void CuttingText( KUIControl * pControl, std::string& rText )
{
std::vector<std::string> lineList;
//#ifdef _COUNTRY_ME_
// pControl->SplitLine(lineList, rText, KFontManager::KDEFAULT_FONT_NAME, fontSize );
//#else
// pControl->SplitLine(lineList, rText, strFont, fontSize, std::string("font_02") == strFont ? true : false, fontSize > 0 ? true : false );
//#endif
pControl->SplitLine(lineList, rText );
if( lineList.size() > 1 )
{
std::wstring wstr = nsl::uni::conv(lineList[0].c_str());
#ifdef _COUNTRY_ME_
wstr.erase( wstr.begin() );
wstr.erase( wstr.begin() );
std::wstring comma = nsl::uni::conv("..");
wstr = comma + wstr;
#else
wstr.erase(wstr.end()-1);
wstr.erase(wstr.end()-1);
wstr += L"..";
#endif
std::string str = nsl::uni::conv(wstr.c_str());
rText = str;
}
lineList.clear();
}
SUIGuildMemberTab::SUIGuildMemberTab( SGameManager * pGameManager ) :
SUIWnd( pGameManager ),
m_pScrollBar( NULL ),
m_pListGuild( NULL ),
m_pSelectedControl( NULL ),
m_pMemberPopupWnd( NULL ),
m_pTabSelectControl( NULL ),
m_pSelectedControl_Red( NULL ),
m_pSelectedControl_Orange( NULL ),
m_nPrevScrollPos( 0 ), m_nScrollPos( 0 ),
m_bExtendAll( 0 ),
m_nSortCondition( 0 ),
m_bManageMode( false ),
m_bMasterMode( false ),
m_bFirstOpen( false ),
m_bFirstDataMapping( true ),
m_beforeGuildMember( -1 ),
m_nRefresh( GUILD_UPDATE::GUILD_UPDATE_NONE ),
m_bUIRefresh( true )
// m_bOpenMemberPopup( false )
{
}
SUIGuildMemberTab::~SUIGuildMemberTab()
{
Release();
}
void SUIGuildMemberTab::Release()
{
m_pScrollBar = NULL;
SAFE_DELETE( m_pListGuild );
}
void SUIGuildMemberTab::PumpUpMsgDBClick( DWORD lparam )
{
MSG_LISTCONTROL msg = *( (MSG_LISTCONTROL *)( &lparam ) );
//
// ListControl 을 선택.
KUIControl * pControl;
if( m_pListGuild && m_pListGuild->GetControl( pControl, ( ITEMTYPE )msg.type, msg.itemIndex, msg.columnIndex ) )
{
// 아이템
if( ITEMTYPE::TYPE_ITEM_Base == msg.type || ITEMTYPE::TYPE_ITEM_Column == msg.type )
{
// 귓말하기.
const char * pName = GetSelectedMemberName( msg.itemIndex );
if( pName )
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_WHISPER( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CHATTING, pName ) );
}
}
}
void SUIGuildMemberTab::PumpUpMsgLBtnClick_V( DWORD lparam )
{
PumpUpMsgLBtnClick(lparam);
}
void SUIGuildMemberTab::PumpUpMsgLBtnClick( DWORD lparam )
{
MSG_LISTCONTROL msg = *( (MSG_LISTCONTROL *)( &lparam ) );
//
// ListControl 을 선택.
KUIControl * pControl;
if( m_pListGuild && m_pListGuild->GetControl( pControl, ( ITEMTYPE )msg.type, msg.itemIndex, msg.columnIndex ) )
{
//
// 헤더
//
if( ITEMTYPE::TYPE_HEADER_Base == msg.type || ITEMTYPE::TYPE_HEADER_Column == msg.type )
{
if( !::_stricmp( pControl->GetID(), "header_button_unfold" ) )
{
// 확장버튼 토글.
m_bExtendAll ^= true;
m_pListGuild->SetResizeAll( m_bExtendAll );
// 버튼이미지 변경.
dynamicCast< KUIControlSimpleButton * >( pControl )->SetAniName(
m_bExtendAll ? "common_button_titanium_list_fold" : "common_button_titanium_list_unfold" );
// 축소시 스크롤위치 초기화.
if( !m_bExtendAll )
m_nScrollPos = 0;
//// 확장된 만큼 스크롤바 조절.
//RefreshScrollbarExtend();
// 길드원정보 재설정.
RefreshListMember( m_nScrollPos );
// 확장된 만큼 스크롤바 조절.
RefreshScrollbarExtend();
// 선택된 아이템 활성화 비쥬얼 처리.
RevitalizeSelectItem();
}
else if( !::_stricmp( pControl->GetID(), "header_static_connection_state" ) )
{
m_nSortCondition = 0;
SortMemberList( ); // 리스트 정렬.
}
else if( !::_stricmp( pControl->GetID(), "header_icon_member_job_icon" ) )
{
m_nSortCondition = 1;
SortMemberList( ); // 리스트 정렬.
}
else if( !::_stricmp( pControl->GetID(), "header_static_member_level" ) )
{
m_nSortCondition = 2;
SortMemberList( ); // 리스트 정렬.
}
else if( !::_stricmp( pControl->GetID(), "header_static_member_name" ) )
{
m_nSortCondition = 3;
SortMemberList( ); // 리스트 정렬.
}
else if( !::_stricmp( pControl->GetID(), "item_static_member_point" ) )
{
m_nSortCondition = 4;
SortMemberList( ); // 리스트 정렬.
}
//// 스크롤.
//else if( !::_stricmp( pControl->GetID(), "button_list_default_01" ) )
//{
// m_nScrollPos = 0;
// RefreshListMember( m_nScrollPos ); // 길드원정보 재설정.
// m_pScrollBar->_CalScrollBarRect
//}
}
//
// 아이템
//
else if( ITEMTYPE::TYPE_ITEM_Base == msg.type || ITEMTYPE::TYPE_ITEM_Column == msg.type )
{
//--------------------------------------
// 선택된 아이템 활성화.
m_pListGuild->SetSelectItem( m_nScrollPos, msg.itemIndex ); // 아이템 상태배열에 선택활성화 여부 설정.
RevitalizeSelectItem(); // 선택된 아이템 활성화 비쥬얼 처리.
//---------------------------------------
//--------------------
// MODE
if( m_bManageMode ) // 길드원 관리 모드
{
KUIControl * pControlClass;
m_pListGuild->GetItem( msg.itemIndex )->GetControl( pControlClass, "text_guild_class_01" );
MemberManageMode( GetSelectedMemberName( msg.itemIndex ), pControlClass->GetCaption() );
}
else if( m_bMasterMode ) // 길드마스터 모드
{
// GuildMasterMode( GetSelectedMemberName( msg.itemIndex ) );
KUIControl * pControlClass;
m_pListGuild->GetItem( msg.itemIndex )->GetControl( pControlClass, "text_guild_class_01" );
GuildMasterMode( GetSelectedMemberName( msg.itemIndex ), pControlClass->GetCaption() );
}
/// 2011.05.24 안쓰여서 삭제 함 - prodongi
/*
// 우클릭 유도버튼.
if( !::_stricmp( pControl->GetID(), "button_point_02" ) )
{
// 멤버관련 팝업.
ShowMemberPopup( pControl->GetRect().left + 3, pControl->GetRect().top + 3, GetSelectedMemberName( msg.itemIndex ) );
////--------------------------------------
//// 선택된 아이템 활성화.
//
//m_pListGuild->SetSelectItem( m_nScrollPos, msg.itemIndex ); // 아이템 상태배열에 선택활성화 여부 설정.
//RevitalizeSelectItem(); // 선택된 아이템 활성화 비쥬얼 처리.
////---------------------------------------
}
*/
else if( !::_stricmp( pControl->GetID(), "item_button_unfold" ) )
{
// 펼침, 닫힘.
m_pListGuild->SetResizeWidth( msg.type, msg.itemIndex, msg.columnIndex, 2.0f, m_nScrollPos );
// 헤더의 전체확장버튼.
KUIControl * pControlBtnExtendAll;
if( m_pListGuild->GetControl( pControlBtnExtendAll, ITEMTYPE::TYPE_HEADER_Column, 0, "header_button_unfold" ) )
{
// 전체 아이템의 확장 비확장여부.
int nAllItemExtendState = m_pListGuild->GetIsAllExtend();
/*if( nAllItemExtendState == ITEMEXTENDSTATE::ITEMEXTEND_EXTEND ) // 개별 확장 상태 다름.
{
}
else */
if( nAllItemExtendState == ITEMEXTENDSTATE::ITEMEXTEND_EXTEND ) // 전체확장.
{
// 확장버튼 확장상태.
m_bExtendAll = true;
m_pListGuild->SetResizeAll( m_bExtendAll );
// 버튼이미지 변경.
dynamicCast< KUIControlSimpleButton * >( pControlBtnExtendAll )->SetAniName(
m_bExtendAll ? "common_button_titanium_list_fold" : "common_button_titanium_list_unfold" );
}
else if( nAllItemExtendState == ITEMEXTENDSTATE::ITEMEXTEND_ORIGINAL ) // 전체원본.
{
// 확장버튼 확장상태.
m_bExtendAll = false;
m_pListGuild->SetResizeAll( m_bExtendAll );
// 버튼이미지 변경.
dynamicCast< KUIControlSimpleButton * >( pControlBtnExtendAll )->SetAniName(
m_bExtendAll ? "common_button_titanium_list_fold" : "common_button_titanium_list_unfold" );
// 축소시 스크롤위치 초기화.
m_nScrollPos = 0;
}
}
////--------------------------------------
//// 선택된 아이템 활성화.
//
//m_pListGuild->SetSelectItem( m_nScrollPos, msg.itemIndex ); // 아이템 상태배열에 선택활성화 여부 설정.
//RevitalizeSelectItem(); // 선택된 아이템 활성화 비쥬얼 처리.
////---------------------------------------
// 길드원정보 재설정.
RefreshListMember( m_nScrollPos );
// 확장된 만큼 스크롤바 조절.
RefreshScrollbarExtend();
m_pScrollBar->ScrollRefresh();
}
////--------------------------------------
//// 선택된 아이템 활성화.
//
//m_pListGuild->SetSelectItem( m_nScrollPos, msg.itemIndex ); // 아이템 상태배열에 선택활성화 여부 설정.
//RevitalizeSelectItem(); // 선택된 아이템 활성화 비쥬얼 처리.
////---------------------------------------
}
}// if
}
void SUIGuildMemberTab::PumpUpMsgRBtnClick( DWORD lparam )
{
MSG_LISTCONTROL msg = *( (MSG_LISTCONTROL *)( &lparam ) );
// 아이템.
if( ITEMTYPE::TYPE_ITEM_Base == msg.type || ITEMTYPE::TYPE_ITEM_Column == msg.type )
{
//--------------------
// MODE
if( m_bManageMode ) // 길드원 관리 모드
{
KUIControl * pControlClass;
m_pListGuild->GetItem( msg.itemIndex )->GetControl( pControlClass, "text_guild_class_01" );
MemberManageMode( GetSelectedMemberName( msg.itemIndex ), pControlClass->GetCaption() );
}
else if( m_bMasterMode ) // 길드마스터 모드
{
// GuildMasterMode( GetSelectedMemberName( msg.itemIndex ) );
KUIControl * pControlClass;
m_pListGuild->GetItem( msg.itemIndex )->GetControl( pControlClass, "text_guild_class_01" );
GuildMasterMode( GetSelectedMemberName( msg.itemIndex ), pControlClass->GetCaption() );
}
}
//
// ListControl 을 선택.
KUIControl * pControl;
if( m_pListGuild && m_pListGuild->GetControl( pControl, ( ITEMTYPE )msg.type, msg.itemIndex, "item_static_member_name" ) )
{
// 멤버관련 팝업.
ShowMemberPopup( this->m_ptMouseDown.x, this->m_ptMouseDown.y, GetSelectedMemberName( msg.itemIndex ) );
//--------------------------------------
// 선택된 아이템 활성화.
m_pListGuild->SetSelectItem( m_nScrollPos, msg.itemIndex ); // 아이템 상태배열에 선택활성화 여부 설정.
RevitalizeSelectItem(); // 선택된 아이템 활성화 비쥬얼 처리.
//---------------------------------------
}// if
}
bool SUIGuildMemberTab::InitControls( KPoint kPos )
{
m_bFirstOpen = false;
m_nScrollPos = 0; // scroll bar의 변경 정보.
m_bExtendAll = false; // 전체 아이템 확장여부.
// 활성, 비활성 시 텍스트 색상.
KUIControlButton * pBtn = dynamicCast< KUIControlButton * >( GetChild( "header_static_member_level" ) );
pBtn->SetEnableColor( "<#ffffff>" );
pBtn->SetDisableColor( "<#a0a0a0>" );
pBtn = dynamicCast< KUIControlButton * >( GetChild( "header_static_member_name" ) );
pBtn->SetEnableColor( "<#ffffff>" );
pBtn->SetDisableColor( "<#a0a0a0>" );
pBtn = dynamicCast< KUIControlButton * >( GetChild( "header_static_member_point" ) );
pBtn->SetEnableColor( "<#ffffff>" );
pBtn->SetDisableColor( "<#a0a0a0>" );
//-----------------------
// ListControl 생성.
if( !m_pListGuild ) // bintitle. 2010.11.30.
{
m_pListGuild = new KUIListControl( this, "listcontrol01", "header_base", "item_base", MAX_LIST_COUNT, true, 0, 2 );
//// Header column
m_pListGuild->AddStringHeaderColumn( "header_static_connection_state" );
m_pListGuild->AddStringHeaderColumn( "header_icon_member_job_icon" );
m_pListGuild->AddStringHeaderColumn( "header_static_member_level" );
m_pListGuild->AddStringHeaderColumn( "header_static_member_name" );
m_pListGuild->AddStringHeaderColumn( "header_static_member_point" );
m_pListGuild->AddStringHeaderColumn( "header_button_unfold" );
// Item column
m_pListGuild->AddStringItemColumn( "item_static_connection_state" );
m_pListGuild->AddStringItemColumn( "item_icon_member_job_icon" );
m_pListGuild->AddStringItemColumn( "item_static_member_level" );
/// 2011.05.24 안쓰여서 삭제 함 - prodongi
//m_pListGuild->AddStringItemColumn( "button_point_02" ); // 우클릭 유도버튼
m_pListGuild->AddStringItemColumn( "item_static_member_name" );
m_pListGuild->AddStringItemColumn( "item_static_member_point" );
m_pListGuild->AddStringItemColumn( "item_button_unfold" );
m_pListGuild->AddStringItemColumn( "mark_guild_class_01" );
m_pListGuild->AddStringItemColumn( "text_guild_class_01" );
m_pListGuild->AddStringItemColumn( "mark_guild_memo_01" );
m_pListGuild->AddStringItemColumn( "guild_memo_text_01" );
// Create
m_pListGuild->Create();
}
//------------------------
// 스크롤바.
// 2010.09.20 - prodongi
m_pScrollBar = dynamicCast< KUIControlVScrollEx* >(GetChild( "scrollbar_guild_list" ));
//m_pScrollBar = static_cast< KUIControlVScroll* >(GetChild( "scrollbar_guild_list" ));
// 관리모드시 셀렉트 표시용 컨트롤.
m_pTabSelectControl = GetChild( "select_list_red" );
// Sort Button.
m_arrSortBtn[ 0 ] = GetChild( "header_static_connection_state" );
m_arrSortBtn[ 1 ] = GetChild( "header_icon_member_job_icon" );
m_arrSortBtn[ 2 ] = GetChild( "header_static_member_level" );
m_arrSortBtn[ 3 ] = GetChild( "header_static_member_name" );
m_arrSortBtn[ 4 ] = GetChild( "header_static_member_point" );
// 각버튼의 정렬상태. ( false 비정렬, true 정렬 )
memset( m_arrSortState, 0, sizeof(int) * MAX_BTN_SORT_STATE_SIZE );
//// nui에서 설정된 윈도우 위치좌표.
//KRect rt = this->GetRect();
//kPos.x = rt.left; kPos.y = rt.top;
// 자신의 Wnd 영역.
m_WndRect = this->GetRect();
//// Item_Base 보다 위에 뜨게 해야한다. 툴상의 LayOut 이 제대로 적용되지 않는 문제때문...
//KUIWnd * pItemBase = GetChild( "item_base" );
//std::list<KUIWnd*>::iterator it = std::find( m_listChild.begin(), m_listChild.end(), pItemBase );
//if( it != m_listChild.end() )
//{
// m_listChild.erase( it );
// m_listChild.push_front( pItemBase );
//}
//// 가장위로 뜨게함.
//this->SetChildAsTop( "select_red_01" );
//this->SetChildAsTop( "select_orange_01" );
// 선택된 아이템의 활성화 비쥬얼용 컨트롤.
m_pSelectedControl_Red = GetChild( "select_red_01" );
m_pSelectedControl_Orange = GetChild( "select_orange_01" );
m_pSelectedControl = m_pSelectedControl_Orange;
m_pSelectedControl->SetShow( false );
m_pSelectPosControl = GetChild( "select_list_cyan" ); // 셀렉트 위치좌표용 컨트롤.
return SUIWnd::InitControls( kPos );
}
void SUIGuildMemberTab::ProcMsgAtStatic( SGameMessage* pMsg )
{
switch(pMsg->nType)
{
case IMSG_UI_GUILD_MANAGE_MODE : // 길드원 관리모드 설정.
{
SIMSG_UI_GUILD_WNDMSG * pData = dynamicCast< SIMSG_UI_GUILD_WNDMSG * >( pMsg );
m_bManageMode = pData->bMode;
// 관리모드시 셀렉트 표시.
ShowSelectManageMode();
pData->bUse = true;
}
break;
case IMSG_UI_GUILD_MASTER_MODE : // 길드마스터 모드 설정.
{
SIMSG_UI_GUILD_WNDMSG * pData = dynamicCast< SIMSG_UI_GUILD_WNDMSG * >( pMsg );
m_bMasterMode = pData->bMode;
// 마스터모드시 셀렉트 표시.
ShowSelectMasterMode();
pData->bUse = true;
}
break;
case IMSG_UI_GUILD_DONATE_MODE :
{
pMsg->bUse = true;
SIMSG_UI_GUILD_WNDMSG * pData = dynamicCast< SIMSG_UI_GUILD_WNDMSG * >( pMsg );
m_bMasterMode = pData->bMode;
}
break;
case MSG_CHANGE_NAME :
{
//RefreshMember( m_nScrollPos );
//RefreshStatic();
}
break;
case IMSG_UI_SEND_DATA:
{
SIMSG_UI_SEND_DATA *pData = (SIMSG_UI_SEND_DATA *)pMsg;
if( pData->m_strString == "guild_update" )
{
// 2010.12.07. bintitle. 길드있음.
if( m_GuildMgr.IsExist() )
{
if( this->IsShow() )
{
// 길드원 업데이트.
if( !(pData->m_dwData & GUILD_UPDATE::GUILD_UPDATE_GRAIDSIEGETIP) &&
!(pData->m_dwData & GUILD_UPDATE::GUILD_UPDATE_URL) &&
!(pData->m_dwData & GUILD_UPDATE::GUILD_UPDATE_NOTICE) &&
!(pData->m_dwData & GUILD_UPDATE::GUILD_UPDATE_AINFO) &&
!(pData->m_dwData & GUILD_UPDATE::GUILD_UPDATE_CHANGE_GUILD_NAME ) &&
!(pData->m_dwData & GUILD_UPDATE::GUILD_UPDATE_PROMOTE ) &&
!(pData->m_dwData & GUILD_UPDATE::GUILD_UPDATE_CHANGE_PERMISSION_SET ) &&
!(pData->m_dwData & GUILD_UPDATE::GUILD_UPDATE_ERROR_PERMISSION ) &&
!(pData->m_dwData & GUILD_UPDATE::GUILD_UPDATE_ERROR_NOT_EXIST )
)
{
UpdateGuildMember( pData->m_dwData );
// 등급명칭 변경시에 권한처리 안함.
if( !(pData->m_dwData & GUILD_UPDATE::GUILD_UPDATE_CHANGE_PERMISSION_NAME) )
{
// 권한처리.
AuthorityProcess() ;
}
m_bUIRefresh = false; // UI갱신X.
m_nRefresh = GUILD_UPDATE::GUILD_UPDATE_NONE; // 갱신조건 클리어.
}
}
else
{
m_bUIRefresh = true; // 갱신.
m_nRefresh |= pData->m_dwData; // UI open 시에 비교하기위해 갱신조건 누적.
}
}
// 2010.12.07. 길드없음.
else
{
m_bFirstOpen = false;
}
}
}
break;
}
}
void SUIGuildMemberTab::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam )
{
if( this->IsShow() )
{
switch( nMessage )
{
case KUI_MESSAGE::KBUTTON_CLICK :
// close.
if( !::_stricmp( lpszControlID, "button_close" ) )
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_MAINWND, false ) );
else if( !::_stricmp( lpszControlID, "button_list_default_01" ) )
{
// 모든 버튼정렬상태 해제.
ClearBtnSortStateAll();
}
break;
// Scroll
case KUI_MESSAGE::KSCROLL_SELECT :
{
m_nScrollPos = max( (int)lparam, 0 );
// 스크롤이 계속 내려가는걸 방지.
int nMembersSize = m_GuildMgr.GetMemberCount();
if( ( nMembersSize + m_pListGuild->GetExtendItemCount() ) < m_pListGuild->GetListConut() ) // + m_pListGuild->GetExtendItemCount() ) )
m_nScrollPos = 0;
// 길드원정보 재설정.
RefreshListMember( m_nScrollPos );
// 확장된 만큼 스크롤바 조절.
RefreshScrollbarExtend();
// 선택된 아이템 활성화 비쥬얼 처리.
RevitalizeSelectItem();
}
break;
//case KUI_MESSAGE::KSCROLL_REFRESH :
//
// // 길드원정보 재설정.
// RefreshListMember( m_nScrollPos );
// // 확장된 만큼 스크롤바 조절.
// RefreshScrollbarExtend();
// // 선택된 아이템 활성화 비쥬얼 처리.
// RevitalizeSelectItem();
// break;
//-------------------------------------------------------------------------
// ListControl Message
//
case KUI_MESSAGE::KLIST_ITEM_MOUSEMOVE :
{
MSG_LISTCONTROL msg = *( (MSG_LISTCONTROL *)( &lparam ) );
if( ITEMTYPE::TYPE_ITEM_Base == msg.type || ITEMTYPE::TYPE_ITEM_Column == msg.type )
{
KUIControl * pControl;
if( m_pListGuild->GetControl( pControl, ( ITEMTYPE )msg.type, msg.itemIndex, msg.columnIndex ) )
{
// 길드원 메모 오버랩.
if( !::_stricmp( pControl->GetID(), "guild_memo_text_01" ) &&
::_stricmp( pControl->GetCaption(), CStringUtil::StringFormat( "<font:font_02><size:%d><#4d4d4d><hcenter><left>", pControl->GetFontSize()).c_str() ) ) // g_MemoDecoSize < sizeof( pControl->GetCaption() ) )
{
// 메모뷰 오픈.
static DWORD dwTime = 0;
if(GetSafeTickCount() - dwTime > 300)
{
KUIControl * pBaseControl = m_pListGuild->GetItem( msg.itemIndex )->GetBaseControl();
if( pBaseControl )
{
ShowMemoView( pBaseControl, this->m_GuildMgr.FindMember( GetSelectedMemberName( msg.itemIndex ) )->GetGuildMemo() );
}
dwTime = GetSafeTickCount();
}
}
}
}
}
break;
case KUI_MESSAGE::KLIST_ITEM_LBUTTON_DOWN :
// ** MSG_LISTCONTROL msg = *( (MSG_LISTCONTROL *)( &pumpMsg ) );
{
PumpUpMsgLBtnClick_V(lparam);
}
break;
case KUI_MESSAGE::KLIST_ITEM_LBUTTON_DBCLICK :
{
PumpUpMsgDBClick(lparam);
}
break;
case KUI_MESSAGE::KLIST_ITEM_RBUTTON_UP :
break;
case KUI_MESSAGE::KLIST_ITEM_RBUTTON_DOWN :
{
PumpUpMsgRBtnClick(lparam);
}
break;
}
SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam );
}
}
// 스크롤바 설정.
void SUIGuildMemberTab::RefreshScrollbar()
{
if( m_pScrollBar && m_pListGuild )
{
m_pScrollBar->SetScrollRange( m_pListGuild->GetListConutMAX(), m_GuildMgr.GetMemberCount() );
}
}
// 스크롤바 설정.
// 확장된 아이템을 검사하여 ScrollRange의 Total에 추가한다.
void SUIGuildMemberTab::RefreshScrollbarExtend()
{
//if( m_pScrollBar && m_pListGuild )
//{
// // TotalCount
// int nExtend = 0;
// int size = m_GuildMgr.GetMemberCount();
// for( int i=0; i<size; i++ )
// {
// if( m_pListGuild->GetIsExtend( i ) )
// ++nExtend;
// }
// int nRest = nExtend % 2;
// nExtend = nExtend > 0 ? nExtend / 2 + nRest : nExtend;
// //nExtend = nRest > 0 ? nExtend : nExtend + 1;
// //nExtend = nExtend + 1;
// m_pScrollBar->SetScrollRange( m_pListGuild->GetListConutMAX(), size + nExtend + 1 );
//}
if( m_pScrollBar && m_pListGuild )
{
// TotalCount
int nExtend = 0;
int size = m_GuildMgr.GetMemberCount();
for( int i=0; i<size; i++ )
{
if( m_pListGuild->GetIsExtend( i ) )
++nExtend;
}
if( nExtend )
{
int nRest = nExtend % 2;
nExtend = nExtend / 2 + nRest + 2;
}
m_pScrollBar->SetScrollRange( m_pListGuild->GetListConutMAX(), size + nExtend );
}
//if( m_pScrollBar && m_pListGuild )
//{
// // TotalCount
// int nExtend = 0;
// int size = m_GuildMgr.GetMemberCount();
// for( int i=0; i<size; i++ )
// {
// if( m_pListGuild->GetIsExtend( i ) )
// ++nExtend;
// }
// nExtend = nExtend > 0 ? nExtend / 2 : nExtend;
// //nExtend = nRest > 0 ? nExtend : nExtend + 1;
// //nExtend = nExtend + 1;
// m_pScrollBar->SetScrollRange( m_pListGuild->GetListConutMAX(), size + nExtend + 2 );
//}
}
DWORD SUIGuildMemberTab::OnMouseMessage(DWORD dwMessage, int x, int y)
{
switch( dwMessage )
{
case KMOUSE_MOVE :
case KLBUTTON_DBLCLK :
// ListControl 의 Mouse Event 처리.
if( m_GuildMgr.GetMemberCount() > 0 && m_pListGuild )
m_pListGuild->OnMouseMessage( dwMessage, x, y );
//// // 팝업창이 떠 있는 경우.
//// if( m_pMemberPopupWnd->GetIsOpen() )
//// {
//// // 마우스가 팝업창영역을 벗어나면 닫기.
//// m_pMemberPopupWnd->PopupVisiblity( x, y );
//// }
//
break;
case KLBUTTON_DOWN :
case KRBUTTON_DOWN :
m_ptMouseDown.x = x;
m_ptMouseDown.y = y;
// ListControl 의 Mouse Event 처리.
if( m_GuildMgr.GetMemberCount() > 0 && m_pListGuild )
m_pListGuild->OnMouseMessage( dwMessage, x, y );
break;
//// 팝업창 띄우기.
//case KRBUTTON_DOWN :
// //
// // 멤버관련 팝업.
// ShowMemberPopup( x, y );
// break;
//// TEST 맴버추가
//case KRBUTTON_DBLCLK :
// {
// static int kkk = 0;
// m_GuildMgr.AddMember( CStringUtil::StringFormat( "데바임%3d", ++kkk ).c_str() );
// // 리스트 업데이트.
// UpdateGuildMember();
// }
// break;
}
return SUIWnd::OnMouseMessage(dwMessage, x, y);
}
// ListControl 에 길드원정보를 맵핑한다.
void SUIGuildMemberTab::RefreshListMember( int nScroll )
{
if( m_pListGuild )
{
// 전체확장버튼이 ON 상태의 경우, 새로 추가된 아이템도 확장하기위한 처리.
// if( m_bExtendAll )
// m_pListGuild->SetResizeAll( m_bExtendAll );
int nMembersSize = m_arrMember.size(); // 길드원 정보 배열.
int maxSize = m_pListGuild->GetListConutMAX(); // 리스트 최대개수.
int memberIndex = 0;
KUIControl * pButtonExtension; // 확장버튼.
for( int i=0; i<maxSize; ++i )
{
// ListControl 의 Item.
KUIListItem * pItem = m_pListGuild->GetItem( i );
if( pItem )
{
memberIndex = i + nScroll;
// index가 길드맴버수 이하인동안 Refresh.
if( memberIndex < nMembersSize )
{
// 각 컨트롤에 정보 맵핑.
DataMapping( pItem, m_arrMember[ memberIndex ] );
//-------------------------------
// ** 해당 아이템을 확장 or 축소(원본크기) 한다.
m_pListGuild->SetResize( i, memberIndex, 2 );
// 확장여부에따른 버튼 애니 변경.
if( pItem->GetControl( pButtonExtension, "item_button_unfold") )
ListItemExtend( pButtonExtension, pItem->GetIsExtension() ); // 리스트아이템 확대,축소
}
}
}// for
//-------------------------------
// ** 리스트정보 최종 업데이트.
m_pListGuild->RefreshList( m_nScrollPos );
}
}
// 멤버리스트 초기화.
void SUIGuildMemberTab::InitMemberList( unsigned int nUpdateState )
{
// if( !( nUpdateState & GUILD_UPDATE::GUILD_UPDATE_CHANGE_PERMISSION_NAME ) )
// {
// 정렬용 벡터에 복사.
m_arrMember = m_GuildMgr.GetMemberList();
// 선택된 아이템의 활성화 비쥬얼용 컨트롤.
if( m_pSelectedControl )
m_pSelectedControl->SetShow( false );
// 리스트의 각 아이템의 상태정보.
if( m_pListGuild )
{
int size = m_GuildMgr.GetMemberCount();
m_pListGuild->RefreshItemState( size );
m_pListGuild->ResetSelectedIndex(); // 선택된 아이템 무효.
}
// 정렬.
UpdateNSortMemberList();
// }
// 길드원정보 갱신.
RefreshListMember( m_nScrollPos );
// if( !(nUpdateState & GUILD_UPDATE::GUILD_UPDATE_CHANGE_PERMISSION_NAME) )
// {
// Scroll bar
RefreshScrollbarExtend();
// }
}
// 길드원 업데이트.
void SUIGuildMemberTab::UpdateGuildMember( unsigned int nUpdateState )
{
// 멤버리스트 초기화.
InitMemberList( nUpdateState );
}
//강제 프로세스
void SUIGuildMemberTab::ForcedProcess(DWORD dwTime)
{
//if( !m_bFirstOpen || m_GuildMgr.GetMemberCount() < 1 ) // bintitle. 2010.11.26
if( !m_bFirstOpen )
{
// 리스트 관련.
m_nScrollPos = 0; // scroll bar의 변경 정보.
m_bExtendAll = false; // 전체 아이템 확장여부.
m_bFirstOpen = true;
// 확장버튼 토글.
m_pListGuild->SetResizeAll( false );
InitMemberList( GUILD_UPDATE::GUILD_UPDATE_NONE ); // 멤버리스트 초기화.
// 권한처리.
AuthorityProcess() ;
}
// bintitle. 2010.12.07.
else
{
if( this->IsShow() )
{
UpdateGuildMember( m_nRefresh ); // 멤버리스트 초기화.
// 권한처리.
AuthorityProcess() ;
m_bUIRefresh = false; // UI갱신X.
m_nRefresh = GUILD_UPDATE::GUILD_UPDATE_NONE; // 갱신조건 클리어.
m_beforeGuildMember = m_GuildMgr.GetGuildMemberCount(); // 이전 길드원 수 저장.
}
else
{
m_bUIRefresh = false; // 갱신여부 클리어.
m_nRefresh = GUILD_UPDATE::GUILD_UPDATE_NONE; // 갱신조건 클리어.
}
}
}
// 선택한 아이템의 활성화 비쥬얼 처리.
bool SUIGuildMemberTab::SelectedControl( KUIControl * pSelectionControl )
{
if( m_pSelectedControl && pSelectionControl )
{
// if( pSelectionControl->IsShow() )
// {
//// pSelectionControl->SetShow( false ); // 이전 셀렉트 숨김.
//
// // 매니저 모드?
//// m_pSelectedControl = m_bManageMode ? m_pSelectedControl_Red : m_pSelectedControl_Orange;
//
// KRect rtSelCtrl = pSelectionControl->GetRect();
//// rtSelCtrl.left -= 2;
//// rtSelCtrl.top -= 2;
//// rtSelCtrl.bottom += 1;
// /*rtSelCtrl.left -= 3;
// rtSelCtrl.top -= 3;
// rtSelCtrl.right += 2;
// rtSelCtrl.bottom += 2;*/
//
//
// // 크기 변환.
// m_pSelectedControl->Resize( rtSelCtrl );
//
// // 위치 이동.
// m_pSelectedControl->MovePos( rtSelCtrl.left+1, rtSelCtrl.top+1 );
//
// // 보임.
// m_pSelectedControl->SetShow( true );
//
// //m_pSelectedControl->SetAlphaClose(0);
//
// return true;
// }
// }
//KRect rtSelCtrl = pSelectionControl->GetRect();
//// 크기 변환.
//m_pSelectedControl->Resize( rtSelCtrl );
//// 위치 이동.
//m_pSelectedControl->MovePos( rtSelCtrl.left+1, rtSelCtrl.top+1 );
//
//// 보임.
//m_pSelectedControl->SetShow( true );
//return true;
m_pSelectedControl->SetShow( false ); // 이전 셀렉트 숨김.
// 매니저 모드? 또는 마스터모드
//m_pSelectedControl = m_bManageMode ? m_pSelectedControl_Red : m_pSelectedControl_Orange;
m_pSelectedControl = m_pSelectedControl_Orange;
if( m_bManageMode || m_bMasterMode )
m_pSelectedControl = m_pSelectedControl_Red;
if( m_pSelectedControl )
{
// Item_Base 보다 위에 뜨게 해야한다. 툴상의 LayOut 이 제대로 적용되지 않는 문제때문...
std::list<KUIWnd*>::iterator it_itembase = std::find( m_listChild.begin(), m_listChild.end(), static_cast< KUIWnd * >( pSelectionControl ) ); // ItemBase 위치.
std::list<KUIWnd*>::iterator it_select = std::find( m_listChild.begin(), m_listChild.end(), static_cast< KUIWnd * >( m_pSelectedControl ) ); // SelectControl.
if( it_itembase != m_listChild.end() && it_select != m_listChild.end() )
{
m_listChild.erase( it_select );
m_listChild.insert( ( ++it_itembase ), m_pSelectedControl ); // insert는 iterator의 앞쪽에 추가되므로 + 1 한다.
}
//// 가장위로 뜨게함.
//this->SetChildAsTop( "select_red_01" );
//this->SetChildAsTop( "select_orange_01" );
KRect rtSelCtrl = pSelectionControl->GetRect();
// 크기 변환.
m_pSelectedControl->Resize( rtSelCtrl );
// 위치 이동.
m_pSelectedControl->MovePos( rtSelCtrl.left, rtSelCtrl.top );
// 보임.
m_pSelectedControl->SetShow( true );
return true;
}
}
return false;
}
// 선택된 아이템 활성화 비쥬얼 처리.
void SUIGuildMemberTab::RevitalizeSelectItem()
{
bool bShow = false;
// 선택된 아이템 인덱스.
int selectIndex = m_pListGuild->GetSelectedIndex();
// 보이는 마지막 아이템의 인덱스.
int endIndex = m_pListGuild->GetIndexOfVisibleEndItem() + m_nScrollPos;
if( selectIndex > -1 && endIndex >= selectIndex )
{
selectIndex -= m_nScrollPos;
if( selectIndex > -1 )
{
KUIListItem * pItem = m_pListGuild->GetItem( selectIndex );
if( pItem )
{
// 해당 컨트롤 위치에 활성화 컨트롤 출력.
bShow = SelectedControl( pItem->GetBaseControl() );
}
}
}
// 숨김.
if( !bShow )
m_pSelectedControl->SetShow( false );
}
// ListControl 의 해당 아이템열의 각 컨트롤에 Player의 정보 맵핑
void SUIGuildMemberTab::DataMapping( KUIListItem * pItem, SPlayerSlot * pPlayer )
{
if( pItem && pPlayer )
{
KUIControl * pControl;
int bIsLogin = pPlayer->GetLogin();
KUIControlStatic * pControlStatic;
// 접속 컨트롤.
if( pItem->GetControl( pControl, "item_static_connection_state" ) )
{
pControlStatic = dynamicCast< KUIControlStatic * >( pControl );
if( m_bFirstDataMapping || ::_stricmp( pControlStatic->GetAniName(), g_StrConnectIcon[ bIsLogin ] ) )
pControlStatic->SetAniName( g_StrConnectIcon[ bIsLogin ] );
//( bIsLogin ? "common_mark_titanium_online" : "common_mark_titanium_offline") );
}
// 직업 컨트롤.
if( pItem->GetControl( pControl, "item_icon_member_job_icon" ) )
{
string jobName = GetJobDB().GetJobIconName( pPlayer->GetJobID() );
pControlStatic = dynamicCast< KUIControlStatic * >( pControl );
//if( m_bFirstDataMapping || ::_stricmp( pControlIconStatic->GetAniName(), ( bIsLogin ? jobName.c_str() : jobName.append("_off").c_str() ) ) )
pControlStatic->SetAniName( ( bIsLogin ? jobName.c_str() : jobName.append("_off").c_str() ) );
}
// Level 컨트롤
if( pItem->GetControl( pControl, "item_static_member_level" ) )
{
int myLevel = m_PlayerInfoMgr.GetPlayerInfo().GetLevel();
int memberLevel = pPlayer->GetLevel();
std::string strCaption = abs( myLevel - memberLevel ) <= 15 ? "<#8dc63f>" : "";
strCaption.append( bIsLogin ? "" : "<#4d4d4d>" );
std::string str = CStringUtil::StringFormat( "<font:font_02><size:%d><hcenter><vcenter>%s%d", pControl->GetFontSize(), strCaption.c_str(), memberLevel );
if( m_bFirstDataMapping || str != pControl->GetCaption() )
pControl->SetCaption( str.c_str() );
}
// 아이디 컨트롤
if( pItem->GetControl( pControl, "item_static_member_name" ) )
{
//string strCutName = bIsLogin ? "<font:font_02><size:9><hcenter><vcenter>" : "<font:font_02><size:9><#4d4d4d><hcenter><vcenter>";
string strCutName = CStringUtil::StringFormat( "<font:font_02><size:%d>%s<hcenter><vcenter>", pControl->GetFontSize(), bIsLogin ? "" : "<#4d4d4d>" );
strCutName.append( pPlayer->GetName() ) ;
//CuttingText( pControl, strCutName );
pControl->SetCaption( strCutName.c_str() );
pControl->CutCaptionNTooltip();
}
// Point 컨트롤
if( pItem->GetControl( pControl, "item_static_member_point" ) )
{
int point = pPlayer->GetPoint();
std::string str = CStringUtil::StringFormat( "<font:font_02><size:%d><hcenter><vcenter>%s%s", pControl->GetFontSize(), bIsLogin ? "" : "<#4d4d4d>", expToString( point ).c_str() );
pControl->SetCaption( str.c_str() );
}
// 등급.
if( pItem->GetControl( pControl, "mark_guild_class_01" ) )
{
// common_mark_titanium_guild_class_01
int nClass = pPlayer->GetAuthority();
if( nClass != _PERMISSION::PERMISSION_LEADER )
nClass = _PERMISSION::PERMISSION_LEADER - nClass;
pControlStatic = dynamicCast< KUIControlStatic * >( pControl );
pControlStatic->SetAniName( CStringUtil::StringFormat( "common_mark_titanium_guild_class_0%d", nClass ).c_str() );
}
// 등급명.
if( pItem->GetControl( pControl, "text_guild_class_01" ) )
{
// 길드마스터
if( pPlayer->GetAuthority() == 7 )
pControl->SetCaption( CStringUtil::StringFormat("<font:font_02><size:%d><#955c5c><hcenter><left>%s", pControl->GetFontSize(), S(3508) ).c_str() );
else
{
// -1 하는 이유 : 등급은 1부터시작, 클래스명배열은 0부터 시작. 따라서 -1로 맞춰줌.
const char * pStr = this->m_GuildMgr.GetAuthorityClassName( ( pPlayer->GetAuthority() - 1 ) );
if( pStr )
pControl->SetCaption( CStringUtil::StringFormat( "<font:font_02><size:%d><#955c5c><hcenter><left>%s", pControl->GetFontSize(), pStr ).c_str() );
//pControl->SetCaption( pStr );
}
pControl->CutCaptionNTooltip();
}
// 메모텍스트
if( pItem->GetControl( pControl, "guild_memo_text_01" ) )
{
string strCutMemo( pPlayer->GetGuildMemo() );
//CuttingText( pControl, strCutMemo );
pControl->SetCaption( CStringUtil::StringFormat( "<font:font_02><size:%d><#4d4d4d><hcenter><left>%s", pControl->GetFontSize(), strCutMemo.c_str() ).c_str() );
pControl->CutCaptionNTooltip();
}
}
// 최초 데이타 셋팅.
if( m_bFirstDataMapping )
m_bFirstDataMapping = false;
}
// 리스트아이템 확대,축소
void SUIGuildMemberTab::ListItemExtend( KUIControl * pButton, bool bExtension )
{
//static_cast< KUIControlSimpleButton * >( pButton )->SetAniName(
// bExtension ? "common_button_titanium_fold" : "common_button_titanium_unfold" );
KUIControlSimpleButton * pControl = dynamicCast< KUIControlSimpleButton * >( pButton );
if( ::_stricmp( pControl->GetAniName(), ( bExtension ? "common_button_titanium_fold" : "common_button_titanium_unfold" ) ) )
{
pControl->SetAniName( ( bExtension ? "common_button_titanium_fold" : "common_button_titanium_unfold" ) );
}
}
// 멤버관련 팝업.
void SUIGuildMemberTab::ShowMemberPopup( int x, int y, const char * strName )
{
// 팝업RECT.
//KRect rtPopup = m_pMemberPopupWnd->GetRect();
// 이전에 열려있을 경우를 대비해서 닫는다.
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_SUBMENU_RIGHTCLICK, false ) );
x -= 10; y -= 10;
if( strName )
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_SUBMENU_RIGHTCLICK, false ) ); // 이전팝업 Wnd 닫기.
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_MOVE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_SUBMENU_RIGHTCLICK, x, y ) ); // 위치이동.
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_SUBMENU_RIGHTCLICK, true ) ); // 팝업 Wnd 열기.
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_SUBMENU_RIGHTCLICK, strName ) ); // Data 전달.
}
}
// 선택된 인덱스의 길드원 명 반환.
const char * SUIGuildMemberTab::GetSelectedMemberName( int nRow )
{
if( m_nScrollPos + nRow < m_GuildMgr.GetMemberCount() )
{
//return m_GuildMgr.GetMemberList()[ m_nScrollPos + nRow ]->GetName();
return m_arrMember[ m_nScrollPos + nRow ]->GetName();
}
return NULL;
}
// 메모뷰 오픈.
void SUIGuildMemberTab::ShowMemoView( KUIControl * pBaseControl, const std::string & strMemo )
{
//if( m_pMemoControl && m_pMemoViewWnd )
if( pBaseControl )
{
// 위치이동 및 크기 지정.
KRect rt = pBaseControl->GetRect();
rt.top += ( rt.GetHeight() / 2 );
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SETUP_REGION( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_MEMOWND, "guild_ui_list_box_01", rt.left, rt.top ) );
// 메모 데이터 전송.
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_MEMOWND, "guild_memo", strMemo.c_str(), 1 ) );
// 팝업 Wnd 열기.
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_MEMOWND, true ) );
}
}
// 길드원 관리 모드, 관리대상 길드원명 전송.
void SUIGuildMemberTab::MemberManageMode( const char * pStrName, const char * pStrClassName )
{
if( pStrName )
{
std::string strName( pStrName );
// 길드원 이름으로 길드원의 등급명 얻기.
std::string strClassName("");
SPlayerSlot * pPlayer = m_GuildMgr.GetPlayerByName( pStrName );
if( pPlayer )
{
int nClass = pPlayer->GetAuthority();
if( nClass == 7 ) // 길드장.
strClassName = S(3508);
else
strClassName = m_GuildMgr.GetAuthorityClassName( nClass - 1 );
}
// 길드원관리패널( 길드원등급 팝업 )
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_GUILD_WNDMSG( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_SUB_MANAGE_CLASS,
SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_SUB_MANAGE_CLASS,
IMSG_UI_GUILD_MEMBERCLASS_SETUP, strName, strClassName )
);
// 길드원관리패널( 길드원제명 팝업 )
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_GUILD_WNDMSG( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_SUB_MANAGE_EXPULSION,
SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_SUB_MANAGE_EXPULSION,
IMSG_UI_GUILD_EXPULSION_SETUP, strName, strClassName )
);
}
}
// 길드마스터 모드, 길드장인계 대상 길드원명 전송.
void SUIGuildMemberTab::GuildMasterMode( const char * pStrName, const char * pStrClassName )
{
if( pStrName )
{
//// 길드원관리패널( 길드원등급 팝업 )
//m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_SUB_MASTER_PROMOTE, pStrName, "PROMOTE" ) );
// 길드원 이름으로 길드원의 등급명 얻기.
std::string strClassName("");
SPlayerSlot * pPlayer = m_GuildMgr.GetPlayerByName( pStrName );
if( pPlayer )
{
int nClass = pPlayer->GetAuthority();
if( nClass == 7 ) // 길드장.
strClassName = S(3508);
else
strClassName = m_GuildMgr.GetAuthorityClassName( nClass - 1 );
}
// 길드원관리패널( 길드원제명 팝업 )
std::string strName( pStrName );
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_GUILD_WNDMSG( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_SUB_MASTER_PROMOTE,
SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_SUB_MASTER_PROMOTE,
IMSG_UI_GUILD_PROMOTE_TO_MEMBER, strName, strClassName )
);
}
}
// 관리모드시 셀렉트 표시.
void SUIGuildMemberTab::ShowSelectManageMode()
{
// 위치 이동.
m_pTabSelectControl->MovePos( m_pSelectPosControl->GetRect().left, m_pSelectPosControl->GetRect().top );
m_pTabSelectControl->SetShow( m_bManageMode );
}
// 마스터모드시 셀렉트 표시.
void SUIGuildMemberTab::ShowSelectMasterMode()
{
// 위치 이동.
m_pTabSelectControl->MovePos( m_pSelectPosControl->GetRect().left, m_pSelectPosControl->GetRect().top );
m_pTabSelectControl->SetShow( m_bMasterMode );
}
//// 리스트 정렬.
//void SUIGuildMemberTab::SortMemberList( KUIControl * pControl )
//{
// this->ToggleBtnSortState( m_nSortCondition ); // 상태전환.
//
// int nState = this->GetToggleBtnSortState( m_nSortCondition );
// switch( nState )
// {
// case 0 : // 비정렬.
// m_arrMember = m_GuildMgr.GetMemberList();
// break;
//
// case 1 : // 내림차순.
// sort( m_arrMember.begin(), m_arrMember.end(), g_arrComp_down[ m_nSortCondition ] );
// break;
//
// case 2 : // 오름차순.
// sort( m_arrMember.begin(), m_arrMember.end(), g_arrComp_up[ m_nSortCondition ] );
// break;
// }
//
// //m_pGameManager->PostMsgAtDynamic( new SIMSG_REQ_OPEN_MSGBOX( SIMSG_REQ_OPEN_MSGBOX::_MSGBOXID::MSGBOX_GUILD_YES, g_arrStrSortIcon[ m_nSortCondition ][ nState ] ) );
//
// // 버튼 애니 변경.
// pControl->SetAniName( g_arrStrSortIcon[ m_nSortCondition ][ nState ] );
//
// //pControl->SetAniName( "common_button_titanium_line_up" );
//
// // 리스트 Refresh.
// RefreshListMember( m_nScrollPos );
//}
// 버튼정렬상태 토글.
void SUIGuildMemberTab::ToggleBtnSortState( int index )
{
int num = m_arrSortState[ index ] + 1;
if( num >= MAX_BTN_SORT_STATE )
num = 0;
for( int i=0; i<MAX_BTN_SORT_STATE_SIZE; ++i )
{
if( i == index )
m_arrSortState[ index ] = num;
else
m_arrSortState[ i ] = 0;
}
//int num = m_arrSortState[ index ] + 1;
//if( num >= MAX_BTN_SORT_STATE )
// num = 0;
//m_arrSortState[ index ] = num;
}
// 리스트 정렬.
void SUIGuildMemberTab::SortMemberList()
{
this->ToggleBtnSortState( m_nSortCondition ); // 상태전환.
int nState = this->GetToggleBtnSortState( m_nSortCondition );
switch( nState )
{
case 0 : // 비정렬.
m_arrMember = m_GuildMgr.GetMemberList();
break;
case 1 : // 내림차순.
sort( m_arrMember.begin(), m_arrMember.end(), g_arrComp_down[ m_nSortCondition ] );
break;
case 2 :
sort( m_arrMember.begin(), m_arrMember.end(), g_arrComp_up[ m_nSortCondition ] );
break;
case 3 :
sort( m_arrMember.begin(), m_arrMember.end(), g_arrComp_down[ m_nSortCondition ] );
break;
case 4 :
sort( m_arrMember.begin(), m_arrMember.end(), g_arrComp_up[ m_nSortCondition ] );
break;
}
//// 버튼 애니 변경.
//for( int i=0; i<MAX_BTN_SORT_STATE_SIZE; ++i )
//{
// if( i == m_nSortCondition )
// m_arrSortBtn[ m_nSortCondition ]->SetAniName( g_arrStrSortIcon[ m_nSortCondition ][ nState ] );
// else
// m_arrSortBtn[ i ]->SetAniName( g_arrStrSortIcon[ i ][ 0 ] );
//}
// 버튼 애니 변경.
// 늘어나는 버튼이 SetAniName() 으로 이미지변경이 안되는 이유로 불가피한 처리.
for( int i=0; i<MAX_BTN_SORT_STATE_SIZE; ++i )
{
if( i == m_nSortCondition )
{
// 일반버튼.
if( i < 2 )
{
m_arrSortBtn[ m_nSortCondition ]->SetAniName( g_arrStrSortIcon[ m_nSortCondition ][ nState ] );
}
}
else
{
// 일반버튼.
if( i < 2 )
{
m_arrSortBtn[ i ]->SetAniName( g_arrStrSortIcon[ i ][ 0 ] );
}
}
}
////
//// 버튼 애니 변경.
//if( m_nSortCondition < 2 ) // 일반버튼.
//{
// for( int i=0; i<2; ++i )
// {
// if( i == m_nSortCondition )
// m_arrSortBtn[ m_nSortCondition ]->SetAniName( g_arrStrSortIcon[ m_nSortCondition ][ nState ] );
// else
// m_arrSortBtn[ i ]->SetAniName( g_arrStrSortIcon[ i ][ 0 ] );
// }
//}
//else // 늘어난 버튼. SetAniName() 으로 이미지변경이 불가하여 트릭적용.
//{
//
//}
// 리스트 Refresh.
RefreshListMember( m_nScrollPos );
}
// 리스트 정렬. 맴버 Update.
void SUIGuildMemberTab::UpdateNSortMemberList()
{
for( int i=0; i<MAX_BTN_SORT_STATE_SIZE - 2; i++ )
{
int nSortState = m_arrSortState[ i ]; // 정렬 상태.
switch( nSortState )
{
case 0 : // 비정렬.
// m_arrMember = m_GuildMgr.GetMemberList();
ClearBtnSortStateAll();
break;
case 1 : // 내림차순.
sort( m_arrMember.begin(), m_arrMember.end(), g_arrComp_down[ i ] );
m_arrSortBtn[ i ]->SetAniName( g_arrStrSortIcon[ i ][ nSortState ] ); // 버튼 애니 변경.
break;
case 2 : // 오름차순.
sort( m_arrMember.begin(), m_arrMember.end(), g_arrComp_up[ i ] );
m_arrSortBtn[ i ]->SetAniName( g_arrStrSortIcon[ i ][ nSortState ] ); // 버튼 애니 변경.
break;
}
}
// 리스트 Refresh.
//RefreshListMember( m_nScrollPos );
}
// 모든 버튼정렬상태 해제.
void SUIGuildMemberTab::ClearBtnSortStateAll()
{
for( int i=0; i<2; ++i )
{
m_arrSortState[ i ] = 0;
m_arrSortBtn[ i ]->SetAniName( g_arrStrSortIcon[ i ][ 0 ] );
}
/*for( int i=0; i<MAX_BTN_SORT_STATE_SIZE; ++i )
{
m_arrSortState[ i ] = 0;
m_arrSortBtn[ i ]->SetAniName( g_arrStrSortIcon[ i ][ 0 ] );
}*/
m_arrMember = m_GuildMgr.GetMemberList();
// 리스트 Refresh.
RefreshListMember( m_nScrollPos );
}
inline void SUIGuildMemberTab::DisableBtnCtrl( const char * pStr )
{
KUIControl * pControl = dynamicCast< KUIControl * >( GetChild( pStr ) );
if( !( pControl->IsDisable() ) )
pControl->Disable();
}
inline void SUIGuildMemberTab::EnableBtnCtrl( const char * pStr )
{
KUIControl * pControl = dynamicCast< KUIControl * >( GetChild( pStr ) );
if( pControl->IsDisable() )
pControl->Enable();
}
// 권한처리.
void SUIGuildMemberTab::AuthorityProcess()
{
//----------------------------
// 길드가 없다.
//if( m_GuildMgr.GetMemberCount() < 1 )
//{
// DisableBtnCtrl( "header_static_connection_state" ); // 접속.
// DisableBtnCtrl( "header_icon_member_job_icon" ); // 직업.
// DisableBtnCtrl( "header_static_member_level" ); // 레벨.
// DisableBtnCtrl( "header_static_member_name" ); // 아이디
// DisableBtnCtrl( "header_button_unfold" ); // 확장.
// DisableBtnCtrl( "button_list_default_01" ); // 정렬취소.
// m_pScrollBar->SetShow( false );
//}
////----------------------------
//// 길드 존재
//else if( m_beforeGuildMember != m_GuildMgr.GetMemberCount() )
//{
// m_beforeGuildMember = m_GuildMgr.GetMemberCount(); // 이전 길드원수.
// EnableBtnCtrl( "header_static_connection_state" ); // 접속.
// EnableBtnCtrl( "header_icon_member_job_icon" ); // 직업.
// EnableBtnCtrl( "header_static_member_level" ); // 레벨.
// EnableBtnCtrl( "header_static_member_name" ); // 아이디
// EnableBtnCtrl( "header_button_unfold" ); // 확장.
// EnableBtnCtrl( "button_list_default_01" ); // 정렬취소.
// m_pScrollBar->SetShow( true );
//}
//----------------------------
// 길드 존재
if( m_GuildMgr.IsExist() )
{
m_beforeGuildMember = m_GuildMgr.GetMemberCount(); // 이전 길드원수.
EnableBtnCtrl( "header_static_connection_state" ); // 접속.
EnableBtnCtrl( "header_icon_member_job_icon" ); // 직업.
EnableBtnCtrl( "header_static_member_level" ); // 레벨.
EnableBtnCtrl( "header_static_member_name" ); // 아이디
EnableBtnCtrl( "header_static_member_point" );
EnableBtnCtrl( "header_button_unfold" ); // 확장.
EnableBtnCtrl( "button_list_default_01" ); // 정렬취소.
m_pScrollBar->SetShow( true );
}
// 길드없다.
else
{
DisableBtnCtrl( "header_static_connection_state" ); // 접속.
DisableBtnCtrl( "header_icon_member_job_icon" ); // 직업.
DisableBtnCtrl( "header_static_member_level" ); // 레벨.
DisableBtnCtrl( "header_static_member_name" ); // 아이디
DisableBtnCtrl( "header_static_member_point" );
DisableBtnCtrl( "header_button_unfold" ); // 확장.
DisableBtnCtrl( "button_list_default_01" ); // 정렬취소.
m_pScrollBar->SetShow( false );
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SUIGuildMemberList 2011. 10. 27 - marine
// SUIGuildMemberTab 의 자식..
// 공대파티, 공대 파티원의 초대를 편하게 하기 위해 길드원의 리스트 부분만 상속받은 클래스
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SUIGuildMemberList::SUIGuildMemberList( SGameManager * pGameManager )
:SUIGuildMemberTab( pGameManager )
{
}
SUIGuildMemberList::~SUIGuildMemberList()
{
}
bool SUIGuildMemberList::InitControls( KPoint kPos )
{
KUIControl* rmark = dynamicCast<KUIControl*>(GetChild("mark_right_click_01"));
if(rmark)
rmark->SetShow(false);
return SUIGuildMemberTab::InitControls( kPos );
}
void SUIGuildMemberList::PumpUpMsgDBClick( DWORD lparam )
{
MSG_LISTCONTROL msg = *( (MSG_LISTCONTROL *)( &lparam ) );
// ListControl 을 선택.
KUIControl * pControl;
if( m_pListGuild && m_pListGuild->GetControl( pControl, ( ITEMTYPE )msg.type, msg.itemIndex, msg.columnIndex ) )
{
// 아이템
if( ITEMTYPE::TYPE_ITEM_Base == msg.type || ITEMTYPE::TYPE_ITEM_Column == msg.type )
{
// 귓말하기.
const char * pName = GetSelectedMemberName( msg.itemIndex );
if( pName )
{
// 2011. 10. 26 - marine 공대 초대창이 열려 있고, 레이드가 구성되있는 경우 선택된 길드원 이름을 공대 초대창으로 넘긴다.
if( (m_RaidMgr.GetPartyCount() > 0) && m_pGameManager->IsShow( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT_INVITATION) )
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT_INVITATION, pName ) ); // 이름 넘기고
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_MEMBER_LIST, false ) ); // 창 닫자..
}
}
}
}
}
void SUIGuildMemberList::PumpUpMsgLBtnClick_V( DWORD lparam)
{
PumpUpMsgLBtnClick(lparam);
MSG_LISTCONTROL msg = *( (MSG_LISTCONTROL *)( &lparam ) );
KUIControl * pControl;
if( m_pListGuild && m_pListGuild->GetControl( pControl, ( ITEMTYPE )msg.type, msg.itemIndex, msg.columnIndex ) )
{
// 아이템
if( ITEMTYPE::TYPE_ITEM_Base == msg.type || ITEMTYPE::TYPE_ITEM_Column == msg.type )
{
const char * pName = GetSelectedMemberName( msg.itemIndex );
if( pName )
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT_INVITATION, pName ) ); // 이름 넘긴다
}
}
}
void SUIGuildMemberList::PumpUpMsgRBtnClick( DWORD lparam )
{
// 우클릭 사용 안함..
return;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SUIGuildMemberListView 2011. 10. 27 - marine
// SUIGuildMemberList의 프레임 클래스..
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SUIGuildMemberListView::SUIGuildMemberListView( SGameManager * pGameManager )
:SUIWnd( pGameManager )
,m_pMemberWnd(NULL)
{
}
SUIGuildMemberListView::~SUIGuildMemberListView()
{
}
SUIWnd* SUIGuildMemberListView::CreateWnd( const char* szFile, KUIWndManager* pWndManager, KPoint kPos, int nWindowID )
{
// 커스텀 윈도우 move 영역 설정
SetCustomMovingRect( KRect( 17, 7, 227, 15 ) );
SUIWnd::CreateWnd( szFile, pWndManager, kPos, nWindowID );
// 길드원.
SUIWnd * pTapMember = new SUIGuildMemberList( m_pGameManager );
pTapMember->SetUseCutCaption(); // 컨트롤의 Caption 텍스트 자르기.
pTapMember->CreateWnd( "window_guild_main_member_list.nui", pWndManager, KPoint( kPos.x, kPos.y ) );
pTapMember->SetParent( this );
pTapMember->SetShow(true);
AddChild(pTapMember);
// 위치설정
KRect rtTab = GetChild( "listcontrol01" )->GetRect(); // 탭 컨트롤 위치지정을 위한 컨트롤.
pTapMember->MovePos( rtTab.left, rtTab.top );
m_pMemberWnd = pTapMember;
return this;
}
void SUIGuildMemberListView::OnNotifyUIWindowOpen(bool bOpen, bool bLimitWnd)
{
if (bOpen)
{
updateGuildMemberList();
}
}
void SUIGuildMemberListView::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam )
{
if( this->IsShow() )
{
switch( nMessage )
{
case KUI_MESSAGE::KBUTTON_CLICK :
{
if( !::_stricmp( lpszControlID, "button_close" ) )
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_MEMBER_LIST, false ) );
else if( !::_stricmp( lpszControlID, "button_erase" ) )
{
if( m_pGameManager->IsShow(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT_INVITATION) ) // 공대 파티장 초대
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT_INVITATION, "" ) ); // 이름 지우기..
//else if () // 공대 파티원 초대..
//{
// // 공대 파티원 초대창으로... 애나가 처리
//}
}
else if( !::_stricmp( lpszControlID, "button_ok" ) )
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_MEMBER_LIST, false ) );
}
}break;
case KUI_MESSAGE::KGENWND_MOVE:
{
LimitMoveWnd();
}break;
}
SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam );
}
}
void SUIGuildMemberListView::ProcMsgAtStatic( SGameMessage* pMsg )
{
switch(pMsg->nType)
{
case IMSG_UI_SEND_DATA:
{
SIMSG_UI_SEND_DATA *pData = (SIMSG_UI_SEND_DATA *)pMsg;
if(pData)
{
if( pData->m_strString == "guild_update" )
{
/// 2012.02.13 - prodongi
if (IsShow())
{
updateGuildMemberList();
}
}
else if(pData->m_strString == "name")
m_strSelectedName = pData->m_strText;
}
}break;
}
}
/// 2012.02.13 - prodongi
void SUIGuildMemberListView::updateGuildMemberList()
{
if(!m_pMemberWnd)
return ;
SUIGuildMemberList* memberList = dynamicCast<SUIGuildMemberList*>(m_pMemberWnd);
if (!memberList)
return ;
if (!memberList->isUIRefresh())
return ;
memberList->ForcedProcess(0);
}