ANIMATOR : Change keyframe add/edit policy 40/18740/1
authorseongwon.shim <seongwon.shim@samsung.com>
Mon, 31 Mar 2014 06:05:41 +0000 (15:05 +0900)
committerseongwon.shim <seongwon.shim@samsung.com>
Mon, 31 Mar 2014 07:04:04 +0000 (16:04 +0900)
Add only property that user put in and write tempolary computed properties to CSS

Change-Id: I0afb49d630ed5d6926c005f21fdba61929d3c3eb
Signed-off-by: seongwon.shim <seongwon.shim@samsung.com>
13 files changed:
org.tizen.webuibuilder/src/org/tizen/webuibuilder/animator/action/AnimatorKeyHandler.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/animator/gef/command/AnimationCreateAndChangeFrameCommand.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/animator/gef/policies/AnimatorDragEditPolicy.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/animator/gef/viewer/AnimatorBrowserViewer.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/animator/model/AnimationPathModel.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/animator/model/AnimatorFrame.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/animator/model/AnimatorKeyframe.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/animator/model/AnimatorModelManager.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/animator/model/AnimatorSelector.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/animator/model/AnimatorWidget.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/animator/model/deserializer/AnimatorKeyframeDeserializer.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/animator/utils/AnimatorUtils.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/animator/utils/Constants.java

index b6d8ffa..18e5b5a 100644 (file)
@@ -23,6 +23,9 @@
 
 package org.tizen.webuibuilder.animator.action;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.draw2d.geometry.Rectangle;
 import org.eclipse.gef.GraphicalViewer;
@@ -34,9 +37,14 @@ import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.KeyEvent;
+import org.tizen.webuibuilder.animator.gef.command.AnimationCreateAndChangeFrameCommand;
 import org.tizen.webuibuilder.animator.gef.command.AnimatorChangeLayoutCommand;
 import org.tizen.webuibuilder.animator.gef.editparts.AnimatorEditPart;
+import org.tizen.webuibuilder.animator.model.AnimatorModelEvent;
+import org.tizen.webuibuilder.animator.model.AnimatorModelManager;
+import org.tizen.webuibuilder.animator.model.AnimatorSelector;
 import org.tizen.webuibuilder.animator.model.part.AnimatorPart;
+import org.tizen.webuibuilder.animator.utils.AnimatorUtils;
 import org.tizen.webuibuilder.model.Part;
 
 
@@ -85,13 +93,41 @@ public class AnimatorKeyHandler extends GraphicalViewerKeyHandler {
                     if (editPart instanceof AnimatorEditPart) {
                        AnimatorPart part = (AnimatorPart) ((AnimatorEditPart) editPart).getModel();
                         Rectangle originalRect = part.getOriginalPosition();
-                        Rectangle movedRect =
-                                new Rectangle(part.getAniPosition().x + delta.x,
-                                              part.getAniPosition().y + delta.y,
-                                              part.getAniPosition().width,
-                                              part.getAniPosition().height);
+//                        Rectangle movedRect =
+//                                new Rectangle(part.getAniPosition().x + delta.x,
+//                                              part.getAniPosition().y + delta.y,
+//                                              part.getAniPosition().width,
+//                                              part.getAniPosition().height);
+//
+//                        command.add(new AnimatorChangeLayoutCommand(part, movedRect, originalRect));
+                       
+                        int left = 0;
+                        int top = 0;
+                        if (part.getPositionMode() == Part.PositionMode.ABSOLUTE_POSITION) {
+                            left = part.getAniPosition().x + delta.x;
+                            top = part.getAniPosition().y + delta.y;
+                        } else if (part.getPositionMode() == Part.PositionMode.RELATIVE_POSITION) {
+                            left = part.getAniPosition().x + delta.x - originalRect.x;
+                            top = part.getAniPosition().y + delta.y - originalRect.y;
+                        }                      
+                       
+                       AnimatorModelManager animatorModelManager =
+                                AnimatorModelManager.getInstance(AnimatorUtils.getAppManager());
+                       String animationGroupId =
+                                       AnimatorUtils.getActiveAnimatorBrowserViewer().getCurrentAnimationGroupId();
 
-                        command.add(new AnimatorChangeLayoutCommand(part, movedRect, originalRect));
+                        AnimatorSelector selector = 
+                                       animatorModelManager.findAnimatorSelector(animationGroupId, part,
+                                                                          part.getUiSelector());
+                        
+                        double currentTime = AnimatorUtils.getActiveAnimatorBrowserViewer().getPointTime();
+                        
+                        Map<String, String> properties = new HashMap<String, String>();
+                        properties.put("translateX", left + "px");
+                        properties.put("translateY", top + "px");
+                        
+                        command.add(new AnimationCreateAndChangeFrameCommand(selector, currentTime, properties,
+                                                                                                               AnimatorModelEvent.Origin.EDITOR));
                     }
                 }
 
index 396da69..6cb939c 100644 (file)
@@ -23,6 +23,7 @@
 
 package org.tizen.webuibuilder.animator.gef.command;
 
+import java.util.HashMap;
 import java.util.Map;
 
 import org.eclipse.gef.commands.Command;
@@ -42,7 +43,8 @@ public class AnimationCreateAndChangeFrameCommand extends Command {
     private double currentTime = 0.0;
     private Map<String, String> properties = null;
     private AnimatorModelEvent.Origin origin = null;
-    private Map<String, String> oldProperties = null;
+    private Map<String, String> oldProperties = new HashMap<String, String>();
+    private boolean isCreate;
 
     /**
      * Constructor
@@ -70,8 +72,8 @@ public class AnimationCreateAndChangeFrameCommand extends Command {
     public void execute() {
         AnimatorModelManager animatorModelManager =
                 AnimatorModelManager.getInstance(AnimatorUtils.getAppManager());
-        oldProperties =
-                animatorModelManager.createOrEditAnimatorFrame(animatorModelManager.getModelFactory(), selector, currentTime, properties,
+        isCreate =
+                animatorModelManager.createOrEditAnimatorFrame(selector, currentTime, oldProperties, properties,
                                                                origin);
     }
 
@@ -95,6 +97,6 @@ public class AnimationCreateAndChangeFrameCommand extends Command {
         AnimatorModelManager animatorModelManager =
                 AnimatorModelManager.getInstance(AnimatorUtils.getAppManager());
         animatorModelManager.removeOrEditAnimatorFrame(selector, currentTime, oldProperties,
-                                                       properties, origin);
+                                                       properties, isCreate, origin);
     }
 }
index 4b579c9..68fd4dd 100644 (file)
@@ -47,7 +47,6 @@ import org.eclipse.gef.handles.MoveHandle;
 import org.eclipse.gef.requests.ChangeBoundsRequest;
 import org.eclipse.swt.graphics.Color;
 import org.tizen.webuibuilder.animator.gef.command.AnimationCreateAndChangeFrameCommand;
-import org.tizen.webuibuilder.animator.gef.command.AnimatorChangeLayoutCommand;
 import org.tizen.webuibuilder.animator.gef.editparts.AnimatorEditPart;
 import org.tizen.webuibuilder.animator.gef.editparts.AnimatorRootEditPart;
 import org.tizen.webuibuilder.animator.gef.tools.AnimatorDragEditPartsTracker;
@@ -244,7 +243,7 @@ public class AnimatorDragEditPolicy extends ResizableEditPolicy {
     @Override
     public Command getCommand(Request request) {
         if (REQ_MOVE.equals(request.getType())) {
-            Point moveDelta = ((ChangeBoundsRequest) request).getMoveDelta();
+            /*Point moveDelta = ((ChangeBoundsRequest) request).getMoveDelta();
             moveDelta.x /= ((AnimatorRootEditPart) getHost().getRoot()).getZoomManager().getZoom();
             moveDelta.y /= ((AnimatorRootEditPart) getHost().getRoot()).getZoomManager().getZoom();
             ((ChangeBoundsRequest) request).setMoveDelta(moveDelta);
@@ -255,7 +254,47 @@ public class AnimatorDragEditPolicy extends ResizableEditPolicy {
             return new AnimatorChangeLayoutCommand(getHost().getModel(),
                                                    ((ChangeBoundsRequest) request)
                                                            .getTransformedRectangle(rect),
-                                                   originalRect);
+                                                   originalRect);*/
+            
+            Point moveDelta = ((ChangeBoundsRequest) request).getMoveDelta();
+            moveDelta.x /= ((AnimatorRootEditPart) getHost().getRoot()).getZoomManager().getZoom();
+            moveDelta.y /= ((AnimatorRootEditPart) getHost().getRoot()).getZoomManager().getZoom();
+            ((ChangeBoundsRequest) request).setMoveDelta(moveDelta);
+            AnimatorPart part = (AnimatorPart) (getHost().getModel());
+            Rectangle rect = new Rectangle(part.getAniPosition());
+            
+            Rectangle layout = ((ChangeBoundsRequest) request)
+                    .getTransformedRectangle(rect);
+            Rectangle originalRect = part.getOriginalPosition();
+            int left = 0;
+            int top = 0;
+
+            if (part.getPositionMode() == Part.PositionMode.ABSOLUTE_POSITION) {
+                left = layout.x;
+                top = layout.y;
+            } else if (part.getPositionMode() == Part.PositionMode.RELATIVE_POSITION) {
+                left = layout.x - originalRect.x;
+                top = layout.y - originalRect.y;
+            }
+            
+               AnimatorModelManager animatorModelManager =
+                    AnimatorModelManager.getInstance(AnimatorUtils.getAppManager());
+               String animationGroupId =
+                               AnimatorUtils.getActiveAnimatorBrowserViewer().getCurrentAnimationGroupId();
+
+            AnimatorSelector selector = 
+                       animatorModelManager.findAnimatorSelector(animationGroupId, part,
+                                                              part.getUiSelector());
+            
+            double currentTime = AnimatorUtils.getActiveAnimatorBrowserViewer().getPointTime();
+            
+            Map<String, String> properties = new HashMap<String, String>();
+            properties.put("translateX", left + "px");
+            properties.put("translateY", top + "px");
+            
+            return new AnimationCreateAndChangeFrameCommand(selector, currentTime, properties,
+                                                                                               AnimatorModelEvent.Origin.EDITOR);
+            
         } else if (REQ_RESIZE.equals(request.getType())) {
             Dimension sizeDelta = ((ChangeBoundsRequest) request).getSizeDelta();
             sizeDelta.width /=
index 8f4444d..e4170ce 100644 (file)
@@ -691,7 +691,7 @@ public class AnimatorBrowserViewer extends HoverBrowserViewer {
          */
         private void updateAnimationFW(AnimatorSelector selector, String animationGroupId,
                                        double pointTime) {
-            selector.getMergedFrames();
+            selector.updateSelectorTime();
             int delay = (int) (selector.getDelay() * 1000);
             int duration = (int) (selector.getDuration() * 1000);
             String keyFrameId = selector.getId();
@@ -711,7 +711,7 @@ public class AnimatorBrowserViewer extends HoverBrowserViewer {
          */
         private void updateAnimationFWAndDetect(AnimatorSelector selector, String animationGroupId,
                                                 double pointTime) {
-            selector.getMergedFrames();
+            selector.updateSelectorTime();
             int delay = (int) (selector.getDelay() * 1000);
             int duration = (int) (selector.getDuration() * 1000);
             String keyFrameId = selector.getId();
index b4f715f..32d215b 100644 (file)
@@ -76,7 +76,7 @@ public class AnimationPathModel implements IPropertySource {
         int top = translateInDesigner.height;
 
         int i = 0;
-        List<AnimatorFrame> mergedFrames = selector.getMergedFrames();
+        List<AnimatorFrame> mergedFrames = selector.getMergedPropertyWithWidgetProperty();
         Set<String> propertiesUsed = selector.getAllPropertiesUsed(mergedFrames);
 
         for (AnimatorFrame frame : mergedFrames) {
@@ -297,14 +297,14 @@ public class AnimationPathModel implements IPropertySource {
         int originX = 50;
         int originY = 50;
 
-        List<AnimatorFrame> frameList = selector.getMergedFrames();
+        List<AnimatorFrame> frameList = selector.getMergedPropertyWithWidgetProperty();
         for (AnimatorModel frameElement : frameList) {
             AnimatorFrame frame = ((AnimatorFrame) frameElement).getFrameLink();
 
-            left = getPixelProperty(frame, Constants.translateX, translateInDesigner.width);
-            top = getPixelProperty(frame, Constants.translateY, translateInDesigner.height);
-            width = getPixelProperty(frame, "width", width);
-            height = getPixelProperty(frame, "height", height);
+            left = getPixelProperty(((AnimatorFrame) frameElement), Constants.translateX, translateInDesigner.width);
+            top = getPixelProperty(((AnimatorFrame) frameElement), Constants.translateY, translateInDesigner.height);
+            width = getPixelProperty(((AnimatorFrame) frameElement), "width", width);
+            height = getPixelProperty(((AnimatorFrame) frameElement), "height", height);
 
             Point point = calculatePathPoint(left, top, width, height, originX, originY);
             // if (prevPoint == null || !prevPoint.equals(point)) {
@@ -313,13 +313,15 @@ public class AnimationPathModel implements IPropertySource {
             int curveIndex = 0;
             CssValueForLocation css =
                     new CssValueForLocation(0, 0, width, height, originX, originY);
-            for (AnimatorCurveFrame curve : frame.getCurveFrames()) {
+            if(!frameElement.equals(frameList.get(frameList.size() -1))) {
+                for (AnimatorCurveFrame curve : frame.getCurveFrames()) {
 
-                AnimationPathCurve curveForView = new AnimationPathCurve();
-                convertCurveFromModel(css, curveForView, curve);
+                     AnimationPathCurve curveForView = new AnimationPathCurve();
+                     convertCurveFromModel(css, curveForView, curve);
 
-                frameForView.insertCurve(curveIndex++, curveForView);
-            }
+                     frameForView.insertCurve(curveIndex++, curveForView);
+                 }
+            }           
             points.add(frameForView);
             // }
         }
index d921688..739d425 100644 (file)
@@ -25,13 +25,16 @@ package org.tizen.webuibuilder.animator.model;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
+import org.eclipse.draw2d.geometry.Point;
 import org.tizen.webuibuilder.animator.utils.AnimatorUtils;
+import org.tizen.webuibuilder.animator.utils.Constants;
 
 
 /**
@@ -110,6 +113,113 @@ public class AnimatorFrame extends AnimatorModel {
     public void subtractFrameTime(double time) {
         this.frameTime -= time;
     }
+    
+    /**
+     * Whether contains key or not
+     * 
+     * @param key
+     * @return true false
+     */
+    public boolean containsKey(String key) {
+        return this.properties.containsKey(key);
+    }
+
+    /**
+     * Get Curve Frames
+     * 
+     * @return List of curve frames
+     */
+    public List<AnimatorCurveFrame> getCurveFrames() {
+        return curveFrames;
+    }
+
+    /**
+     * Get Curve Frame by index
+     * 
+     * @param index
+     * @return curve frame
+     */
+    public AnimatorCurveFrame getCurveFrame(int index) {
+        return curveFrames.get(index);
+    }
+
+    /**
+     * Set Curve Frames
+     * 
+     * @param curveFrames
+     */
+    public void setCurveFrames(List<AnimatorCurveFrame> curveFrames) {
+        this.curveFrames = curveFrames;
+    }
+
+    /**
+     * Get Curve Frame size
+     * 
+     * @return size of curve frame
+     */
+    public int getCurveFrameSize() {
+        return this.curveFrames.size();
+    }
+
+    /**
+     * Add Curve Frame
+     * 
+     * @param curveFrame
+     */
+    public void addCurveFrame(AnimatorCurveFrame curveFrame) {
+        this.curveFrames.add(curveFrame);
+    }
+
+    /**
+     * Add Curve frame by index
+     * 
+     * @param index
+     * @param curveFrame
+     */
+    public void addCurveFrame(int index, AnimatorCurveFrame curveFrame) {
+        this.curveFrames.add(index, curveFrame);
+    }
+
+    /**
+     * Remove Curve frame by index
+     * 
+     * @param index
+     */
+    public void removeCurveFrame(int index) {
+        this.curveFrames.remove(index);
+    }
+
+    /**
+     * Get easing Property
+     * 
+     * @return easing Property
+     */
+    public String getEasingProperty() {
+        String easeData = getProperty("-webkit-animation-timing-function");
+        if (easeData == null) {
+            easeData = "ease";
+        }
+        return easeData;
+    }
+
+    /**
+     * Get Frame Link
+     * 
+     * @return frame
+     */
+    public AnimatorFrame getFrameLink() {
+        return this.frameLink;
+    }
+    
+    /**
+     * Get Frame Link
+     *
+     * @param AnimatorFrame
+     *
+     */
+    public void setFrameLink(AnimatorFrame frame) {
+       this.frameLink = frame;
+    }
 
     /**
      * Get Properties
@@ -131,7 +241,9 @@ public class AnimatorFrame extends AnimatorModel {
         Iterator<String> keyIterator = keySet.iterator();
         while (keyIterator.hasNext()) {
             String key = keyIterator.next();
-            results.put(key, getProperty(key));
+            if(getProperty(key) != null) {
+               results.put(key, getProperty(key));
+            }
         }
 
         return results;
@@ -335,112 +447,6 @@ public class AnimatorFrame extends AnimatorModel {
         return this.getComputedProperties().equals(animatorFrame.getComputedProperties());
     }
 
-    /**
-     * Whether contains key or not
-     * 
-     * @param key
-     * @return true false
-     */
-    public boolean containsKey(String key) {
-        return this.properties.containsKey(key);
-    }
-
-    /**
-     * Get Curve Frames
-     * 
-     * @return List of curve frames
-     */
-    public List<AnimatorCurveFrame> getCurveFrames() {
-        return curveFrames;
-    }
-
-    /**
-     * Get Curve Frame by index
-     * 
-     * @param index
-     * @return curve frame
-     */
-    public AnimatorCurveFrame getCurveFrame(int index) {
-        return curveFrames.get(index);
-    }
-
-    /**
-     * Set Curve Frames
-     * 
-     * @param curveFrames
-     */
-    public void setCurveFrames(List<AnimatorCurveFrame> curveFrames) {
-        this.curveFrames = curveFrames;
-    }
-
-    /**
-     * Get Curve Frame size
-     * 
-     * @return size of curve frame
-     */
-    public int getCurveFrameSize() {
-        return this.curveFrames.size();
-    }
-
-    /**
-     * Add Curve Frame
-     * 
-     * @param curveFrame
-     */
-    public void addCurveFrame(AnimatorCurveFrame curveFrame) {
-        this.curveFrames.add(curveFrame);
-    }
-
-    /**
-     * Add Curve frame by index
-     * 
-     * @param index
-     * @param curveFrame
-     */
-    public void addCurveFrame(int index, AnimatorCurveFrame curveFrame) {
-        this.curveFrames.add(index, curveFrame);
-    }
-
-    /**
-     * Remove Curve frame by index
-     * 
-     * @param index
-     */
-    public void removeCurveFrame(int index) {
-        this.curveFrames.remove(index);
-    }
-
-    /**
-     * Get easing Property
-     * 
-     * @return easing Property
-     */
-    public String getEasingProperty() {
-        String easeData = getProperty("-webkit-animation-timing-function");
-        if (easeData == null) {
-            easeData = "ease";
-        }
-        return easeData;
-    }
-
-    /**
-     * Get Frame Link
-     * 
-     * @return frame
-     */
-    public AnimatorFrame getFrameLink() {
-        return this.frameLink;
-    }
-    
-    /**
-     * Get Frame Link
-     *
-     * @param AnimatorFrame
-     *
-     */
-    public void setFrameLink(AnimatorFrame frame) {
-       this.frameLink = frame;
-    }
 
     /**
      * Get css string
@@ -451,10 +457,8 @@ public class AnimatorFrame extends AnimatorModel {
      * @return css string from animation for this frame
      * 
      */
-    public String getCssString(Set<String> propertiesUsed, AnimatorSelector selector) {
-        // if(properties.size() == 0){//TODO this should be omitted if ...
-        // return "";
-        // }
+    /*public String getCssString(Set<String> propertiesUsed, AnimatorSelector selector) {
+        
         Map<String, String> widgetProperties = selector.getWidgetProperties(propertiesUsed);
         double duration = selector.getDuration();
 
@@ -508,6 +512,41 @@ public class AnimatorFrame extends AnimatorModel {
         builder.append("}");
         builder.append("\n");
         return builder.toString();
+    }*/
+    
+    public String getCssString(Set<String> propertiesUsed, AnimatorSelector selector) {
+        
+        Map<String, String> widgetProperties = selector.getWidgetProperties(propertiesUsed);
+        double duration = selector.getDuration();
+
+        StringBuilder builder = new StringBuilder();
+        String percent =
+                AnimatorUtils.convertPercentToString(frameTime == 0.0 ? 0.0 : frameTime / duration
+                        * 100);
+        builder.append("\n");
+        builder.append(percent);
+        builder.append("{");
+        Map<String, String> transformRelatedProperties = new HashMap<String, String>();
+        for (String key : propertiesUsed) {
+            
+            if (isTransformRelatedProperties(key)) {
+                transformRelatedProperties.put(key, properties.get(key));
+            } else {
+                builder.append("\n\t");
+                builder.append(key);
+                builder.append(":");
+                builder.append(properties.get(key));
+                builder.append(";");
+                builder.append("\n");
+            }
+        }
+        if (transformRelatedProperties.size() > 0) {
+            builder.append(createTransformProperty(transformRelatedProperties,
+                                                   (frameLink != null) ? widgetProperties : null));
+        }
+        builder.append("}");
+        builder.append("\n");
+        return builder.toString();
     }
 
     /**
@@ -548,12 +587,78 @@ public class AnimatorFrame extends AnimatorModel {
                 if (getUsedPropertiesInThisFrame().contains(key)) {
                     computedProperties.put(key, properties.get(key));
                 } else {
-                    computedProperties.put(key, widgetProperties.get(key));
+                       String computedProperty = getComputedPropertiesFromPreviousFrame(key);
+                       if(computedProperty != null) {
+                               computedProperties.put(key, computedProperty);
+                       } else {
+//                             computedProperty = getComputedPropertiesFromNextFrame(key);
+//                             if(computedProperty != null) {
+//                                     computedProperties.put(key, computedProperty);
+//                             } else {
+                                       computedProperties.put(key, widgetProperties.get(key));
+//                             }
+                       }
                 }
             }
         }
         return this.computedProperties;
     }
+    
+    public String getComputedPropertiesFromPreviousFrame(String key) {
+       AnimatorFrame previousFrame = getPreviousAnimatorFrame(this);
+       while(previousFrame != null) {
+               String value = previousFrame.getProperty(key);
+               if(value != null) {
+                       return value;
+               }
+               previousFrame = getPreviousAnimatorFrame(previousFrame);
+       }
+       
+       return null;
+    }
+    
+    private static AnimatorFrame getPreviousAnimatorFrame(AnimatorFrame frame) {
+       
+       AnimatorFrame previousFrame = null;
+       AnimatorKeyframe currentKeyframe = (AnimatorKeyframe)frame.getParent();
+       previousFrame = (AnimatorFrame)currentKeyframe.getPrevChild(frame);
+       if(previousFrame == null) {
+               AnimatorKeyframe previousKeyframe = (AnimatorKeyframe)currentKeyframe.getParent().getPrevChild(currentKeyframe);
+               if(previousKeyframe != null) {
+                       previousFrame = previousKeyframe.getLastFrame();
+               }
+       }
+       
+       return previousFrame;
+    }
+    
+    private static AnimatorFrame getNextAnimatorFrame(AnimatorFrame frame) {
+    
+       AnimatorFrame nextFrame = null;
+       AnimatorKeyframe currentKeyframe = (AnimatorKeyframe)frame.getParent();
+       nextFrame = (AnimatorFrame)currentKeyframe.getPrevChild(frame);
+       if(nextFrame == null) {
+               AnimatorKeyframe nextKeyframe = (AnimatorKeyframe)currentKeyframe.getParent().getNextChild(currentKeyframe);
+               if(nextKeyframe != null) {
+                       nextFrame = nextKeyframe.getFirstFrame();
+               }
+       }
+       
+       return nextFrame;
+    }
+    
+    public String getComputedPropertiesFromNextFrame(String key) {
+       AnimatorFrame nextFrame = getNextAnimatorFrame(this);
+       while(nextFrame != null) {
+               String value = nextFrame.getProperty(key);
+               if(value != null) {
+                       return value;
+               }
+               nextFrame = getNextAnimatorFrame(nextFrame);
+       }
+       
+       return null;
+    }
 
     /**
      * Get Computed Properties
@@ -565,6 +670,19 @@ public class AnimatorFrame extends AnimatorModel {
         Set<String> propertiesUsed = selector.getAllPropertiesUsed(selector.getMergedFrames());
         return getComputedProperties(propertiesUsed);
     }
+    
+       public void addComputedPropertiesIfNotExist(Set<String> properties) {
+               Map<String, String> computedProperties = getComputedProperties(properties);
+               Iterator<Entry<String, String>> computedPropertiesIterator = 
+                               computedProperties.entrySet().iterator();
+        while (computedPropertiesIterator.hasNext()) {
+            Entry<String, String> propertyNext = computedPropertiesIterator.next();
+            String key = propertyNext.getKey();
+            if(!getProperties().containsKey(key)) {
+               addProperty(key, propertyNext.getValue());
+            }
+        }
+    }
 
     private String createTransformProperty(Map<String, String> transformRelatedProperties,
                                            Map<String, String> widgetProperties) {
@@ -572,4 +690,71 @@ public class AnimatorFrame extends AnimatorModel {
                 new TransformationProperty(transformRelatedProperties, widgetProperties);
         return property.toPropertyString();
     }
+    
+
+    /**
+     * find animated properties
+     * 
+     * @param frame
+     * @param keyframe
+     */
+    public void findAnimatedPropertyAndSetInFrame(AnimatorFrame previousFrame, AnimatorFrame nextFrame) {
+        if(previousFrame == null || nextFrame == null) {
+               return;
+        }
+        
+        Set<String> animatedProperties = getAnimatedProperties(previousFrame, nextFrame);
+        // set the interpolated value
+        double middle =
+                (getFrameTime() - previousFrame.getFrameTime())
+                        / (nextFrame.getFrameTime() - previousFrame.getFrameTime()) * 100.0;
+        String easingProperty = previousFrame.getEasingProperty();
+        Map<String, String> previousFrameProperties = previousFrame.getComputedProperties();
+        Map<String, String> nextFrameProperties = nextFrame.getComputedProperties();
+        for (String key : animatedProperties) {
+            if (key.indexOf("color") >= 0) // TODO remove this after fixing color property
+                continue;
+            if(key.indexOf("timing-function") >=0) {
+//             frame.addProperty(key, easingProperty);
+               continue;
+            }
+            String start = previousFrameProperties.get(key);
+            String end = nextFrameProperties.get(key);
+            String interpolatedValue =
+                    getInterpolatedValue(key, start, end, middle, easingProperty);
+            addProperty(key, interpolatedValue);
+        }
+        if (previousFrame.getCurveFrames().size() > 0) {
+            Point p;
+            p =
+                    AnimationPathModel
+                            .findTranslateValueAtTime(getModelFactory(), getFrameTime(), previousFrame,
+                                                      nextFrame,
+                                                      AnimatorUtils.getEasingMethod(easingProperty));
+
+            addProperty(Constants.translateX, AnimatorUtils.convertPixToString(p.x));
+            addProperty(Constants.translateY, AnimatorUtils.convertPixToString(p.y));
+        }
+    }
+
+    private String getInterpolatedValue(String key, String start, String end, double middle,
+                                        String easingProperty) {
+        CSSProperty startValue = new CSSProperty(key, start);
+        return startValue.getInterpolcatedValue(new CSSProperty(key, end), middle,
+                                                AnimatorUtils.getEasingMethod(easingProperty));
+    }
+
+    /**
+     * 
+     * @param previousFrame
+     * @param nextFrame
+     * @return a set of animated properties
+     */
+    private Set<String> getAnimatedProperties(AnimatorFrame previousFrame, AnimatorFrame nextFrame) {
+        Set<String> properties1 = previousFrame.getProperties().keySet();
+        Set<String> properties2 = nextFrame.getProperties().keySet();
+        Set<String> union = new HashSet<String>(properties1);
+        union.addAll(properties2);
+        return union;
+    }
 }
index 1060e4f..2d19b28 100644 (file)
@@ -37,10 +37,11 @@ public class AnimatorKeyframe extends AnimatorModel {
     private List<String> names = new ArrayList<String>();
     private double duration = 0.0;
     private double delay = 0.0;
-
+    
     public AnimatorKeyframe() {
                // TODO Auto-generated constructor stub
        }
+  
 
        /**
      * Set initial property member value
@@ -49,7 +50,7 @@ public class AnimatorKeyframe extends AnimatorModel {
      * @param duration
      * @param delay
      */
-    public void setNames(String name) {
+    public void setName(String name) {
         if (name != null) {
             String[] array = name.split(",");
 
@@ -58,24 +59,36 @@ public class AnimatorKeyframe extends AnimatorModel {
             }
         }
     }
-
-    /**
+    
+   
+       /**
      * Get merged animation names
      * 
      * @return String
      */
     public String getName() {
         String result = "";
+        String previousElement = null;
         for (int i = 0; i < names.size(); i++) {
             String element = names.get(i);
             if (i == 0)
                 result += element;
-            else
-                result += "," + element;
+            else {
+               if(previousElement != null) {
+                       if(previousElement.equals("custom") && element.equals("custom")) {
+                               
+                       } else {
+                               result += "," + element;
+                       }
+                }
+                
+            }
+            previousElement = names.get(i);
         }
 
         return result;
     }
+    
 
     /**
      * Add animation name If last name is custom just skip operation
@@ -83,12 +96,15 @@ public class AnimatorKeyframe extends AnimatorModel {
      * @param name
      */
     public void addName(String name) {
-        if (!name.equals("custom")) {
+        /*if (!name.equals("custom")) {
             this.names.add(name);
         } else {
             if (!names.get(names.size() - 1).equals("custom"))
                 this.names.add(name);
-        }
+        }*/
+       
+       
+        this.names.add(name);
     }
 
     /**
@@ -116,14 +132,20 @@ public class AnimatorKeyframe extends AnimatorModel {
             return this.names.get(this.names.size() - 1);
         return null;
     }
-
+    
+    
+   
+    
     /**
      * Remove last animation name
      */
     public void removeLastName() {
-        this.names.remove(this.names.size() - 1);
+       if(this.names.size() != 0) {
+               this.names.remove(this.names.size() - 1);
+       }
     }
 
+
     /**
      * Get keyframe duration
      * 
@@ -461,19 +483,20 @@ public class AnimatorKeyframe extends AnimatorModel {
                 }
                 if (nextParent != null) {
                     AnimatorFrame nextFrame = nextParent.getFirstFrame();
-                    assert !nextFrame.hasSamePropertyValue(frame) : "This should be always true, if not previous logic is corrupt";
+//                    assert !nextFrame.hasSamePropertyValue(frame) : "This should be always true, if not previous logic is corrupt";
                     // if (!nextFrame.hasSamePropertyValue(this)) {// doesn't need to, because
                     // always true; confirmation required
-                    if (merged) {
-                        previousParent.mergeFrame(nextFrame, true);
-                    } else {
-                        mergeFrame(nextFrame, true);
+                    if (!nextFrame.hasSamePropertyValue(frame)) {
+                       if (merged) {
+                               previousParent.mergeFrame(nextFrame, true);
+                               } else {
+                                       mergeFrame(nextFrame, true);
+                               }
                     }
-                    // }
                 }
             }
         } else if (keyframeChildrenSize > 1) {// case 2
-            if (getChildIndex(this) == 0) { // case 2.1 (left most case)
+            if (getChildIndex(frame) == 0) { // case 2.1 (left most case)
                 // merge left and check right
                 if (previousParent != null) {
                     AnimatorFrame previousFrame = previousParent.getLastFrame();
@@ -482,7 +505,7 @@ public class AnimatorKeyframe extends AnimatorModel {
                     }
                 }
                 // TODO check right
-            } else if (getChildIndex(this) == (keyframeChildrenSize - 1)) { // case 2.2 (right most
+            } else if (getChildIndex(frame) == (keyframeChildrenSize - 1)) { // case 2.2 (right most
                                                                             // case)
                 // merge next frame
                 if (nextParent != null) {
@@ -545,8 +568,8 @@ public class AnimatorKeyframe extends AnimatorModel {
             if (nextFrame.hasSamePropertyValue(frame)) {
                 AnimatorKeyframe nextKeyframe =
                         selector.createKeyframe(getLastName(), frame.getFrameTime());
-                splitFrame(nextKeyframe, nextFrame, true);
                 removeLastName();
+                splitFrame(nextKeyframe, nextFrame, true);
                 selector.addChild(nextKeyframe);
             }
         }
@@ -556,8 +579,8 @@ public class AnimatorKeyframe extends AnimatorModel {
             if (previousFrame.hasSamePropertyValue(frame)) {
                 AnimatorKeyframe currentKeyframe =
                         selector.createKeyframe(getLastName(), frame.getFrameTime());
-                splitFrame(currentKeyframe, frame, true);
                 removeLastName();
+                splitFrame(currentKeyframe, frame, true);
                 selector.addChild(currentKeyframe);
             }
         }
index 74e6556..37ca0a8 100644 (file)
 package org.tizen.webuibuilder.animator.model;
 
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Set;
 
-import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.IEditorPart;
@@ -50,7 +46,6 @@ import org.tizen.webuibuilder.animator.model.descriptor.AnimatorDescriptorManage
 import org.tizen.webuibuilder.animator.model.part.AnimatorPagePart;
 import org.tizen.webuibuilder.animator.model.part.AnimatorPart;
 import org.tizen.webuibuilder.animator.utils.AnimatorUtils;
-import org.tizen.webuibuilder.animator.utils.Constants;
 import org.tizen.webuibuilder.model.Part;
 import org.tizen.webuibuilder.model.app.AppManager;
 import org.tizen.webuibuilder.model.app.AppManagerForHTML;
@@ -674,18 +669,16 @@ public class AnimatorModelManager implements ISelectionListener, IPageDataSetLis
                 for (AnimatorFrame frame : frames) {
                     keyframe.addChild(frame, false);
                 }
-            }
-        }
-
-        if (keyframe != null) {
-            animatorSelector.addChild(keyframe);
-            if (animatorSelector.mergeKeyframe(keyframe)) {
-                animatorSelector.removeChild(keyframe);
-                eventSource.fireEvent(AnimatorModelEvent.EventType.KEYFRAME_REMOVE, origin,
-                                      keyframe);
-            } else {
-                eventSource.fireEvent(true, animatorSelector,
-                                      AnimatorModelEvent.EventType.KEYFRAME_ADD, origin, keyframe);
+                
+                animatorSelector.addChild(keyframe);
+                if (animatorSelector.mergeKeyframe(keyframe)) {
+                    animatorSelector.removeChild(keyframe);
+                    eventSource.fireEvent(AnimatorModelEvent.EventType.KEYFRAME_REMOVE, origin,
+                                          keyframe);
+                } else {
+                    eventSource.fireEvent(true, animatorSelector,
+                                          AnimatorModelEvent.EventType.KEYFRAME_ADD, origin, keyframe);
+                }
             }
         }
     }
@@ -747,7 +740,9 @@ public class AnimatorModelManager implements ISelectionListener, IPageDataSetLis
             selector.addChild(keyframe);
 //            copyPropertiesInLeftOrRightFrame(frame, keyframe);
         } else {// case 2
-            findAnimatedPropertyAndSetInFrame(frame, keyframe);
+               frame.findAnimatedPropertyAndSetInFrame((AnimatorFrame) keyframe.getPrevChild(frame),
+                               (AnimatorFrame) keyframe.getNextChild(frame));
+//            findAnimatedPropertyAndSetInFrame(frame, keyframe);
         }
 
         eventSource.fireEvent(AnimatorModelEvent.EventType.FRAME_ADD, origin, frame);
@@ -785,7 +780,7 @@ public class AnimatorModelManager implements ISelectionListener, IPageDataSetLis
      * @param frame
      * @param keyframe
      */
-    private void findAnimatedPropertyAndSetInFrame(AnimatorFrame frame, AnimatorKeyframe keyframe) {
+/*    private void findAnimatedPropertyAndSetInFrame(AnimatorFrame frame, AnimatorKeyframe keyframe) {
         AnimatorFrame previousFrame = (AnimatorFrame) keyframe.getPrevChild(frame);
         AnimatorFrame nextFrame = (AnimatorFrame) keyframe.getNextChild(frame);
         if(previousFrame == null || nextFrame == null) {
@@ -831,7 +826,7 @@ public class AnimatorModelManager implements ISelectionListener, IPageDataSetLis
         CSSProperty startValue = new CSSProperty(key, start);
         return startValue.getInterpolcatedValue(new CSSProperty(key, end), middle,
                                                 AnimatorUtils.getEasingMethod(easingProperty));
-    }
+    }*/
 
     /**
      * 
@@ -839,13 +834,13 @@ public class AnimatorModelManager implements ISelectionListener, IPageDataSetLis
      * @param nextFrame
      * @return a set of animated properties
      */
-    private Set<String> getAnimatedProperties(AnimatorFrame previousFrame, AnimatorFrame nextFrame) {
+    /*private Set<String> getAnimatedProperties(AnimatorFrame previousFrame, AnimatorFrame nextFrame) {
         Set<String> properties1 = previousFrame.getProperties().keySet();
         Set<String> properties2 = nextFrame.getProperties().keySet();
         Set<String> union = new HashSet<String>(properties1);
         union.addAll(properties2);
         return union;
-    }
+    }*/
 
     /**
      * Edit Animator frame
@@ -881,20 +876,39 @@ public class AnimatorModelManager implements ISelectionListener, IPageDataSetLis
      * @param properties
      * @param origin
      */
-    public Map<String, String> createOrEditAnimatorFrame(AnimatorModelFactory modelFactory,
-                                                                                                        AnimatorSelector selector,
+    public boolean createOrEditAnimatorFrame(AnimatorSelector selector,
                                                          double currentTime,
+                                                         Map<String, String> oldProperties,
                                                          Map<String, String> properties,
                                                          Origin origin) {
-        Map<String, String> oldProperties = new HashMap<String, String>();
-        AnimatorFrame frame = selector.getOrCreateAnimatorFrame(currentTime);
+        boolean isCreate = true;
+        AnimatorFrame frame = selector.getAnimatorFrameByCurrentTime(currentTime);
+        if(frame != null) {
+               isCreate = false;
+        } else {
+               frame = selector.getOrCreateAnimatorFrame(currentTime);
+        }              
+        
         if (frame != null) {
+               AnimatorKeyframe currentKeyframe = (AnimatorKeyframe)frame.getParent();
+            AnimatorKeyframe previousParent = (AnimatorKeyframe) selector.getPrevChild(currentKeyframe);
+            int keyframeChildrenSize = currentKeyframe.getChildrenSize();
+            if (keyframeChildrenSize == 1) {
+                if (currentKeyframe.getChildIndex(frame) == 0) {
+                    if (previousParent != null) {
+                       if(previousParent.getChildrenSize() == 1) {
+                               AnimatorFrame previousFrame = previousParent.getLastFrame();
+                            previousFrame.addComputedPropertiesIfNotExist(properties.keySet());
+                       }
+                    }
+                }
+            }
             oldProperties = frame.getProperties(properties.keySet());
             frame.addOrEditProperties(properties);
         }
 
         eventSource.fireEvent(AnimatorModelEvent.EventType.FRAME_EDIT, origin, frame);
-        return oldProperties;
+        return isCreate;
     }
 
     /**
@@ -908,14 +922,18 @@ public class AnimatorModelManager implements ISelectionListener, IPageDataSetLis
      */
     public void removeOrEditAnimatorFrame(AnimatorSelector selector, double currentTime,
                                           Map<String, String> oldProperties,
-                                          Map<String, String> properties, Origin origin) {
+                                          Map<String, String> properties, boolean isCreate, Origin origin) {
         AnimatorKeyframe keyframe = selector.getCurrentKeyframe(currentTime);
         if (keyframe != null) {
             AnimatorFrame frame = keyframe.getFrameByCurrentTime(currentTime);
             if (frame != null) {
                 frame.removeOrReplaceProperties(oldProperties, properties);
+                if (frame.getPropertySize() == 0 && isCreate) {
+                       AnimatorKeyframe currentKeyframe = (AnimatorKeyframe)frame.getParent();
+                       currentKeyframe.removeChild(frame, true);
+                       currentKeyframe.removeLastName();
+                }
                 if (frame.getPropertySize() == 0) {
-                    keyframe.removeChild(frame, true);
                     eventSource.fireEvent(AnimatorModelEvent.EventType.FRAME_REMOVE, origin, frame);
                 } else
                     eventSource.fireEvent(AnimatorModelEvent.EventType.FRAME_EDIT, origin, frame);
@@ -946,7 +964,8 @@ public class AnimatorModelManager implements ISelectionListener, IPageDataSetLis
     public void removeAnimatorFrame(AnimatorModel model, String name, Origin origin) {
         AnimatorFrame frame = (AnimatorFrame) model;
         AnimatorKeyframe keyframe = (AnimatorKeyframe) frame.getParent();
-        keyframe.removeName(name);
+//        keyframe.removeName(name);
+//        keyframe.removeLastName();
 
         keyframe.removeChild(frame, true);
         eventSource.fireEvent(AnimatorModelEvent.EventType.FRAME_REMOVE, origin, frame);
index c4fb6d2..27efff8 100644 (file)
@@ -195,6 +195,7 @@ public class AnimatorSelector extends AnimatorModel {
     public double calculateMergeFrameTime(double currentTime) {
         return currentTime - getDelay();
     }
+    
 
     /*
      * (non-Javadoc)
@@ -298,7 +299,7 @@ public class AnimatorSelector extends AnimatorModel {
         }
     }
 
-    private void updateSelectorTime() {
+    public void updateSelectorTime() {
 
         // TODO find max delay value
         double maxDelay = AnimatorConstants.ANIMATOR_MAX_START_TIME;
@@ -375,6 +376,43 @@ public class AnimatorSelector extends AnimatorModel {
         }
         return frames;
     }
+    
+    public List<AnimatorFrame> getMergedPropertyWithWidgetProperty() {
+       
+       List<AnimatorFrame> mergedFrames = getMergedFrames();
+       Set<String> propertiesUsed = getAllPropertiesUsed(mergedFrames);
+       Map<String, String> widgetProperties = getWidgetProperties(propertiesUsed);
+       
+       for(AnimatorFrame mergedFrame : mergedFrames) {
+               for(String key : propertiesUsed) {
+                       if(!mergedFrame.getUsedPropertiesInThisFrame().contains(key)) {
+                               int index = mergedFrames.indexOf(mergedFrame);
+                               if(index != 0) { // not first frame
+                                       if(index == mergedFrames.size() -1){ //last frame
+                                               AnimatorFrame previousFrame = mergedFrames.get((mergedFrames.indexOf(mergedFrame) - 1));
+                                               mergedFrame.addProperty(key, previousFrame.getProperty(key));
+                                       } else { //middle frame
+                                                       AnimatorFrame previousFrame = mergedFrames.get(index - 1);
+                                               mergedFrame.addProperty(key, previousFrame.getProperty(key));
+                                       }
+                               } else { //first frame
+                                       if(mergedFrame.getParent().getChildrenSize() == 1) { // if it is only frame in keyframe
+                                               AnimatorFrame nextFrame = mergedFrames.get(index + 1);
+                                               if(nextFrame != null) {
+                                                       mergedFrame.addProperty(key, nextFrame.getProperty(key));
+                                               } else {
+                                                       mergedFrame.addProperty(key, widgetProperties.get(key));
+                                               }
+                                       } else {
+                                               mergedFrame.addProperty(key, widgetProperties.get(key));
+                                       }
+                               }
+                       }
+               }
+       }
+       
+       return mergedFrames;
+    }
 
     /**
      * Create keyframe
@@ -385,7 +423,7 @@ public class AnimatorSelector extends AnimatorModel {
      */
     public AnimatorKeyframe createKeyframe(String name, double frameTime) {        
         AnimatorKeyframe keyframe = (AnimatorKeyframe)getModelFactory().createAnimatorModel(AnimatorModelType.KEYFRAME);
-        keyframe.setNames(name);
+        keyframe.setName(name);
         keyframe.setDuration(0.0);
         keyframe.setDelay(frameTime);
         keyframe.setParent(this);
@@ -481,14 +519,13 @@ public class AnimatorSelector extends AnimatorModel {
 
         if (previousKeyframe != null) {
             AnimatorFrame previousFrame = previousKeyframe.getLastFrame();
-            copyLeftPropertiesToAllFramesInKeyframe(previousFrame, keyframe);
+//            copyLeftPropertiesToAllFramesInKeyframe(previousFrame, keyframe);
 
             if (previousFrame != null) {
                 if (!previousFrame.hasSamePropertyValue(keyframe.getFirstFrame())) {
                     previousKeyframe.mergeFrame(keyframe.getFirstFrame(), true);
                     keyframe = previousKeyframe;
                     result = true;
-
                 }
             }
         }
@@ -511,7 +548,7 @@ public class AnimatorSelector extends AnimatorModel {
      * @param previousFrame
      * @param keyframe
      */
-    private void copyLeftPropertiesToAllFramesInKeyframe(AnimatorFrame previousFrame,
+/*    private void copyLeftPropertiesToAllFramesInKeyframe(AnimatorFrame previousFrame,
                                                          AnimatorKeyframe keyframe) {
         List<AnimatorModel> frames = keyframe.getChildren();
         for (AnimatorModel frameModel : frames) {
@@ -535,7 +572,7 @@ public class AnimatorSelector extends AnimatorModel {
                 }
             }
         }
-    }
+    }*/
 
     /**
      * Get css string
@@ -545,7 +582,6 @@ public class AnimatorSelector extends AnimatorModel {
      * @return css string from animation for this selector
      */
     public String getCssString(AnimatorModelFactory modelFactory) {
-        // String separator = System.getProperty( "line.separator" );
         StringBuilder builder = new StringBuilder("\n");
         if (getChildrenSize() > 0) {
             String id = this.getId();
@@ -590,54 +626,6 @@ public class AnimatorSelector extends AnimatorModel {
     }
 
     /**
-     * Create Predefined frames for predefined animation
-     * 
-     * @param preDefinedAnimationDescriptor
-     * @param delay
-     * @return
-     */
-    /*public List<AnimatorFrame> createPredefinedFrames(CssAnimationDescriptor preDefinedAnimationDescriptor,
-                                                      double delay) {
-
-        List<AnimatorFrame> frames = new ArrayList<AnimatorFrame>();
-        List<CssAnimationPropertyDescriptor> defaultKeyFrames =
-                preDefinedAnimationDescriptor.getDefaultKeyFrames();
-
-        double duration =
-                AnimatorUtils.convertTimeToDouble(preDefinedAnimationDescriptor
-                        .getPropertyValueByName(AnimatorConstants.PROPERTY_NAME_DURATION));
-
-        for (CssAnimationPropertyDescriptor property : defaultKeyFrames) {
-            AnimatorFrame frame =
-                    new AnimatorFrame(AnimatorUtils.doubleRoundCeiling(AnimatorUtils
-                            .convertPercentToDouble(property.getName()) / 100 * duration));
-            List<CssAnimationPropertyDescriptor> childProperties = property.getChildProperties();
-            for (CssAnimationPropertyDescriptor childProperty : childProperties) {
-                String name = childProperty.getName();
-                String value = childProperty.getDefaultValue();
-                frame.addProperty(name, value);
-            }
-
-            frame.setFrameTime(frame.getFrameTime() + delay);
-            addListByFrameTime(frames, frame);
-        }
-        return frames;
-    }*/
-
-    /*private void addListByFrameTime(List<AnimatorFrame> frames, AnimatorFrame addFrame) {
-        int index = 0;
-        for (AnimatorModel model : frames) {
-            AnimatorFrame frame = (AnimatorFrame) model;
-            if (frame.getFrameTime() < addFrame.getFrameTime())
-                index++;
-            else
-                break;
-        }
-
-        frames.add(index, addFrame);
-    }*/
-
-    /**
      * if there exists a Frame, return exist frame. if not, create and return it.
      * 
      * @param model
@@ -646,12 +634,15 @@ public class AnimatorSelector extends AnimatorModel {
      */
     public AnimatorFrame getOrCreateAnimatorFrame(double currentTime) {
         AnimatorKeyframe keyframe = getCurrentKeyframe(currentTime);
-        if (keyframe == null)
+        if (keyframe == null) {
             keyframe = createKeyframe("custom", currentTime);
+            addChild(keyframe);
+        }
 
         AnimatorFrame frame = keyframe.getFrameByCurrentTime(currentTime);
         if (frame == null) {
-               keyframe.createAnimatorFrame(currentTime);
+               frame = keyframe.createAnimatorFrame(currentTime);
+               keyframe.addChild(frame, true);
         }
 
         return frame;
index 71560ea..d4e989d 100644 (file)
@@ -194,7 +194,7 @@ public class AnimatorWidget extends AnimatorModel {
                 if (property.equals("translateX") || property.equals("translateY")
                         || property.equals("scaleX") || property.equals("scaleY")
                         || property.equals("skewX") || property.equals("skewY")
-                        || property.equals("rotateZ")) {
+                        || property.equals("rotateZ") || property.equals("perspective")) {
                     fillTransformProperties(properties, cssSelector);
                 } else {
                     CssStyle style = cssSelector.getCssStyle(property);
index dcb5bff..0472798 100644 (file)
@@ -60,7 +60,7 @@ public class AnimatorKeyframeDeserializer extends AnimatorModelDeserializer<Anim
         JsonObject jobject = (JsonObject) json;
 
         AnimatorKeyframe keyframe = (AnimatorKeyframe)getModelFactory().createAnimatorModel(AnimatorModelType.KEYFRAME);
-        keyframe.setNames(jobject.get("name").getAsString());
+        keyframe.setName(jobject.get("name").getAsString());
         keyframe.setDuration(AnimatorUtils.convertTimeToDouble(jobject.get("duration").getAsString()));
         keyframe.setDelay( AnimatorUtils.convertTimeToDouble(jobject.get("start").getAsString()));        
 
index 2fb38ad..b292f94 100644 (file)
@@ -631,7 +631,7 @@ public class AnimatorUtils {
         }
 
         Pattern p =
-                Pattern.compile(".*translate\\((\\-?\\d*\\.?\\d+)px,\\s*(\\-?\\d*\\.?\\d+)px\\).*rotate\\((\\-?\\d*\\.?\\d+)deg\\).*scale\\((\\-?\\d*\\.?\\d+),\\s*(\\-?\\d*\\.?\\d+)\\).*skew\\((\\-?\\d*\\.?\\d+)deg,\\s*(\\-?\\d*)deg\\).*");
+                Pattern.compile(".*translate\\((\\-?\\d*\\.?\\d+)px,\\s*(\\-?\\d*\\.?\\d+)px\\).*rotate\\((\\-?\\d*\\.?\\d+)deg\\).*scale\\((\\-?\\d*\\.?\\d+),\\s*(\\-?\\d*\\.?\\d+)\\).*skew\\((\\-?\\d*\\.?\\d+)deg,\\s*(\\-?\\d*)deg\\).*perspective\\((\\-?\\d*\\.?\\d+)px\\)");
         Matcher m = p.matcher(fullTransform);
         if (m.find()) {
             String matchValue = m.group(1);
@@ -654,6 +654,9 @@ public class AnimatorUtils {
 
             matchValue = m.group(7);
             properties.put(Constants.skewY, matchValue + "deg");
+            
+            matchValue = m.group(8);
+            properties.put(Constants.perspective, matchValue + "px");
         }
     }
 
index 0b8cf9a..eae8649 100644 (file)
@@ -33,6 +33,7 @@ public class Constants {
     public static String skewY = "skewY";
     public static String scaleX = "scaleX";
     public static String scaleY = "scaleY";
+    public static String perspective = "perspective";
 
     // css Property default value
     public static String none = "none";