//======= Copyright (c) 1996-2009, Valve Corporation, All rights reserved. ======
//
// CAttributeSheetSequencePickerPanel - Panel for editing int attributes that select a sprite sheet sequence
//
//===============================================================================

#include "dme_controls/attributesheetsequencepickerpanel.h"
#include "FileSystem.h"
#include "vgui_controls/MenuButton.h"
#include "vgui_controls/FileOpenDialog.h"
#include "dme_controls/AttributeTextEntry.h"
#include "matsys_controls/sheetsequencepanel.h"
#include "movieobjects/dmeparticlesystemdefinition.h"
#include "tier1/keyvalues.h"
#include "dme_controls/AttributeWidgetFactory.h"
#include "movieobjects/dmeeditortypedictionary.h"

// NOTE: This has to be the last file included!
#include "tier0/memdbgon.h"

using namespace vgui;

//-----------------------------------------------------------------------------
//
// CNotifyMenuButton - MenuButton with a notify before the menu is shown
//
//-----------------------------------------------------------------------------

class CNotifyMenuButton: public vgui::MenuButton
{
	DECLARE_CLASS_SIMPLE( CNotifyMenuButton, vgui::MenuButton );

public:
	CNotifyMenuButton(CAttributeSheetSequencePickerPanel *parent, const char *panelName, const char *text);
	virtual void OnShowMenu(Menu *menu);

private:
	CAttributeSheetSequencePickerPanel* m_pParent;
};

CNotifyMenuButton::CNotifyMenuButton(CAttributeSheetSequencePickerPanel *parent, const char *panelName, const char *text):
	BaseClass(parent,panelName,text)
{
	m_pParent = parent;
}

void CNotifyMenuButton::OnShowMenu(Menu *menu)
{
	if ( m_pParent )
	{
		m_pParent->UpdateSheetPanel();
	}

	BaseClass::OnShowMenu(menu);
}

//-----------------------------------------------------------------------------
//
// CAttributeSheetSequencePickerPanel
//
//-----------------------------------------------------------------------------

CAttributeSheetSequencePickerPanel::CAttributeSheetSequencePickerPanel( vgui::Panel *parent, const AttributeWidgetInfo_t &info ) :
	BaseClass( parent, info )
{
	if ( info.m_pEditorInfo )
	{
		m_bIsSecondView = !V_stricmp( info.m_pEditorInfo->GetWidgetName(), "sheetsequencepicker_second" );
	}
	else
	{
		m_bIsSecondView = false;
	}

	m_pSheetPanel = new CSheetSequencePanel(this, "sheetsequencepanel");
	m_pSheetPanel->AddActionSignalTarget( this );

	m_pSequenceSelection = new CNotifyMenuButton( this, "SequenceSelection", "seq" );
	m_pSequenceSelection->SetMenu( m_pSheetPanel );
	m_pSheetPanel->AddActionSignalTarget( this );

	UpdateSheetPanel();
}

void CAttributeSheetSequencePickerPanel::UpdateSheetPanel()
{
	CDmElement* pElement = GetPanelElement();
	CDmAttribute* pMaterialAttr = pElement->GetAttribute("material");

	if ( m_bIsSecondView )
	{
		m_pSheetPanel->SetSecondSequenceView( true );
		m_pSequenceSelection->SetText( "sq2" );
	}

	if ( pMaterialAttr == NULL )
	{
		pElement = FindReferringElement< CDmeParticleSystemDefinition >( pElement, "initializers" );

		if ( pElement )
		{
			pMaterialAttr = pElement->GetAttribute("material");
		}
	}

	if ( pMaterialAttr )
	{
		m_pSheetPanel->SetFromMaterialName( pMaterialAttr->GetValueString() );
	}
}

CAttributeSheetSequencePickerPanel::~CAttributeSheetSequencePickerPanel()
{
}

void CAttributeSheetSequencePickerPanel::OnSheetSequenceSelected( int nSequenceNumber )
{
	CUndoScopeGuard guard( 0, NOTIFY_SETDIRTYFLAG, GetNotify(), "Select Sheet Sequence" );
	SetAttributeValue(nSequenceNumber);
}

// MOC_TODO: factor this somewhere else - shared with other attribute controls
void CAttributeSheetSequencePickerPanel::PerformLayout()
{
	BaseClass::PerformLayout();

	int x, y, w, h;
	m_pType->GetBounds( x, y, w, h );

	int inset = 25;
	m_pType->SetWide( w - inset );

	x += w;
	x -= inset;

	h -= 2;

	m_pSequenceSelection->SetBounds( x, y, inset, h );
}