#include "stdafx.h" #include #include #include #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( "<#4d4d4d>" ); ///< 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 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::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( "<#4d4d4d>", 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; iGetIsExtend( 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; iGetIsExtend( 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; iGetIsExtend( 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; iGetItem( 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::iterator it_itembase = std::find( m_listChild.begin(), m_listChild.end(), static_cast< KUIWnd * >( pSelectionControl ) ); // ItemBase 위치. std::list::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( "%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 ? "" : "<#4d4d4d>"; string strCutName = CStringUtil::StringFormat( "%s", 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( "%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("<#955c5c>%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( "<#955c5c>%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( "<#4d4d4d>%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 ) // 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; iSetAniName( g_arrStrSortIcon[ m_nSortCondition ][ nState ] ); // else // m_arrSortBtn[ i ]->SetAniName( g_arrStrSortIcon[ i ][ 0 ] ); //} // 버튼 애니 변경. // 늘어나는 버튼이 SetAniName() 으로 이미지변경이 안되는 이유로 불가피한 처리. for( int i=0; iSetAniName( 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; iSetAniName( 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; iSetAniName( 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(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(m_pMemberWnd); if (!memberList) return ; if (!memberList->isUIRefresh()) return ; memberList->ForcedProcess(0); }