/*******************************************************************************
* Copyright (c)                                                                *
*           2005   Tristan Allwood,                                            *
*           2005   Daniel Burke,                                               *
*           2005   Marc Hull,                                                  *
*           2005   Ekaterina Itskova,                                          *
*           2005   Steve Zymler                                                *
*                                                                              *
* Permission is hereby granted, free of charge, to any person obtaining a      *
* copy of this software and associated documentation files (the                *
* "Software"), to deal in the Software without restriction, including          *
* without limitation the rights to use, copy, modify, merge, publish,          *
* distribute, sublicense, and/or sell copies of the Software, and to           *
* permit persons to whom the Software is furnished to do so, subject to        *
* the following conditions:                                                    *
*                                                                              *
* The above copyright notice and this permission notice shall be included      *
* in all copies or substantial portions of the Software.                       *
*                                                                              *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS      *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF                   *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.       *
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY         *
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,         *
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE            *
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                       *
*******************************************************************************/
/*
 * Created on 27-Oct-2004
 */
package uk.ac.ic.doc.kevlar.gui.internal.animation;

import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;

import uk.ac.ic.doc.kevlar.gui.internal.ADrawableObject;

/**
 * @author Marc
 **/
public class SlideAnimation extends AAnimation {

    private static final int DURATION = 250;
    
    protected Point start;
    protected Point end;
    protected long startTime;
    protected long lastTime;
    
    public SlideAnimation(ADrawableObject target, Point end) {
        
        super(target);
        this.start = target.getPosition();
        this.end = end;
        this.startTime = System.currentTimeMillis();
        this.lastTime = startTime;

    }
    
    public boolean animate(long currentTime) {
        
        Rectangle area = target.getAlignedArea();
        
/*        if (area.x != end.x || area.y != end.y) {
        
            int diff = (int)Math.round((area.x-end.x)*0.7);
            
            if (diff == area.x-end.x) {
                
                if (diff > 0) {
                    
                    area.x--;
                    
                } else if (diff < 0) {
                    
                    area.x++;
                    
                }
                
            } else {
                
                area.x = end.x+diff;
                
            }
            
            diff = (int)Math.round((area.y-end.y)*0.7);
            
            if (diff == area.y-end.y) {
                
                if (diff > 0) {
                    
                    area.y--;
                    
                } else if (diff < 0) {
                    
                    area.y++;
                    
                }
                
            } else {
                
                area.y = end.y+diff;
                
            }
            
//          area.y = end.y+(int)Math.round((area.y-end.y)*0.9-0.5);
            
            target.updateDimensions();
            
        } 
        
        return !(end.x == area.x && end.y == area.y); */
        
        if (currentTime-lastTime > 100) {
            
            area.x = end.x;
            area.y = end.y;
            target.updateDimensions();
            
            return false;
            
        } else {
        
            lastTime = currentTime;
            
            if (area.x != end.x || area.y != end.y) {

                if (currentTime < startTime+DURATION) {
            
                    area.x = (int)(start.x+(end.x-start.x)*(((double)currentTime-startTime)/DURATION));
                    area.y = (int)(start.y+(end.y-start.y)*(((double)currentTime-startTime)/DURATION));
                
                } else {
            
                    area.x = end.x;
                    area.y = end.y;
                
                }
            
                target.updateDimensions();
            
            } 
        
            return currentTime < startTime+DURATION;
            
        }
                    
    }

}
