using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media.Animation;
using Tango.Editors;
namespace Tango.Editors
{
public class AttachedElementsEditorsUndoRedoStatesProvider : UndoRedoStatesProviderBase
{
private ElementsEditorUndoRedoExecutedEventArgs args;
///
/// Gets or sets the first elements editor.
///
public ElementsEditor ElementsEditor1 { get; private set; }
///
/// Gets or sets the second elements editor.
///
public ElementsEditor ElementsEditor2 { get; private set; }
///
/// Initializes a new instance of the class.
///
/// The first elements editor.
/// The second elements editor.
public AttachedElementsEditorsUndoRedoStatesProvider(ElementsEditor firstElementsEditor,ElementsEditor secondElementsEditor)
{
ElementsEditor1 = firstElementsEditor;
ElementsEditor2 = secondElementsEditor;
}
///
/// Creates the a new undo/redo state.
///
///
public override IUndoRedoState CreateUndoRedoState()
{
AttachedElementsEditorsUndoRedoState state = new AttachedElementsEditorsUndoRedoState();
foreach (var element in ElementsEditor1.Elements)
{
var setups = element.GetAnimationSetups(TimeSpan.FromSeconds(0), AnimationSetupMode.Discrete);
state.Date = DateTime.Now;
state.ElementsSetups1.Add(new KeyValuePair>(element, setups));
}
foreach (var element in ElementsEditor2.Elements)
{
var setups = element.GetAnimationSetups(TimeSpan.FromSeconds(0), AnimationSetupMode.Discrete);
state.Date = DateTime.Now;
state.ElementsSetups2.Add(new KeyValuePair>(element, setups));
}
return state;
}
///
/// Executes the an undo/redo state.
///
/// The state.
public override void ExecuteState(IUndoRedoState state)
{
ExecuteState(state, ElementsEditor1, (state as AttachedElementsEditorsUndoRedoState).ElementsSetups1);
ExecuteState(state, ElementsEditor2, (state as AttachedElementsEditorsUndoRedoState).ElementsSetups2);
}
///
/// Executes the state.
///
/// The state.
/// The elements editor.
/// The elements setups.
private void ExecuteState(IUndoRedoState state,ElementsEditor ElementsEditor, List>> elementsSetups)
{
AttachedElementsEditorsUndoRedoState elementsEditorState = state as AttachedElementsEditorsUndoRedoState;
args = new ElementsEditorUndoRedoExecutedEventArgs();
args.State = elementsEditorState;
foreach (var elementSetups in elementsSetups)
{
var element = elementSetups.Key;
var setups = elementSetups.Value;
if (!ElementsEditor.Elements.Contains(element)) //Add elements missing on editor.
{
ElementsEditor.Elements.Add(element);
args.RestoredElements.Add(element);
}
Storyboard story = new Storyboard();
foreach (var setup in setups)
{
story.Children.Add(setup.Animation);
String name = UIHelper.GetRandomAnimationName();
ElementsEditor.RegisterName(name, setup.DependencyObject);
Storyboard.SetTargetName(setup.Animation, name);
Storyboard.SetTargetProperty(setup.Animation, new System.Windows.PropertyPath(setup.DependencyProperty));
}
story.Completed += (x, y) =>
{
List> setupValues = new List>();
foreach (var setup in setups)
{
KeyValuePair setupvalue = new KeyValuePair(setup, setup.DependencyObject.GetValue(setup.DependencyProperty));
setupValues.Add(setupvalue);
}
foreach (var setupValue in setupValues)
{
if (setupValue.Key.DependencyObject is IAnimatable)
{
(setupValue.Key.DependencyObject as IAnimatable).BeginAnimation(setupValue.Key.DependencyProperty, null);
}
setupValue.Key.DependencyObject.SetValue(setupValue.Key.DependencyProperty, setupValue.Value);
}
};
story.Duration = TimeSpan.FromMilliseconds(10);
story.Begin(ElementsEditor);
}
//Remove elements that does not exist on state.
var elementsToRemove = ElementsEditor.Elements.Where(x => !elementsSetups.Select(y => y.Key).ToList().Contains(x)).ToList();
elementsToRemove.ForEach(x =>
{
ElementsEditor.RemoveElement(x);
});
args.RemovedElements = elementsToRemove;
args.ModifiedElements = elementsSetups.
Select(x => x.Key).
ToList().
Where(x => !args.RestoredElements.Contains(x) && !args.RemovedElements.Contains(x)).ToList();
}
///
/// Raises the event.
///
/// The instance containing the event data.
public override void OnStateExecuted(UndoRedoStateExecutedEventArgs e)
{
args.Mode = e.Mode;
base.OnStateExecuted(args);
}
}
}