//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//

#include "stdafx.h"
#include "window_anchor_mgr.h"


// ------------------------------------------------------------------------------------ //
// CWindowAnchor.
// ------------------------------------------------------------------------------------ //

bool CWindowAnchor::Init( CWnd *pParentWnd, CWnd *pChildWnd, int aLeft, int aTop, int aRight, int aBottom )
{
	m_pWnd = pChildWnd;
	
	m_aLeft = aLeft;
	m_aTop = aTop;
	m_aRight = aRight;
	m_aBottom = aBottom;

	if ( m_pWnd && pParentWnd )
	{
		pParentWnd->GetWindowRect( m_ParentRect );
		pChildWnd->GetWindowRect( m_Rect );
		return true;
	}
	else
	{
		return false;
	}
}


void AnchorElement( long *pOut, CRect &rcParent, int startElement, CRect &rcParentStart, int flags )
{
	if ( flags == ANCHOR_LEFT )
		*pOut = rcParent.left + ( startElement - rcParentStart.left );
	else if ( flags == ANCHOR_TOP )
		*pOut = rcParent.top + ( startElement - rcParentStart.top );
	else if ( flags == ANCHOR_RIGHT )
		*pOut = rcParent.right - ( rcParentStart.right - startElement );
	else if ( flags == ANCHOR_BOTTOM )
		*pOut = rcParent.bottom - ( rcParentStart.bottom - startElement );
	else if ( flags == ANCHOR_WIDTH_PERCENT )
		*pOut = rcParent.left + (rcParent.Width() * ( startElement - rcParentStart.left )) / rcParentStart.Width();
	else if ( flags == ANCHOR_HEIGHT_PERCENT )
		*pOut = rcParent.top + (rcParent.Height() * ( startElement - rcParentStart.top )) / rcParentStart.Height();
}


void CWindowAnchor::Update( CWnd *pParentWnd )
{
	if ( !m_pWnd )
		return;

	CRect rcParent;
	pParentWnd->GetWindowRect( rcParent );

	CRect rcNew;
	AnchorElement( &rcNew.left,   rcParent, m_Rect.left,   m_ParentRect, m_aLeft );
	AnchorElement( &rcNew.top,    rcParent, m_Rect.top,    m_ParentRect, m_aTop );
	AnchorElement( &rcNew.right,  rcParent, m_Rect.right,  m_ParentRect, m_aRight );
	AnchorElement( &rcNew.bottom, rcParent, m_Rect.bottom, m_ParentRect, m_aBottom );

	pParentWnd->ScreenToClient( rcNew );
	m_pWnd->SetWindowPos( NULL, rcNew.left, rcNew.top, rcNew.Width(), rcNew.Height(), SWP_NOZORDER );
	m_pWnd->InvalidateRect( NULL );
}



// ------------------------------------------------------------------------------------ //
// CWindowAnchorMgr.
// ------------------------------------------------------------------------------------ //

bool CWindowAnchorMgr::AddAnchor( CWnd *pParentWnd, CWnd *pChildWnd, int aLeft, int aTop, int aRight, int aBottom )
{
	int index = m_Anchors.AddToTail();
	return m_Anchors[index].Init( pParentWnd, pChildWnd, aLeft, aTop, aRight, aBottom );
}


void CWindowAnchorMgr::UpdateAnchors( CWnd *pParentWnd )
{
	FOR_EACH_LL( m_Anchors, i )
	{
		m_Anchors[i].Update( pParentWnd );
	}
}