/*
* This file is part of LibrePlan
*
* Copyright (C) 2011 Igalia, S.L.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.libreplan.web.common.components;
import org.apache.commons.lang3.BooleanUtils;
import org.libreplan.business.calendars.entities.Capacity;
import org.libreplan.business.workingday.EffortDuration;
import org.libreplan.web.common.Util;
import org.libreplan.web.common.Util.Getter;
import org.libreplan.web.common.Util.Setter;
import org.zkoss.zul.Checkbox;
/**
* It configures some ZK components to work together and edit a Capacity object
*
* @author Óscar González Fernández <ogonzalez@igalia.com>
*/
public class CapacityPicker {
public static CapacityPicker workWith(Checkbox checkbox,
EffortDurationPicker standardEffortPicker,
EffortDurationPicker extraHoursPicker, Getter<Capacity> getter,
Setter<Capacity> setter) {
return new CapacityPicker(checkbox, standardEffortPicker,
extraHoursPicker, getter.get(), setter);
}
public static CapacityPicker workWith(Checkbox checkbox,
EffortDurationPicker standardEffortPicker,
EffortDurationPicker extraHoursPicker,
final Capacity initialCapacity) {
return new CapacityPicker(checkbox, standardEffortPicker,
extraHoursPicker, initialCapacity, null);
}
private Capacity currentCapacity;
private final Setter<Capacity> setter;
private final Checkbox overAssignableWithoutLimitCheckbox;
private final EffortDurationPicker standardEffortPicker;
private final EffortDurationPicker extraEffortPicker;
private CapacityPicker(Checkbox overAssignableWithoutLimitCheckbox,
EffortDurationPicker standardEffortPicker,
final EffortDurationPicker extraEffortPicker,
Capacity initialCapacity,
Setter<Capacity> setter) {
this.overAssignableWithoutLimitCheckbox = overAssignableWithoutLimitCheckbox;
this.standardEffortPicker = standardEffortPicker;
this.extraEffortPicker = extraEffortPicker;
this.currentCapacity = initialCapacity;
this.setter = setter;
standardEffortPicker.bind(new Getter<EffortDuration>() {
@Override
public EffortDuration get() {
return currentCapacity.getStandardEffort();
}
}, new Setter<EffortDuration>() {
@Override
public void set(EffortDuration value) {
updateCapacity(currentCapacity.withStandardEffort(value));
}
});
extraEffortPicker.bind(new Getter<EffortDuration>() {
@Override
public EffortDuration get() {
if (currentCapacity.getAllowedExtraEffort() == null) {
return EffortDuration.zero();
}
return currentCapacity.getAllowedExtraEffort();
}
}, new Setter<EffortDuration>() {
@Override
public void set(EffortDuration value) {
updateCapacity(currentCapacity.withAllowedExtraEffort(value));
}
});
Util.bind(overAssignableWithoutLimitCheckbox, new Getter<Boolean>() {
@Override
public Boolean get() {
return currentCapacity.isOverAssignableWithoutLimit();
}
}, new Setter<Boolean>() {
@Override
public void set(Boolean value) {
updateCapacity(currentCapacity.overAssignableWithoutLimit(BooleanUtils
.isTrue(value)));
updateExtraEffortDisability();
}
});
updateExtraEffortDisability();
}
private void updateExtraEffortDisability() {
extraEffortPicker.setDisabled(currentCapacity
.isOverAssignableWithoutLimit());
}
private void updateCapacity(Capacity newCapacity) {
this.currentCapacity = newCapacity;
if (this.setter != null) {
this.setter.set(currentCapacity);
}
}
public Capacity getValue() {
return currentCapacity;
}
public void setValue(Capacity capacity) {
overAssignableWithoutLimitCheckbox.setChecked(capacity
.isOverAssignableWithoutLimit());
standardEffortPicker.setValue(capacity.getStandardEffort());
extraEffortPicker.setValue(capacity.getAllowedExtraEffort());
currentCapacity = capacity;
updateExtraEffortDisability();
}
public void setDisabled(boolean disabled) {
standardEffortPicker.setDisabled(disabled);
updateExtraEffortDisability();
extraEffortPicker.setDisabled(extraEffortPicker.isDisabled()
|| disabled);
overAssignableWithoutLimitCheckbox.setDisabled(disabled);
}
}