package org.tltv.gantt;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import org.tltv.gantt.client.shared.Step;
import org.tltv.gantt.client.shared.StepState;
import org.tltv.gantt.client.shared.SubStep;
import org.tltv.gantt.client.shared.SubStepObserver;
import org.tltv.gantt.client.shared.SubStepObserverProxy;
import com.vaadin.shared.Connector;
import com.vaadin.ui.Component;
import com.vaadin.ui.HasComponents;
/**
* Component representing a Step in the Gantt chart.
*
* @author Tltv
*
*/
public class StepComponent extends AbstractStepComponent implements
HasComponents, SubStepObserver {
protected Gantt gantt;
public StepComponent(Gantt gantt, Step data) {
this.gantt = gantt;
if (data.getUid() == null) {
data.setUid(UUID.randomUUID().toString());
}
setParent(gantt);
getState().step = data;
for (SubStep subStep : data.getSubSteps()) {
onAddSubStep(subStep);
}
data.addSubStepObserver(new SubStepObserverProxy(this));
}
@Override
public StepState getState() {
return (StepState) super.getState();
}
@Override
public StepState getState(boolean markAsDirty) {
return (StepState) super.getState(markAsDirty);
}
public void addSubStep(StepComponent stepComponent, SubStep subStep) {
SubStepComponent component = createSubStepComponent(stepComponent,
subStep);
getState().subSteps.add(component);
}
protected SubStepComponent createSubStepComponent(
StepComponent stepComponent, SubStep subStep) {
return new SubStepComponent(stepComponent, subStep);
}
@Override
public Iterator<Component> iterator() {
List<Component> l = new ArrayList<Component>();
for (Connector c : getState(false).subSteps) {
l.add((Component) c);
}
return l.iterator();
}
@Override
public void onAddSubStep(SubStep subStep) {
SubStepComponent component = createSubStepComponent(this, subStep);
getState(true).subSteps.add(component);
gantt.subStepMap.put(subStep, component);
gantt.adjustDatesByAbstractStep(subStep.getOwner());
}
/** Detach sub-step component from the UI. */
@Override
public void onRemoveSubStep(SubStep subStep) {
SubStepComponent component = gantt.subStepMap.get(subStep);
if (component != null) {
component.setParent(null);
getState(true).subSteps.remove(component);
}
gantt.subStepMap.remove(subStep);
gantt.adjustDatesByAbstractStep(subStep.getOwner());
}
}