void CAddPresetDialog::DoModal( CDmeAnimationSet *pAnimationSet, KeyValues *pContextKeyValues )
{
	int nTextLength = m_pInput->GetTextLength() + 1;
	char* pCurrentGroupName = (char*)_alloca( nTextLength * sizeof(char) );
	m_pInput->GetText( pCurrentGroupName, nTextLength );

	m_pPresetGroup->DeleteAllItems();

	// Populate the combo box with preset group names
	CDmrElementArray< CDmePresetGroup > presetGroupList = pAnimationSet->GetPresetGroups();
	int nCount = presetGroupList.Count();
	for ( int i = 0; i < nCount; ++i )
	{
		CDmePresetGroup *pPresetGroup = presetGroupList[i];
		if ( pPresetGroup->m_bIsReadOnly )
			continue;

		KeyValues *kv = new KeyValues( "entry" );
		SetElementKeyValue( kv, "presetGroup", pPresetGroup );
		int nItemID = m_pPresetGroup->AddItem( pPresetGroup->GetName(), kv );
		if ( pCurrentGroupName && !Q_stricmp( pPresetGroup->GetName(), pCurrentGroupName ) )
		{
			m_pPresetGroup->ActivateItem( nItemID );
		}
	}

	BaseClass::DoModal( pContextKeyValues );

	m_pInput->SetText( "" );
	m_pInput->RequestFocus();

	PlaceUnderCursor( );
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CBaseActionScreenFadeStartDialog::Init( void )
{
	LoadControlSettings( "resource\\BaseActionScreenFadeStartDialog.res" );

	BaseClass::Init();

	ScreenFade_t const *f = GetAction()->GetScreenFade();

	float duration = f->duration * (1.0f/(float)(1<<SCREENFADE_FRACBITS));
	float holdTime = f->holdTime * (1.0f/(float)(1<<SCREENFADE_FRACBITS));
	int fadein = f->fadeFlags & FFADE_IN;
	int fadeout = f->fadeFlags & FFADE_OUT;
	int fademodulate = f->fadeFlags & FFADE_MODULATE;
	int fadestayout = f->fadeFlags & FFADE_STAYOUT;
	int fadepurge = f->fadeFlags & FFADE_PURGE;
	int r = f->r;
	int g = f->g;
	int b = f->b;
	int a = f->a;

	m_pDuration->SetText( va( "%.3f", duration ) );
	m_pHoldTime->SetText( va( "%.3f", holdTime ) );
	m_pColor->SetText( va( "%i %i %i %i", r, g, b, a ) );
	m_pFFADE_IN->SetSelected( fadein );
	m_pFFADE_OUT->SetSelected( fadeout );
	m_pFFADE_MODULATE->SetSelected( fademodulate );
	m_pFFADE_STAYOUT->SetSelected( fadestayout );
	m_pFFADE_PURGE->SetSelected( fadepurge );

}
//-----------------------------------------------------------------------------
// Purpose: 
// Output : Returns true if changes were effected
//-----------------------------------------------------------------------------
bool CBaseActionZoomDialog::OnSaveChanges( void )
{
	bool bret = BaseClass::OnSaveChanges();

	char sz[ 512 ];
	m_pFinalFOV->GetText( sz, sizeof( sz ) );
	float f = (float)atof( sz );

	if ( GetAction()->m_flFinalFOV != f )
	{
		bret = true;
		GetAction()->m_flFinalFOV = f;
	}

	m_pOutRate->GetText( sz, sizeof( sz ) );
	f = (float)atof( sz );

	if ( GetAction()->m_flFOVRateOut != f )
	{
		bret = true;
		GetAction()->m_flFOVRateOut = f;
	}

	m_pInRate->GetText( sz, sizeof( sz ) );
	f = (float)atof( sz );

	if ( GetAction()->m_flFOVRateIn != f )
	{
		bret = true;
		GetAction()->m_flFOVRateIn = f;
	}

	m_pHoldTime->GetText( sz, sizeof( sz ) );
	f = (float)atof( sz );

	if ( GetAction()->m_flHoldTime != f )
	{
		bret = true;
		GetAction()->m_flHoldTime = f;
	}

	if ( m_pSpline->IsSelected() != GetAction()->m_bSpline )
	{
		bret = true;
		GetAction()->m_bSpline = m_pSpline->IsSelected();
	}

	if ( m_pStayout->IsSelected() != GetAction()->m_bStayout )
	{
		bret = true;
		GetAction()->m_bStayout = m_pStayout->IsSelected();
	}

	return bret;
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CBaseActionTextMessageStartDialog::Init( void )
{
	LoadControlSettings( "resource\\BaseActionTextMessageStartDialog.res" );

	BaseClass::Init();

	client_textmessage_t *tm = GetAction()->GetTextMessage();

	m_pX->SetText( va( "%f", tm->x ) );
	m_pY->SetText( va( "%f", tm->y ) );

	m_pFadeInTime->SetText( va( "%.3f", tm->fadein ) );
	m_pFadeOutTime->SetText( va( "%.3f", tm->fadeout ) );
	m_pHoldTime->SetText( va( "%.3f", tm->holdtime ) );
	m_pFXTime->SetText( va( "%.3f", tm->fxtime ) );

	m_pColor1->SetText( va( "%i %i %i %i", tm->r1, tm->g1, tm->b1, tm->a1 ) );
	m_pColor2->SetText( va( "%i %i %i %i", tm->r2, tm->g2, tm->b2, tm->a2 ) );

	m_pMessageText->SetText( GetAction()->GetMessageText() );

	FillInFonts();

	m_pFontName->SetText( GetAction()->GetFontName() );

	int c = NUM_EFFECT_TYPES;
	int i;
	for ( i = 0; i < c ; i++ )
	{
		m_pEffectType->AddItem( NameForEffectType( i ), NULL );
	}

	m_pEffectType->SetText( NameForEffectType( tm->effect ) );
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CBaseActionZoomDialog::Init( void )
{
	LoadControlSettings( "resource\\BaseActionZoomDialog.res" );

	BaseClass::Init();

	m_pFinalFOV->SetText( va( "%f", GetAction()->m_flFinalFOV ) );
	m_pOutRate->SetText( va( "%f", GetAction()->m_flFOVRateOut ) );
	m_pInRate->SetText( va( "%f", GetAction()->m_flFOVRateIn ) );
	m_pHoldTime->SetText( va( "%f", GetAction()->m_flHoldTime ) );

	m_pSpline->SetSelected( GetAction()->m_bSpline );
	m_pStayout->SetSelected( GetAction()->m_bStayout );
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CBaseActionWithStopTimeDialog::Init( void )
{
	BaseClass::Init();

	if ( GetAction()->m_bUsingStopFrame )
	{
		m_pStopType->SetText( "TimeUseFrame" );
		m_pStop->SetText( va( "%i", GetAction()->m_nStopFrame ) );
	}
	else
	{
		m_pStopType->SetText( "TimeUseClock" );
		m_pStop->SetText( va( "%.3f", GetAction()->m_flStopTime ) );
	}
}
//-----------------------------------------------------------------------------
// Purpose: 
// Output : Returns true if changes were effected
//-----------------------------------------------------------------------------
bool CBaseActionWithStopTimeDialog::OnSaveChanges( void )
{
	bool bret = BaseClass::OnSaveChanges();

	char stoptype[ 512 ];
	m_pStopType->GetText( stoptype, sizeof( stoptype ) );

	char stop[ 512 ];
	m_pStop->GetText( stop, sizeof( stop ) );

	float fstop = (float)atof( stop );
	int	 istop = (int)atoi( stop );

	if ( !Q_strcasecmp( stoptype, "TimeUseFrame" ) )
	{
		if ( GetAction()->m_nStopFrame != istop )
		{
			bret = true;
			GetAction()->SetStopFrame( istop );
			GetAction()->SetStopTime( -1.0f );
		}
	}
	else
	{
		if ( GetAction()->m_flStopTime != fstop )
		{
			bret = true;
			GetAction()->SetStopTime( fstop );
			GetAction()->SetStopFrame( -1 );
		}
	}

	return bret;
}
//-----------------------------------------------------------------------------
// Purpose: 
// Output : Returns true if changes were effected
//-----------------------------------------------------------------------------
bool CBaseActionSkipAheadDialog::OnSaveChanges( void )
{
	bool bret = BaseClass::OnSaveChanges();

	char skiptype[ 512 ];
	m_pSkipType->GetText( skiptype, sizeof( skiptype ) );

	char skipto[ 512 ];
	m_pSkip->GetText( skipto, sizeof( skipto ) );

	float fskip = (float)atof( skipto );
	int	 iskip = (int)atoi( skipto );

	if ( !Q_strcasecmp( skiptype, "TimeUseTick" ) )
	{
		if ( GetAction()->m_nSkipToTick != iskip )
		{
			bret = true;
			GetAction()->SetSkipToTick( iskip );
			GetAction()->SetSkipToTime( -1.0f );
		}
	}
	else
	{
		if ( GetAction()->m_flSkipToTime != fskip )
		{
			bret = true;
			GetAction()->SetSkipToTime( fskip );
			GetAction()->SetSkipToTick( -1 );
		}
	}

	return bret;
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CBaseActionSkipAheadDialog::Init( void )
{
	LoadControlSettings( "resource\\BaseActionSkipAheadDialog.res" );

	BaseClass::Init();

	if ( GetAction()->m_bUsingSkipTick )
	{
		m_pSkipType->SetText( "TimeUseTick" );
		m_pSkip->SetText( va( "%i", GetAction()->m_nSkipToTick ) );
	}
	else
	{
		m_pSkipType->SetText( "TimeUseClock" );
		m_pSkip->SetText( va( "%.3f", GetAction()->m_flSkipToTime ) );
	}
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CBaseActionPlayCommandsDialog::Init( void )
{
	LoadControlSettings( "resource\\BaseActionPlayCommandsDialog.res" );

	BaseClass::Init();

	m_pCommands->SetText( GetAction()->GetCommandStream() );
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CBaseActionCDTrackStartDialog::Init( void )
{
	LoadControlSettings( "resource\\BaseActionCDTrackStartDialog.res" );

	BaseClass::Init();

	m_pTrackNumber->SetText( va( "%i", GetAction()->GetTrack() ) );
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CBaseActionPlaySoundStartDialog::Init( void )
{
	LoadControlSettings( "resource\\BaseActionPlaySoundStartDialog.res" );

	BaseClass::Init();

	m_pSoundName->SetText( GetAction()->GetSoundName() );
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CBaseActionPauseDialog::Init( void )
{
	LoadControlSettings( "resource\\BaseActionPauseDialog.res" );

	BaseClass::Init();

	m_pPauseTime->SetText( va( "%f", GetAction()->GetPauseTime() ) );

}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CBaseActionChangePlaybackRateDialog::Init( void )
{
	LoadControlSettings( "resource\\BaseActionPlaybackRateDialog.res" );

	BaseClass::Init();

	m_pRate->SetText( va( "%f", GetAction()->GetPlaybackRate() ) );

}
//-----------------------------------------------------------------------------
// command handler
//-----------------------------------------------------------------------------
void CAddPresetDialog::OnCommand( const char *command )
{
	if ( !Q_stricmp( command, "OK" ) )
	{
		int nTextLength = m_pInput->GetTextLength() + 1;
		char* txt = (char*)_alloca( nTextLength * sizeof(char) );
		m_pInput->GetText( txt, nTextLength );

		nTextLength = m_pPresetGroup->GetTextLength() + 1;
		char* pPresetGroupName = (char*)_alloca( nTextLength * sizeof(char) );
		m_pPresetGroup->GetText( pPresetGroupName, nTextLength );

		KeyValues *pCurrentGroup = m_pPresetGroup->GetActiveItemUserData();
		CDmePresetGroup *pPresetGroup = pCurrentGroup ? GetElementKeyValue<CDmePresetGroup>( pCurrentGroup, "presetGroup" ) : NULL;
		if ( pPresetGroup && Q_stricmp( pPresetGroup->GetName(), pPresetGroupName ) )
		{
			pPresetGroup = NULL;
		}
		KeyValues *kv = new KeyValues( "PresetNameSelected", "text", txt );
		kv->SetString( "presetGroupName", pPresetGroupName );
		SetElementKeyValue( kv, "presetGroup", pPresetGroup );

		if ( m_pContextKeyValues )
		{
			kv->AddSubKey( m_pContextKeyValues );
			m_pContextKeyValues = NULL;
		}
		PostActionSignal( kv );
		CloseModal();
		return;
	}

	if ( !Q_stricmp( command, "Cancel") )
	{
		CloseModal();
		return;
	}

	BaseClass::OnCommand( command );
}
//-----------------------------------------------------------------------------
// Purpose: 
// Output : Returns true if changes were effected
//-----------------------------------------------------------------------------
bool CBaseActionPlayCommandsDialog::OnSaveChanges( void )
{
	bool bret = BaseClass::OnSaveChanges();

	char commands[ 512 ];
	m_pCommands->GetText( commands, sizeof( commands ) );

	if ( Q_strcasecmp( commands, GetAction()->GetCommandStream() ) )
	{
		bret = true;
		GetAction()->SetCommandStream( commands );
	}

	return bret;
}
//-----------------------------------------------------------------------------
// Purpose: 
// Output : Returns true if changes were effected
//-----------------------------------------------------------------------------
bool CBaseActionPlaySoundStartDialog::OnSaveChanges( void )
{
	bool bret = BaseClass::OnSaveChanges();

	char soundname[ 512 ];
	m_pSoundName->GetText( soundname, sizeof( soundname ) );

	if ( Q_strcasecmp( soundname, GetAction()->GetSoundName() ) )
	{
		bret = true;
		GetAction()->SetSoundName( soundname );
	}

	return bret;
}
//-----------------------------------------------------------------------------
// Purpose: 
// Output : Returns true if changes were effected
//-----------------------------------------------------------------------------
bool CBaseActionCDTrackStartDialog::OnSaveChanges( void )
{
	bool bret = BaseClass::OnSaveChanges();

	char track[ 512 ];
	m_pTrackNumber->GetText( track, sizeof( track ) );
	int itrack = atoi( track );

	if ( itrack != GetAction()->GetTrack() )
	{
		bret = true;
		GetAction()->SetTrack( itrack );
	}

	return bret;
}
//-----------------------------------------------------------------------------
// Purpose: 
// Output : Returns true if changes were effected
//-----------------------------------------------------------------------------
bool CBaseActionChangePlaybackRateDialog::OnSaveChanges( void )
{
	bool bret = BaseClass::OnSaveChanges();

	char rate[ 512 ];
	m_pRate->GetText( rate, sizeof( rate ) );

	float frate = (float)atof( rate );

	if ( GetAction()->GetPlaybackRate() != frate )
	{
		bret = true;
		GetAction()->SetPlaybackRate( frate );
	}

	return bret;
}
//-----------------------------------------------------------------------------
// Purpose: 
// Output : Returns true if changes were effected
//-----------------------------------------------------------------------------
bool CBaseActionPauseDialog::OnSaveChanges( void )
{
	bool bret = BaseClass::OnSaveChanges();

	char pausetime[ 512 ];
	m_pPauseTime->GetText( pausetime, sizeof( pausetime ) );

	float ftime = (float)atof( pausetime );

	if ( GetAction()->GetPauseTime() != ftime )
	{
		bret = true;
		GetAction()->SetPauseTime( ftime );
	}

	return bret;
}
//-----------------------------------------------------------------------------
// Purpose: 
// Output : Returns true on success, false on failure.
//-----------------------------------------------------------------------------
bool CBaseActionTextMessageStartDialog::OnSaveChanges( void )
{
	bool bret = BaseClass::OnSaveChanges();

	client_textmessage_t *tm = GetAction()->GetTextMessage();
	bret |= SaveDifferingFloat( m_pFadeInTime, &tm->fadein );
	bret |= SaveDifferingFloat( m_pFadeOutTime, &tm->fadeout );
	bret |= SaveDifferingFloat( m_pHoldTime, &tm->holdtime );
	bret |= SaveDifferingFloat( m_pFXTime, &tm->fxtime );

	bret |= SaveDifferingFloat( m_pX, &tm->x );
	bret |= SaveDifferingFloat( m_pY, &tm->y );

	bret |= SaveDifferingColor( m_pColor1, &tm->r1, &tm->g1, &tm->b1, &tm->a1 );
	bret |= SaveDifferingColor( m_pColor2, &tm->r2, &tm->g2, &tm->b2, &tm->a2 );

	char sz[ 1024 ];
	m_pEffectType->GetText( sz, sizeof( sz ) );
	int iEffect = EffectTypeForName( sz );
	if ( iEffect != tm->effect )
	{
		tm->effect = iEffect;
		bret = true;
	}

	m_pMessageText->GetText( sz, sizeof( sz ) );
	if ( Q_strcasecmp( sz, GetAction()->GetMessageText() ) )
	{
		GetAction()->SetMessageText( sz );
		bret = true;
	}

	m_pFontName->GetText( sz, sizeof( sz ) );
	if ( Q_strcasecmp( sz, GetAction()->GetFontName() ) )
	{
		GetAction()->SetFontName( sz );
		bret = true;
	}
	return bret;
}
void CBaseActionPlaySoundStartDialog::OnFileSelected( char const *fullpath )
{
	if ( !fullpath || !fullpath[ 0 ] )
		return;

	char relativepath[ 512 ];
	g_pFileSystem->FullPathToRelativePath( fullpath, relativepath );

	COM_FixSlashes( relativepath );

	char *soundname = relativepath;
	if ( !Q_strnicmp( relativepath, "sound\\", strlen( "sound\\" ) ) )
	{
		soundname += strlen( "sound\\" );
	}

	m_pSoundName->SetText( soundname );

	if ( m_hFileOpenDialog )
	{
		m_hFileOpenDialog->MarkForDeletion();
	}
}
//-----------------------------------------------------------------------------
// Purpose: 
// Output : Returns true on success, false on failure.
//-----------------------------------------------------------------------------
bool CBaseActionScreenFadeStartDialog::OnSaveChanges( void )
{
	bool bret = BaseClass::OnSaveChanges();

	// Grab current settings
	ScreenFade_t *f = GetAction()->GetScreenFade();

	float duration = f->duration * (1.0f/(float)(1<<SCREENFADE_FRACBITS));
	float holdTime = f->holdTime * (1.0f/(float)(1<<SCREENFADE_FRACBITS));
	bool fadein = f->fadeFlags & FFADE_IN;
	bool fadeout = f->fadeFlags & FFADE_OUT;
	bool fademodulate = f->fadeFlags & FFADE_MODULATE;
	bool fadestayout = f->fadeFlags & FFADE_STAYOUT;
	bool fadepurge = f->fadeFlags & FFADE_PURGE;
	int r = f->r;
	int g = f->g;
	int b = f->b;
	int a = f->a;

	char sz[ 512 ];
	m_pDuration->GetText( sz, sizeof( sz ) );
	if ( (float)atof( sz ) != duration )
	{
		bret = true;
		f->duration = (unsigned short)((float)(1<<SCREENFADE_FRACBITS) * (float)atof( sz ) );
	}
	m_pHoldTime->GetText( sz, sizeof( sz ) );
	if ( (float)atof( sz ) != holdTime )
	{
		bret = true;
		f->holdTime = (unsigned short)((float)(1<<SCREENFADE_FRACBITS) * (float)atof( sz ) );
	}

	int rr, gg, bb, aa;
	m_pColor->GetText( sz, sizeof( sz ) );
	if ( 4 == sscanf( sz, "%i %i %i %i", &rr, &gg, &bb, &aa ) )
	{
		rr = clamp( rr, 0, 255 );
		gg = clamp( gg, 0, 255 );
		bb = clamp( bb, 0, 255 );
		aa = clamp( aa, 0, 255 );

		if ( rr != r || gg != g || bb != b || aa != a )
		{
			bret = true;
			f->r = rr;
			f->g = gg;
			f->b = bb;
			f->a = aa;
		}
	}

	if ( CheckFlagDifference( m_pFFADE_IN, fadein, FFADE_IN ) )
	{
		bret = true;
	}
	if ( CheckFlagDifference( m_pFFADE_OUT, fadeout, FFADE_OUT ) )
	{
		bret = true;
	}
	if ( CheckFlagDifference( m_pFFADE_MODULATE, fademodulate, FFADE_MODULATE ) )
	{
		bret = true;
	}
	if ( CheckFlagDifference( m_pFFADE_STAYOUT, fadestayout, FFADE_STAYOUT ) )
	{
		bret = true;
	}
	if ( CheckFlagDifference( m_pFFADE_PURGE, fadepurge, FFADE_PURGE ) )
	{
		bret = true;
	}
	
	return bret;
}