package com.proyecto.miniplan.client;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.vaadin.gwtgraphics.client.DrawingArea;
import org.vaadin.gwtgraphics.client.animation.Animate;
import org.vaadin.gwtgraphics.client.shape.Rectangle;
import org.vaadin.gwtgraphics.client.shape.Text;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.datepicker.client.CalendarUtil;
import com.proyecto.miniplan.shared.ProyectoDTO;
import com.proyecto.miniplan.shared.TareaDTO;
public class ProyectoCliente {
public ProyectoDTO proyecto;
public CellTable tabla;
public ScrollPanel scrollPanel = new ScrollPanel();
public DrawingArea canvas = new DrawingArea(2400, 410);
Date hoy = new Date();
final int margen = 23;
public List<Rectangle> widTareas = new ArrayList<Rectangle>();
public Date fecha_ini, fecha_fin, inicioreal, finreal;
//public int tama�oX = 2000;
public Date lista_dia;
public CalendarUtil calendario = new CalendarUtil();
public ProyectoCliente(){
}
public ProyectoCliente(ProyectoDTO proy){
proyecto = proy;
tabla = new CellTable<TareaDTO>();
tabla.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);
fecha_ini = new Date();
fecha_fin = new Date();
//fecha_fin.setDate(fecha_ini.getDate() + 100);
inicioreal = new Date();
finreal = new Date();;
hoy.setHours(0);
hoy.setMinutes(0);
inicioreal.setHours(0);
inicioreal.setMinutes(0);
finreal.setHours(0);
finreal.setMinutes(0);
}
public void crea_gantt(){
lista_dia = new Date();
fecha_ini = new Date();
fecha_fin = new Date();
//lista_dia = new Date(lista_dia.getYear(), lista_dia.getMonth(), lista_dia.getDate());
//fecha_ini = new Date(fecha_ini.getYear(), fecha_ini.getMonth(), fecha_ini.getDate());
//fecha_ini = new Date(fecha_fin.getYear(), fecha_fin.getMonth(), fecha_fin.getDate());
//lista_dia = truncarDia(lista_dia);
//truncarDia(fecha_ini);
//fecha_fin = truncarDia(fecha_fin);
lista_dia.setHours(0);
lista_dia.setMinutes(0);
fecha_ini.setHours(0);
fecha_ini.setMinutes(0);
fecha_fin.setHours(0);
fecha_fin.setMinutes(0);
calculaInicio();
calculaFin();
//Window.alert(String.valueOf(fecha_fin));
inicioreal.setDate((fecha_ini.getDate() - fecha_ini.getDate())+1);
finreal.setDate(fecha_fin.getDate() - fecha_fin.getDate());
finreal.setMonth(fecha_fin.getMonth());
//Window.alert(String.valueOf(inicioreal));
lista_dia = (Date)inicioreal.clone();
Rectangle base;
Text txt;
Text txtmes;
int dia_tipo = 0;
String color = "teal";
int dia_diciembre = 0;
int fin = contarDias(inicioreal, finreal);
//int fin2 = calendario.getDaysBetween(inicioreal, finreal);
if(fin<0){
finreal.setYear(finreal.getYear()+1);
fin = contarDias(inicioreal, finreal);
}
//Window.alert("inicio " + String.valueOf(inicioreal));
//Window.alert("fin " + String.valueOf(finreal));
//Window.alert("Dias totales " + String.valueOf(fin));
//Window.alert("Dias totales 2 " + String.valueOf(fin2));
canvas.setWidth((fin*20)+20);
//for(int i=0; i<100; i++){
for(int i=0; i<=fin; i++){
if(lista_dia.getDate()==1 || (i==0 && lista_dia.getDate() <=24)){
txtmes = new Text((i*20)+5,31+margen,darMes(lista_dia.getMonth())+ " 20" + String.valueOf(lista_dia.getYear()-100));
txtmes.setFontSize(14);
canvas.add(txtmes);
}
dia_tipo = lista_dia.getDay();
if(dia_tipo == 0 || dia_tipo == 6){
color = "#6c84ed";
base = new Rectangle(i*20,53+margen,18,350);
base.setFillOpacity(0.2);
base.setStrokeOpacity(0.3);
base.setStrokeColor(color);
base.setFillColor(color);
canvas.add(base);
}
else{
color = "teal";
}
if(contarDias(lista_dia, hoy)==0){
base = new Rectangle(i*20,53+margen,18,350);
base.setFillOpacity(0.3);
base.setStrokeOpacity(0.3);
base.setStrokeColor("#facc2e");
base.setFillColor("#facc2e");
canvas.add(base);
}
base = new Rectangle(i*20,34+margen,18,18);
base.setFillOpacity(0.0);
base.setStrokeOpacity(0.5);
base.setStrokeColor(color);
canvas.add(base);
String dia = String.valueOf(lista_dia.getDate());
if(dia.length()==1)
dia = "0"+dia;
txt = new Text((i*20)+2,50+margen,dia);
txt.setFontSize(14);
canvas.add(txt);
/*if(lista_dia.getMonth()==11 && lista_dia.getDate()==31){
Window.alert("fecha final " + String.valueOf(lista_dia));
lista_dia.setYear(lista_dia.getYear()+1);
lista_dia.setMonth(0);
lista_dia.setDate(1);
Window.alert("fecha nueva " + String.valueOf(lista_dia));
}else{
if(lista_dia.getMonth() == 11)
dia_diciembre++;
if(dia_diciembre==31){
txt = new Text((i*20)+2,150+margen,"fin de a�o");
txt.setFontSize(14);
canvas.add(txt);
lista_dia = new Date(lista_dia.getYear()+1, 0,1);
//Window.alert("Fin de a�o " + String.valueOf(lista_dia));
}else*/
//lista_dia.setDate(lista_dia.getDate() + 1);
calendario.addDaysToDate(lista_dia, 1);
//lista_dia = new Date(lista_dia.getYear(), lista_dia.getMonth())
//lista_dia.setDate(lista_dia.getTime()+1);
//}
}
}
public void iniciarDiagrama(){
scrollPanel.setSize("550px", "450px");
scrollPanel.add(canvas);
}
private final long MS_POR_DIA = 1000 * 60 * 60 * 24;
public int contarDias(Date _ini, Date _fin)
{
return (int)Math.ceil(((double)_fin.getTime() - _ini.getTime()) / MS_POR_DIA);
}
public void dibujarTarea(int _NoTarea, Date _ini, Date _fin, String _color){
Date ini = _ini;
ini.setHours(0);
ini.setMinutes(0);
Date fin = _fin;
fin.setHours(0);
fin.setMinutes(0);
ClickHandler handler = new ClickHandler() {
public void onClick(ClickEvent event) {
String col = cambiaColor(((Rectangle) event.getSource()).getFillColor());
((Rectangle) event.getSource()).setFillColor(col);
((Rectangle) event.getSource()).setStrokeColor(col);
}
};
int inicio = contarDias(inicioreal,ini);
int dura = contarDias(ini,fin);
//inicio = inicio - 1 ;
Rectangle r1 = new Rectangle((inicio) * 20, 62+margen + (_NoTarea * 26), 0, 10);
r1.setFillColor(_color);
r1.setFillOpacity(0.7);
r1.setStrokeColor(_color);
r1.setRoundedCorners(1);
r1.addClickHandler(handler);
canvas.add(r1);
widTareas.add(r1);
if(dura < 0)
dura=0;
new Animate(r1, "width", 0, (dura + 1) * 20, 500).start();
}
public void actualizarDibujo(int _pos, Date _ini, Date _fin){
Date ini = _ini;
ini.setHours(0);
ini.setMinutes(0);
Date fin = _fin;
fin.setHours(0);
fin.setMinutes(0);
int inicio = contarDias(inicioreal,ini);
int dura = contarDias(ini,fin);
//if(inicio != 0)
//inicio = inicio - 1 ;
((Rectangle)widTareas.get(_pos)).setWidth(0);
if(dura < 0)
dura=0;
new Animate(((Rectangle)widTareas.get(_pos)), "x", ((Rectangle)widTareas.get(_pos)).getX(), inicio * 20, 500).start();
new Animate(((Rectangle)widTareas.get(_pos)), "width", ((Rectangle)widTareas.get(_pos)).getWidth(), (dura + 1) * 20, 500).start();
}
public String darMes(int _mes){
switch(_mes){
case 0: return "Enero";
case 1: return "Febrero";
case 2: return "Marzo";
case 3: return "Abril";
case 4: return "Mayo";
case 5: return "Junio";
case 6: return "Julio";
case 7: return "Agosto";
case 8: return "Septiembre";
case 9: return "Octubre";
case 10: return "Noviembre";
case 11: return "Diciembre";
default: return "error";
}
}
public String cambiaColor(String _col){
if(_col.compareTo("blue")==0)
return "red";
else
if(_col.compareTo("red")==0)
return "yellow";
else
if(_col.compareTo("yellow")==0)
return "green";
else
if(_col.compareTo("green")==0)
return "fuchsia";
else
if(_col.compareTo("fuchsia")==0)
return "lime";
else
if(_col.compareTo("lime")==0)
return "maroon";
else
if(_col.compareTo("maroon")==0)
return "navy";
else
if(_col.compareTo("navy")==0)
return "olive";
else
if(_col.compareTo("olive")==0)
return "teal";
else
return "blue";
}
public void cargarTareas(){
widTareas = new ArrayList<Rectangle>();
TareaDTO aux;
for(int i=0; i<proyecto.tareas.size();i++){
aux = ((TareaDTO)proyecto.tareas.get(i));
dibujarTarea(i, aux.inicio, aux.fin, "blue");
}
}
public void calculaInicio(){
TareaDTO aux;
for(int i=0; i<proyecto.tareas.size();i++){
aux = ((TareaDTO)proyecto.tareas.get(i));
if(aux.inicio.before(fecha_ini)){
fecha_ini = aux.inicio;
}
}
//return null;
}
public void calculaFin(){
TareaDTO aux;
for(int i=0; i<proyecto.tareas.size();i++){
aux = ((TareaDTO)proyecto.tareas.get(i));
if(aux.fin.after(fecha_fin)){
fecha_fin = aux.fin;
}
}
}
public static Date truncarDia(Date date)
{
return new Date(date.getYear(), date.getMonth(), date.getDate());
}
}