#include "StdAfx.h" #include "UIContainer.h" #include "InputSystem.h" #include "TabWindow.h" #include "RadioButton.h" #include "UIRootNode.h" cUIContainerSkin::cUIContainerSkin( eUINodeType type ) : cUINodeSkin( type ) { } cUIContainerSkin::~cUIContainerSkin() { } ///////////////////////////////////////////////////////////////////////////////////////////// cUIContainer::cUIContainer( eUINodeType type ) : cUINode( type ) { mOnlyBackground = false; mHoldView = false; mExceptSnap = false; } /// ÁÖÀÇ»çÇ× : cUIContainer::~cUIContainer() { /// Àڽĵ鿡°Ô ¾Ë¸² cChildList::cIterator i = mChildList.Begin(); cChildList::cIterator end = mChildList.End(); for( ; i != end; ++i ) { cUINode* n = (cUINode*)(*i); if( n ) { n->mpParent = 0; delete n; } else { assert(0); } } } /// ÁÖÀÇ»çÇ× : Â÷ÀÏµå ¿ÏÀüÈ÷ »èÁ¦ ( Æ÷ÀÎÅͱîÁö ³Î·Î ÇÔ ) void cUIContainer::RemoveChildComplete( cUINode* pchild ) { cChildList::cIterator i = mChildList.Begin(); cChildList::cIterator end = mChildList.End(); for( ; i != end; ++i ) { cUINode* n = (cUINode*)(*i); if( n == pchild ) { UIMAN->GetRootNode()->RemoveProcessChild( n ); UIMAN->GetRootNode()->RemoveSearchChild( n->GetID() ); mChildList.Erase( i ); n->mpParent = 0; SAFE_DELETE( n ); return; } } } /// ÁÖÀÇ»çÇ× : void cUIContainer::RemoveChild( cUINode* pchild ) { cChildList::cIterator i = mChildList.Begin(); cChildList::cIterator end = mChildList.End(); for( ; i != end; ++i ) { cUINode* n = (cUINode*)(*i); if( n == pchild ) { UIMAN->GetRootNode()->RemoveProcessChild( n ); UIMAN->GetRootNode()->RemoveSearchChild( n->GetID() ); n->mpParent = 0; mChildList.Erase( i ); return; } } } /// ÁÖÀÇ»çÇ× : void cUIContainer::UpdateRect() { cUINode::UpdateRect(); /// ÀÚ½Ä °»½Å cChildList::cIterator i = mChildList.Begin(); cChildList::cIterator end = mChildList.End(); for( ; i != end; ++i ) { cUINode* n = (cUINode*)(*i); if( n ) { n->UpdateRect(); } } } /* ÀÚ±â updateskin ÀÚ±â updaterect ÀÚ½Ä updaterect ÀÚ½Ä updateskin ÀÚ±â updaterect ±âº» 2¹ø È£Ãâ */ void cUIContainer::UpdateSkin() { cUINode::UpdateSkin(); /// ÀÚ½Ä ½ºÅ² Àû¿ë cChildList::cIterator i = mChildList.Begin(); cChildList::cIterator end = mChildList.End(); for( ; i != end; ++i ) { cUINode* n = (cUINode*)(*i); if( n ) n->UpdateSkin(); } } void cUIContainer::NetUnLockAllUI() { cUINode::NetUnLockAllUI(); /// ÀÚ½Ä Àû¿ë cChildList::cIterator i = mChildList.Begin(); cChildList::cIterator end = mChildList.End(); for( ; i != end; ++i ) { cUINode* n = (cUINode*)(*i); if( n ) n->NetUnLockAllUI(); } } /// ÁÖÀÇ»çÇ× : void cUIContainer::AddChild( cUINode* pchild ) { if( pchild ) { // if( pchild->mpParent ) // { // pchild->mpParent->RemoveChild( pchild ); // } // pchild->mpParent = this; mChildList.PushBack( pchild ); } } /// ÁÖÀÇ»çÇ× : ¿¡µðÆ® ¹Ú½º »ðÀÔ int cUIContainer::AddEditBox( cUINode* pchild ) { int i = 0; if( pchild ) { i = mEditArr.GetSize(); mEditArr.PushBack( pchild ); } else { assert( 0 && "null node" ); return -1; } return i; } /// ÁÖÀÇ»çÇ× : Æ÷Ä¿½º¸¦ °®´Â ¿¡µðÆ® ¹Ú½º üÀÎÁö /// ÀÌ ÇÔ¼ö´Â ÄÁÅ×ÀÌ³Ê ³»ºÎ¿¡ Á¸ÀçÇÏ´Â EditBoxµé °£ÀÇ Æ÷Ä¿½º À̵¿À» Á¦¾îÇÑ´Ù. void cUIContainer::ChangeFocus( unsigned int index ) { /// error check if( index >= mEditArr.GetSize() ) { assert( 0 && "index out of range" ); return ; } unsigned int newFocus = index + 1; if( newFocus >= mEditArr.GetSize() ) { newFocus = 0; } ((cUINode*)mEditArr[newFocus])->SetFocus(); } /// ÁÖÀÇ»çÇ× : ¶óµð¿À ¹öưÀ» »ðÀÔ ( ±×·ì³Ñ¹ö, Æ÷ÀÎÅÍ ) void cUIContainer::AddRadio( unsigned int groupNum, cUINode* pchild ) { if( !pchild ) { assert( 0 && "null node" ); return; } /// ±×·ì³Ñ¹ö°¡ 0ºÎÅÍ ½ÃÀÛÇÏÁö ¾Ê¾ÒÀ¸¸é ¿¡·¯!! if( groupNum > mHeadRadioArr.GetSize() ) { assert( 0 && "error!! start group number at 0" ); return; } /// ±×·ìÀÇ Ã³À½ µî·ÏÇÑ ¶óµð¿À¸¸ »ðÀÔ. if( mHeadRadioArr.GetSize() == groupNum ) { mHeadRadioArr.PushBack( pchild ); } else { /// ÀÌ¹Ì Á¸ÀçÇÏ´Â ±×·ì¹øÈ£À̸é, ¿¬°á½ÃŲ´Ù ((cRadioButton*)mHeadRadioArr[groupNum])->Link( pchild ); } } /// ÁÖÀÇ»çÇ× : ÇØ´ç±×·ìÀÇ Çìµå ¶óµð¿À ¹öưÀ» ¸®ÅÏ cUINode* cUIContainer::GetHeadRadio( unsigned int groupNum ) { if( groupNum >= mHeadRadioArr.GetSize() ) { assert( 0 && "wrong radio group num"); return 0; } return (cUINode*)mHeadRadioArr[groupNum]; } /// ÁÖÀÇ»çÇ× : ºÎ¸ð ¹Ø¿¡ ÇØ´çid¸¦ °®´Â ÀÚ½Ä Ã£±â cUINode* cUIContainer::GetChild( int id ) { cUINode* n = 0; cChildList::cConstIterator i = mChildList.Begin(); cChildList::cConstIterator end = mChildList.End(); for( ; i != end; ++i ) { n = (cUINode*)(*i); if( n && n->GetID() == id ) return n; } return 0; } cUINode* cUIContainer::GetNode( const cUIPos& pos ) const { /// °¢ ¿µ¿ª¸¸ ¿ì¼± °Ë»ç if( mVisible && cUINode::ContainPoint( pos ) == true ) { cUINode* node = 0; /// È­¸é»ó ¾Õ¿¡¼­ µÚ·Î °Ë»ç cChildList::cConstIterator i = (--mChildList.End()); cChildList::cConstIterator end = (--mChildList.Begin()); for( ; i != end; --i ) { cUINode* n = (cUINode*)(*i); if( n->IsEnabled() == false || n->IsVisible() == false ) continue; if( n->IsKindof( eUINODE_CONTAINER ) ) { node = ((cUIContainer*)n)->GetNode( pos ); } else if( n->ContainPoint( pos ) ) { if( n->IsExceptEvent() == false ) node = n; } /// ÅØ½ºÃÄ ¾ËÆÄ ¿µ¿ª °Ë»ç±îÁö ÇÔ if( node && node->ContainPoint( pos ) ) return node; } /// À̺¥Æ® ¹«½Ã, ȤÀº ¶Õ¸° ÅØ½ºÃÄÀÎÁö °Ë»ç if( mExceptionEvent == false && ContainPoint( pos ) == true ) return (cUINode*)this; else return 0; } else return 0; } /// ÁÖÀÇ»çÇ× : ÁÖ¾îÁø ¿µ¿ª°ú ±³Â÷ÇÏ´Â ¿µ¿ªÀÌ ÀÖ´Â ÄÁÅ×À̳ʸ¦ ¸®ÅÏ ( ¹«Á¶°Ç ·çÆ®ÀÇ Àڽĵ鸸 °¡´É ) cUIContainer* cUIContainer::GetNearRootChild( cUIContainer* con, bool axisX ) { if( con && con->IsExceptSnap() == true ) return 0; cUIRect rect; /// À©µµ¿ìÀÇ ¾ÈÂÊÀ¸·Îµµ ºÙ±â¶§¹®¿¡ ¾ÈÂÊÀ¸·Î ( AUTO_MAGNATIC_DIST / 2 ) Çȼ¿, /// ¹Ù±ùÀ¸·Î ( AUTO_MAGNATIC_DIST / 2 ) Çȼ¿ ´õÇØ¼­ °Ë»çÇϵµ·Ï ÇÑ´Ù rect.mLeft = con->GetAbsoluteRect().mLeft - ( AUTO_MAGNATIC_DIST / 2 ); rect.mRight = con->GetAbsoluteRect().mRight + ( AUTO_MAGNATIC_DIST / 2 ); rect.mTop = con->GetAbsoluteRect().mTop - ( AUTO_MAGNATIC_DIST / 2 ); rect.mBottom = con->GetAbsoluteRect().mBottom + ( AUTO_MAGNATIC_DIST / 2 ); cUIContainer* result = 0; /// ÀÚ±â ÀÚ½ÅÀÌ visible »óÅÂÀÌ°í ¶ÇÇÑ ÄÁÅ×ÀÌ³Ê¾ß ÇÑ´Ù. if( mVisible && IsKindof( eUINODE_CONTAINER ) ) { cChildList::cConstIterator i = (--mChildList.End()); cChildList::cConstIterator end = (--mChildList.Begin()); cUIContainer* pleftCon = 0; cUIContainer* prightCon = 0; cUIContainer* ptopCon = 0; cUIContainer* pbottomCon = 0; /// °¢ ¹æÇâÀÇ ÃִܰŸ® unsigned int rDist = 0; unsigned int lDist = 0; unsigned int tDist = 0; unsigned int bDist = 0; for( ; i != end; --i ) { cUIContainer* n = (cUIContainer*)(*i); /// ºñ±³´ë»óÀÌ vislble »óŰ¡ ¾Æ´Ï°Å³ª ÇöÀç ÀڽŰú µ¿ÀÏÇϰųª, ¹é±×¶ó¿îµå¸é ³Ñ±ä´Ù /// ÀÚ¼®±â´É °Ë»ç Á¦¿Ü´ë»óÀÌ¸é ³Ñ±ä´Ù if( n->IsVisible() == false || con == n || n->IsOnlyBackground() || n->IsExceptSnap() == true ) { continue; } /// °¡Àå °¡±î¿î ÄÁÅ×ÀÌ³Ê Ã£¾Æ¼­ ¸®ÅÏÇÑ´Ù if( rect.IntersectRect( n->GetAbsoluteRect() ) ) { //// x Ãà°Ë»ç if( axisX == true ) { /// ¿À¸¥ÂÊ º¯°ú °¡Àå °¡±î¿î ÄÁÅ×ÀÌ³Ê Ã£±â if( rect.mRight - AUTO_MAGNATIC_DIST <= n->GetAbsoluteRect().mLeft ) { if( prightCon == 0 || prightCon->GetAbsoluteRect().mLeft > n->GetAbsoluteRect().mLeft ) { /// right ¹æÇâÀ¸·Î °¡Àå °¡±î¿î ÄÁÅ×ÀÌ³Ê °»½Å prightCon = n; rDist = n->GetAbsoluteRect().mLeft - rect.mRight - AUTO_MAGNATIC_DIST; } } /// ¿ÞÂÊ º¯°ú °¡Àå °¡±î¿î ÄÁÅ×ÀÌ³Ê Ã£±â if( rect.mLeft + AUTO_MAGNATIC_DIST >= n->GetAbsoluteRect().mRight ) { if( pleftCon == 0 || pleftCon->GetAbsoluteRect().mRight < n->GetAbsoluteRect().mRight ) { /// left ¹æÇâÀ¸·Î ´õ °¡±î¿î ÄÁÅ×À̳ʰ¡ ÀÖÀ¸¸é °»½Å pleftCon = n; lDist = rect.mLeft + AUTO_MAGNATIC_DIST - n->GetAbsoluteRect().mRight; } } /// ¿·¿¡ ÀÖ´Â À©µµ¿ì¿Í left °ªÀÌ ÀÏÁ¤°Å¸®·Î °¡±î¿öÁö¸é ºÙ¿©¹ö¸°´Ù if( rect.mLeft >= n->GetAbsoluteRect().mLeft && rect.mLeft - n->GetAbsoluteRect().mLeft <= 0 || rect.mLeft <= n->GetAbsoluteRect().mLeft && n->GetAbsoluteRect().mLeft - rect.mLeft <= AUTO_MAGNATIC_DIST ) { con->mSnapType = eSNAP_LEFT_OUT; return n; } /// ¿·¿¡ ÀÖ´Â À©µµ¿ì¿Í right °ªÀÌ ÀÏÁ¤°Å¸®·Î °¡±î¿öÁö¸é ºÙ¿©¹ö¸°´Ù if( rect.mRight >= n->GetAbsoluteRect().mRight && rect.mRight - n->GetAbsoluteRect().mRight <= AUTO_MAGNATIC_DIST || rect.mRight <= n->GetAbsoluteRect().mRight && n->GetAbsoluteRect().mRight - rect.mRight <= 0 ) { con->mSnapType = eSNAP_RIGHT_OUT; return n; } } /// Y Ãà°Ë»ç else if( axisX == false ) { /// À­ º¯°ú °¡Àå °¡±î¿î ÄÁÅ×ÀÌ³Ê Ã£±â if( rect.mTop + AUTO_MAGNATIC_DIST >= n->GetAbsoluteRect().mBottom ) { if( ptopCon == 0 || ptopCon->GetAbsoluteRect().mTop > n->GetAbsoluteRect().mTop ) { ptopCon = n; tDist = rect.mTop + AUTO_MAGNATIC_DIST - n->GetAbsoluteRect().mBottom; } } /// ¾Æ·¡ º¯°ú °¡Àå °¡±î¿î ÄÁÅ×ÀÌ³Ê Ã£±â if( rect.mBottom - AUTO_MAGNATIC_DIST <= n->GetAbsoluteRect().mTop ) { if( pbottomCon == 0 || pbottomCon->GetAbsoluteRect().mTop < n->GetAbsoluteRect().mTop ) { pbottomCon = n; bDist = n->GetAbsoluteRect().mBottom - rect.mBottom - AUTO_MAGNATIC_DIST; } } /// ¿·¿¡ ÀÖ´Â À©µµ¿ì¿Í top °ªÀÌ ÀÏÁ¤°Å¸®·Î °¡±î¿öÁö¸é ºÙ¿©¹ö¸°´Ù if( rect.mTop >= n->GetAbsoluteRect().mTop && rect.mTop - n->GetAbsoluteRect().mTop <= 0 || rect.mTop <= n->GetAbsoluteRect().mTop && n->GetAbsoluteRect().mTop - rect.mTop <= AUTO_MAGNATIC_DIST ) { con->mSnapType = eSNAP_TOP_OUT; return n; } /// ¿·¿¡ ÀÖ´Â À©µµ¿ì¿Í bottom °ªÀÌ ÀÏÁ¤°Å¸®·Î °¡±î¿öÁö¸é ºÙ¿©¹ö¸°´Ù if( rect.mBottom >= n->GetAbsoluteRect().mBottom && rect.mBottom - n->GetAbsoluteRect().mBottom <= AUTO_MAGNATIC_DIST || rect.mBottom <= n->GetAbsoluteRect().mBottom && n->GetAbsoluteRect().mBottom - rect.mBottom <= 0 ) { con->mSnapType = eSNAP_BOTTOM_OUT; return n; } } } } /// ¸ðµç °Ë»ç°¡ ³¡³µÀ¸¸é °¡Àå°¡±î¿î ÄÁÅ×À̳ʸ¦ ¸®ÅÏ /// x ÃàÀ¸·Î °è»ê if( axisX == true ) { if( prightCon == 0 ) { con->mSnapType = eSNAP_RIGHT; /// ¿À¸¥ÂÊ¿¡ ºÙ¿©¶ó result = pleftCon; } else if( pleftCon == 0 ) { con->mSnapType = eSNAP_LEFT; result = prightCon; } else if( rDist <= lDist ) { con->mSnapType = eSNAP_LEFT; result = prightCon; } else if( rDist > lDist ) { con->mSnapType = eSNAP_RIGHT; result = pleftCon; } } /// y ÃàÀ¸·Î °è»ê else if( axisX == false ) { if( ptopCon == 0 ) { con->mSnapType = eSNAP_TOP; result = pbottomCon; } else if( pbottomCon == 0 ) { con->mSnapType = eSNAP_BOTTOM; result = ptopCon; } else if( tDist >= bDist ) { con->mSnapType = eSNAP_BOTTOM; result = ptopCon; } else if( tDist < bDist ) { con->mSnapType = eSNAP_TOP; result = pbottomCon; } } } return result; } /// ÁÖÀÇ»çÇ× : bool cUIContainer::HandleEvent( const cUIEvent& event ) { /// ºÎ¸ð°¡ º¸ÀÌÁö ¾ÊÀ¸¸é ÀڽĵéÀÇ À̺¥Æ® ó¸® ºÒ°¡ if( mVisible == false ) { return false; } switch( event.mType ) { case eUIEVENT_COMMAND: switch( event.mID ) { case eUIID_OK: OnOk(); break; case eUIID_CANCEL: OnCancel(); break; default: OnCommand( event.mpCaller, event.mID ); } break; case eUIEVENT_CHECKBOX_CHANGED: OnCheckBoxChanged( event.mpCaller, event.mID ); break; case eUIEVENT_EDITBOX_ENTER: OnEditBoxEntered( event.mpCaller, event.mID ); break; case eUIEVENT_LISTBOX_CHANGED: OnListBoxChanged( event.mpCaller, event.mID ); break; case eUIEVENT_SCROLLBAR_MOVE: OnScrollbarMoved( event.mpCaller, event.mID ); break; /// ÀÏÁ¤½Ã°£¸¶´Ù ¹öưÀÌ °è¼Ó ´­·Á ÀÖÀ½À» º¸³¿. case eUIEVENT_BUTTON_DOWNED: OnButtonDowned( event.mpCaller, event.mID ); break; /// Ç÷¡±×°¡ ¼¼ÆÃµÇ¾îÀÖÀ¸¸é ¸Å ÇÁ·Î¼¼½º¸¶´Ù ´­¸² À̺¥Æ® ¹ß»ý case eUIEVENT_BUTTON_CONTINUEDOWNED: OnButtonContinueDowned( event.mpCaller, event.mID ); break; case eUIEVENT_LISTBOX_SELECTED: OnListBoxSelected( event.mpCaller, event.mID ); break; case eUIEVENT_LISTBOX_SELECTEDRBUTTON: OnListBoxSelectedRButton( event.mpCaller, event.mID, event.mShift ); break; /// ¶óµð¿À ¹öưÀÌ ´­¸² À̺¥Æ® case eUIEVENT_RADIO_PRESSED: OnRadioPressed( event.mpCaller, event.mID ); break; /// Ǫ½¬¹öưÀÌ ´­¸° À̺¥Æ® case eUIEVENT_PUSHBUTTON_PRESSED: OnPushButtonPressed( event.mpCaller, event.mID ); break; /// Åǹöư ´­¸² case eUIEVENT_TABBUTTON_PRESSED: OnTabButtonPressed( event.mpCaller, event.mID ); break; case eUIEVENT_ICON_DRAGGED: OnIconDragged( event.mpCaller, event.mID, cUIPos(MOUSE->GetMouseX(), MOUSE->GetMouseY()), event.mShift ); break; case eUIEVENT_ICON_DOUBLECLICKED: OnIconDoubleClicked( event.mpCaller, event.mID ); break; case eUIEVENT_ICON_HOVERED: OnIconHovered( event.mpCaller, event.mID, cUIPos(MOUSE->GetMouseX(), MOUSE->GetMouseY()) ); break; case eUIEVENT_ICON_CLICKED: OnIconClicked( event.mpCaller, event.mID ); break; case eUIEVENT_ICON_RIGHTCLICKED: OnIconRightClicked( event.mpCaller, event.mID, event.mShift ); break; case eUIEVENT_IMAGE_HOVERED: OnImageHovered( event.mpCaller, event.mID, cUIPos(MOUSE->GetMouseX(), MOUSE->GetMouseY()) ); break; case eUIEVENT_IMAGE_CLICKED: OnImageClicked( event.mpCaller, event.mID ); break; case eUIEVENT_LISTBOX_ROW_HOVERED: OnListBoxRowHovered( event.mpCaller, event.mID, event.mPos, event.mExtraData ); break; case eUIEVENT_LISTBOX_ROW_LEFT: OnListBoxRowLeft( event.mpCaller, event.mID ); break; case eUIEVENT_LISTBOX_IMAGE_HOVERED: OnListBoxImageHorvered( event.mpCaller, event.mID, event.mPos, event.mExtraData ); break; case eUIEVENT_LISTBOX_IMAGE_LEFT: OnListBoxImageLeft( event.mpCaller, event.mID ); break; /// °ÔÀÌÁö°¡ ¸ñǥġ±îÁö ¿Ï·áµÊ case eUIEVENT_GAUGE_END: OnGaugeEnd( event.mpCaller, event.mID ); break; case eUIEVENT_COMBO_SELECTED: OnComboSelected( event.mpCaller, event.mID ); break; case eUIEVENT_OPTIONGAUGE_UPDATE: OnOptiongaugeUpdate( event.mpCaller, event.mID ); break; case eUIEVENT_MOUSE_OTHERCLICK: OnMouseOtherClick( event.mPos ); break; default: return cUINode::HandleEvent( event ); } return true; }