package es.upm.fi.dia.oeg.map4rdf.client.widget;
import java.util.ArrayList;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Widget;
import es.upm.fi.dia.oeg.map4rdf.client.util.LeftTopPosition;
import es.upm.fi.dia.oeg.map4rdf.client.util.ParametersSummaryMove;
import es.upm.fi.dia.oeg.map4rdf.client.util.WidgetLineMove;
/**
* @author Francisco Siles
*/
public class SummaryMove {
private Timer firtsTimer;
private int currentStep;
private ArrayList<Integer> widgetSteps;
private ParametersSummaryMove parametersSummary;
private ArrayList<Widget> allWidgetInOrder;
//TODO remove geoResourceSummary of parameter and use a callback to re-positing widget.
private GeoResourceSummary geoResourceSummary;
private ArrayList<WidgetLineMove> widgetsLineMove;
public SummaryMove(ArrayList<Widget> allWidgetInOrder, ParametersSummaryMove parametersSummary, GeoResourceSummary geoResourceSummary){
this.allWidgetInOrder = allWidgetInOrder;
this.parametersSummary = parametersSummary;
this.geoResourceSummary = geoResourceSummary;
firtsTimer=getFirtsTimer();
currentStep=0;
widgetSteps=new ArrayList<Integer>(allWidgetInOrder.size());
for(int i=0;i<allWidgetInOrder.size();i++){
widgetSteps.add(0);
}
initializeWidgetsLineMove();
}
public void moveToInitialPosition(){
this.currentStep=0;
switch (parametersSummary.getMoveType()) {
case 1:
for(int i=allWidgetInOrder.size()-1;i>=0;i--){
geoResourceSummary.moveLeftTopOfCenter(allWidgetInOrder.get(i), calculateLeftMove(0), calculateTopMove(0));
}
break;
case 2:
for(int i=allWidgetInOrder.size()-1;i>=0;i--){
geoResourceSummary.moveLeftTopOfCenter(allWidgetInOrder.get(i), 0, 0);
}
break;
default:
for(int i=0;i<widgetSteps.size();i++){
widgetSteps.set(i, i*parametersSummary.getDiffSpecialSteps());
}
for(int i=allWidgetInOrder.size()-1;i>=0;i--){
geoResourceSummary.moveLeftTopOfCenter(allWidgetInOrder.get(i), calculateLeftMove(i), calculateTopMove(i));
}
break;
}
}
public void startMoveWidgets(){
widgetSteps.clear();
for(int i=0;i<allWidgetInOrder.size();i++){
widgetSteps.add(0);
}
currentStep=0;
firtsTimer.cancel();
switch (parametersSummary.getMoveType()) {
case 1:
firtsTimer.scheduleRepeating(parametersSummary.getFirtsTotalTime()/parametersSummary.getSteps());
break;
case 2:
for(WidgetLineMove i:widgetsLineMove){
i.initWidgetLineMove(parametersSummary.getSteps());
}
firtsTimer.scheduleRepeating(parametersSummary.getSecondTotalTime()/parametersSummary.getSteps());
break;
default:
break;
}
}
public void cancelMove(){
firtsTimer.cancel();
}
private void initializeWidgetsLineMove() {
widgetsLineMove= new ArrayList<WidgetLineMove>();
for(int i=0;i<widgetSteps.size();i++){
widgetSteps.set(i, i*parametersSummary.getDiffSpecialSteps());
}
for(int i=0;i<allWidgetInOrder.size();i++){
int left=parametersSummary.getIntSizeImages()+calculateLeftMove(i);
int top=parametersSummary.getIntSizeImages()-calculateTopMove(i);
widgetsLineMove.add(new WidgetLineMove(allWidgetInOrder.get(i), new LeftTopPosition(left, top), Unit.PX));
}
}
private Timer getFirtsTimer(){
Timer toReturn=new Timer() {
@Override
public void run() {
switch (parametersSummary.getMoveType()) {
case 1:
doCircleMoveOfWidgets();
break;
case 2:
doLineMoveOfWidgets();
break;
default:
break;
}
}
};
return toReturn;
}
private int calculateTopMove(int widgetIndex){
double angleDegrees=0.0;
angleDegrees=((double)(360.0/parametersSummary.getSteps()))*widgetSteps.get(widgetIndex);
int top=(int)(Math.cos(Math.toRadians(angleDegrees))*parametersSummary.getRadiousPX());
return top;
}
private int calculateLeftMove(int widgetIndex){
double angleDegrees=0.0;
angleDegrees=((double)(360.0/parametersSummary.getSteps()))*widgetSteps.get(widgetIndex);
int left=(int)(Math.sin(Math.toRadians(angleDegrees))*parametersSummary.getRadiousPX());
return left;
}
private void doCircleMoveOfWidgets(){
int init=((++currentStep)/parametersSummary.getDiffSteps());
if(init>allWidgetInOrder.size()-1){
init=allWidgetInOrder.size()-1;
}
for(int i=allWidgetInOrder.size()-1;i>=allWidgetInOrder.size()-1-init;i--){
if(widgetSteps.get(i)<=(i*parametersSummary.getDiffSpecialSteps())){
geoResourceSummary.moveLeftTopOfCenter(allWidgetInOrder.get(i), calculateLeftMove(i), calculateTopMove(i));
widgetSteps.set(i, widgetSteps.get(i)+1);
}
}
if(currentStep-1>=parametersSummary.getSteps()){
currentStep=0;
firtsTimer.cancel();
}
}
private void doLineMoveOfWidgets(){
int init=++currentStep;
for(WidgetLineMove i:widgetsLineMove){
try {
i.doStep(init);
} catch (Exception e) {
}
}
if(currentStep>parametersSummary.getSteps()){
currentStep=0;
firtsTimer.cancel();
}
}
}