/* * This file is part of LibrePlan * * Copyright (C) 2010-2012 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.exceptionDays; import static org.libreplan.web.I18nHelper._; import java.util.ConcurrentModificationException; import java.util.List; import org.libreplan.business.calendars.entities.CalendarExceptionType; import org.libreplan.business.calendars.entities.CalendarExceptionTypeColor; import org.libreplan.business.calendars.entities.Capacity; import org.libreplan.business.calendars.entities.PredefinedCalendarExceptionTypes; import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.common.exceptions.ValidationException; import org.libreplan.web.common.BaseCRUDController; import org.libreplan.web.common.Level; import org.libreplan.web.common.Util; import org.libreplan.web.common.Util.Getter; import org.libreplan.web.common.Util.Setter; import org.libreplan.web.common.components.CapacityPicker; import org.libreplan.web.common.components.EffortDurationPicker; import org.libreplan.web.common.components.NewDataSortableGrid; import org.zkoss.util.IllegalSyntaxException; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.WrongValueException; import org.zkoss.zk.ui.event.CheckEvent; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zkplus.spring.SpringUtil; import org.zkoss.zul.Button; import org.zkoss.zul.Checkbox; import org.zkoss.zul.Grid; import org.zkoss.zul.Hbox; import org.zkoss.zul.Label; import org.zkoss.zul.Listcell; import org.zkoss.zul.Listitem; import org.zkoss.zul.ListitemRenderer; import org.zkoss.zul.Row; import org.zkoss.zul.RowRenderer; import org.zkoss.zul.Textbox; /** * @author Diego Pino <dpino@igalia.com> */ public class CalendarExceptionTypeCRUDController extends BaseCRUDController<CalendarExceptionType> { private ICalendarExceptionTypeModel calendarExceptionTypeModel; private Textbox tbName; private Checkbox overAssignable; private EffortDurationPicker standardEffort; private EffortDurationPicker extraEffort; private static ListitemRenderer calendarExceptionTypeColorRenderer = new ListitemRenderer() { @Override public void render(Listitem item, Object data, int i) throws Exception { CalendarExceptionTypeColor color = (CalendarExceptionTypeColor) data; item.setValue(color); item.appendChild(new Listcell(_(color.getName()))); } }; private RowRenderer exceptionDayTypeRenderer = new RowRenderer() { @Override public void render(Row row, Object data, int i) throws Exception { final CalendarExceptionType calendarExceptionType = (CalendarExceptionType) data; row.setValue(calendarExceptionType); if (calendarExceptionType.isUpdatable()) { row.addEventListener(Events.ON_CLICK, new EventListener() { @Override public void onEvent(Event event) throws Exception { goToEditForm(calendarExceptionType); } }); } row.appendChild(new Label(calendarExceptionType.getName())); row.appendChild(new Label(_(calendarExceptionType.getColor().getName()))); row.appendChild(new Label(calendarExceptionType.getOverAssignableStr())); row.appendChild(new Label(calendarExceptionType.getCapacity().getStandardEffortString())); row.appendChild(new Label(calendarExceptionType.getCapacity().getExtraEffortString())); Hbox hbox = new Hbox(); Button editButton = Util.createEditButton(new EventListener() { @Override public void onEvent(Event event) throws Exception { goToEditForm(calendarExceptionType); } }); editButton.setDisabled(!calendarExceptionType.isUpdatable()); hbox.appendChild(editButton); Button removeButton = Util.createRemoveButton(new EventListener() { @Override public void onEvent(Event event) throws Exception { confirmDelete(calendarExceptionType); } }); removeButton.setDisabled(!calendarExceptionType.isUpdatable()); hbox.appendChild(removeButton); row.appendChild(hbox); } }; @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); if ( calendarExceptionTypeModel == null ) { calendarExceptionTypeModel = (ICalendarExceptionTypeModel) SpringUtil.getBean("calendarExceptionTypeModel"); } initializeEditWindowComponents(); } private void initializeCapacityPicker() { final CalendarExceptionType exceptionType = getExceptionDayType(); CapacityPicker.workWith( overAssignable, standardEffort, extraEffort, new Getter<Capacity>() { @Override public Capacity get() { return exceptionType.getCapacity(); } }, new Setter<Capacity>() { @Override public void set(Capacity value) { exceptionType.setCapacity(value); } }); } private void initializeEditWindowComponents() { tbName = (Textbox) editWindow.getFellowIfAny("tbName"); overAssignable = Util.findComponentAt(editWindow, "overAssignable"); standardEffort = Util.findComponentAt(editWindow, "standardEffort"); standardEffort.initializeFor24HoursAnd0Minutes(); extraEffort = Util.findComponentAt(editWindow, "extraEffort"); } @Override protected void initCreate() { calendarExceptionTypeModel.initCreate(); initializeCapacityPicker(); } @Override protected void initEdit(CalendarExceptionType calendarExceptionType) { calendarExceptionTypeModel.initEdit(calendarExceptionType); initializeCapacityPicker(); } public CalendarExceptionType getExceptionDayType() { return calendarExceptionTypeModel.getExceptionDayType(); } public List<CalendarExceptionType> getExceptionDayTypes() { return calendarExceptionTypeModel.getExceptionDayTypes(); } @Override protected void cancel() { clearFields(); } private void clearFields() { tbName.setRawValue(""); } @Override protected void save() throws ValidationException { calendarExceptionTypeModel.confirmSave(); clearFields(); } @Override protected boolean beforeDeleting(CalendarExceptionType calendarExceptionType) { if (PredefinedCalendarExceptionTypes.contains(calendarExceptionType)) { messagesForUser.showMessage( Level.ERROR, _("Cannot remove the predefined calendar exception day \"{0}\"", calendarExceptionType.getHumanId())); return false; } return true; } @Override protected void delete(CalendarExceptionType calendarExceptionType) { try { calendarExceptionTypeModel.confirmDelete(calendarExceptionType); } catch (InstanceNotFoundException e) { throw new RuntimeException(e); } catch (IllegalSyntaxException e) { NewDataSortableGrid listExceptionDayTypes = (NewDataSortableGrid) listWindow.getFellowIfAny("listExceptionDayTypes"); Row row = findRowByValue(listExceptionDayTypes, calendarExceptionType); throw new WrongValueException(row, e.getMessage()); } } private Row findRowByValue(Grid grid, Object value) { final List<Row> rows = grid.getRows().getChildren(); for (Row row: rows) { if (row.getValue().equals(value)) { return row; } } return null; } public void onCheckGenerateCode(Event e) { CheckEvent ce = (CheckEvent) e; if (ce.isChecked()) { // We have to auto-generate the code for new objects try { calendarExceptionTypeModel.setCodeAutogenerated(ce.isChecked()); } catch (ConcurrentModificationException err) { messagesForUser.showMessage(Level.ERROR, err.getMessage()); } } Util.reloadBindings(editWindow); } @Override protected String getEntityType() { return _("Calendar Exception Day"); } @Override protected String getPluralEntityType() { return _("Calendar Exception Days"); } @Override protected CalendarExceptionType getEntityBeingEdited() { return calendarExceptionTypeModel.getExceptionDayType(); } public CalendarExceptionTypeColor[] getColors() { return CalendarExceptionTypeColor.values(); } public ListitemRenderer getColorsRenderer() { return calendarExceptionTypeColorRenderer; } public RowRenderer getExceptionDayTypeRenderer() { return exceptionDayTypeRenderer; } public String getStyleColorOwnException() { return (getExceptionDayType() == null) ? "" : "background-color: " + getExceptionDayType().getColor().getColorOwnException(); } public String getStyleColorDerivedException() { return (getExceptionDayType() == null) ? "" : "background-color: " + getExceptionDayType().getColor().getColorDerivedException(); } public void reloadSampleColors() { Util.reloadBindings(editWindow.getFellow("colorSampleOwn")); Util.reloadBindings(editWindow.getFellow("colorSampleDerived")); } }