using System;
using System.Collections.Generic;
using System.Linq;
using DocumentFormat.OpenXml.Presentation;
using HTEXLib.Models.Inner;
namespace HTEXLib.Animations
{
public class SimpleAnimation : IAnimation
{
public SimpleAnimation()
{
AdditionalData = "0";
ObjectId = "0";
}
public int Start { get; set; }
public int Length { get; set; }
public string ObjectId { get; set; }
public int Repetitions { get; set; }
///
/// 1 进入 , 2 退出,3 强调 ,4 路径
///
public int InitialState { get; set; }
public string Type { get; set; }
public string AdditionalData { get; set; }
public List InnerAnimations { get; set; }
public DocumentFormat.OpenXml.EnumValue timingType { get; set; }
public int getCalculatedLength()
{
if (InnerAnimations == null || InnerAnimations.Count == 0)
return Length;
int res = 0;
foreach (SimpleAnimation anim in InnerAnimations)
res = res < anim.getCalculatedLength() + anim.Start ? anim.getCalculatedLength() + anim.Start : res;
return res;
}
public bool IsItEntranceAnimation()
{
return InitialState == 1; //I am not sure if it is correct ;)
}
protected string GetObjectIdForJSON()
{
int res = 0;
string result = int.TryParse(ObjectId, out res) ? ObjectId : "'" + ObjectId + "'";
return result;
}
protected string GetE3Value()
{
int res = 0;
string result = int.TryParse(ObjectId, out res) ? "" : ",e3:['s1s" + ObjectId + "']";
return result;
}
public virtual string GetJsonString()
{
return "{objectId:" + GetObjectIdForJSON() + ",start:" + Start + ",length:" + Length + ",repeat:" + Repetitions + ",state:" + InitialState +
",name:'" + Type + "',additionalData:" + AdditionalData + ",v:0" + ",e0:" + GetE0Value() + ",e1:1,e2:0" + GetE3Value()
+ "}";
}
protected string GetE0Value()//if image then 3 else 2
{
int res = 0;
return int.TryParse(ObjectId, out res) ? "3" : "2";
}
public void FixAnimationTimings(CommonBehavior behavior, int slideIndex)
{
String intValue = behavior.TargetElement.ShapeTarget.ShapeId.Value;
ObjectId = intValue == null ? "" + 0 : intValue;
int spd = behavior.CommonTimeNode.Speed == null ? 100 : behavior.CommonTimeNode.Speed.Value;
intValue = behavior.CommonTimeNode.Duration;
Length = intValue == null || intValue == "indefinite" ? 0 : int.Parse(intValue) * spd / 100;
int delay = 0;
if (behavior.CommonTimeNode.StartConditionList != null &&
behavior.CommonTimeNode.StartConditionList.Any())
{
foreach (Condition cond in behavior.CommonTimeNode.StartConditionList)
if (cond.Delay != null && cond.Delay.HasValue)
delay = delay + int.Parse(cond.Delay.Value);
}
if (behavior.TargetElement.ShapeTarget.TextElement != null && behavior.TargetElement.ShapeTarget.TextElement.ParagraphIndexRange != null)
{
int res = 0;
bool isTextWithEffect = int.TryParse(ObjectId, out res) && PPTShape.effectShapes.Contains(slideIndex + "_" + res);
if (!isTextWithEffect)
{
ObjectId = ObjectId + "p" + behavior.TargetElement.ShapeTarget.TextElement.ParagraphIndexRange.Start;
}
//TODO: add support for paragraph start-end index range
}
intValue = behavior.CommonTimeNode.RepeatDuration;
Repetitions = intValue == null ? 1 : int.Parse(intValue);
InnerAnimations = new List();
Start = delay;
}
}
}