/******************************************************************************* * Copyright (c) 2009, G. Weirich and Elexis * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * G. Weirich - initial implementation * *******************************************************************************/ package ch.elexis.agenda.util; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.ui.PlatformUI; import ch.elexis.agenda.data.Termin; import ch.elexis.core.constants.StringConstants; import ch.elexis.data.Query; import ch.rgw.tools.TimeTool; import ch.rgw.tools.TimeTool.DAYS; /** * Update the configured day boundaries on all given week days from a specific start date. Update * means only delete the existing boundaries, as the new boundaries will be initialized when the day * is accessed. * */ public class TermineLockedTimesUpdater implements IRunnableWithProgress { private TimeTool _startDate; private DAYS _applyForDay; private String _newValues; private String _bereich; /** * An updater for setting the new reserved time slots starting from a specific date. It updates * all dates which are of day selectedDay and also checks whether there is already an * appointment which would be blocked by this. * * @param startChangeDate * start to change the reserved timeslots from this date * @param selectedDay * updated only every e.g. tuesday, wednesday etc. * @param reservedSlots * the newly assigned reserved slots * @param terminBereich * the specific calendar "bereich" to update as there may exist several calendars */ public TermineLockedTimesUpdater(TimeTool startChangeDate, DAYS selectedDay, String reservedSlots, String terminBereich){ _startDate = startChangeDate; _applyForDay = selectedDay; _newValues = reservedSlots; _bereich = terminBereich; } @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException{ //select all appointments from the area of interest Query<Termin> qbe = new Query<Termin>(Termin.class); qbe.add(Termin.FLD_BEREICH, Query.LIKE, _bereich); List<Termin> appointments = qbe.execute(); monitor.beginTask(Messages.TermineLockedTimesUpdater_0, 2 * appointments.size()); List<String> skipUpdate = checkAppointmentCollision(appointments, monitor); // delete existing boundaries if we should not keep them on that day for (Termin t : appointments) { if (skipUpdate.contains(t.getDay())) continue; TimeTool day = new TimeTool(t.getDay()); if (_startDate.isBeforeOrEqual(day)) { if (t.getType().equals(Termin.typReserviert())) { t.delete(); } } monitor.worked(1); } monitor.done(); } /** * check whether any appointments collide with the lock time changes * * @param appointments * @param monitor * @return list of days to skip when deleting the old boundaries */ private List<String> checkAppointmentCollision(List<Termin> appointments, IProgressMonitor monitor){ List<String> skipUpdate = new ArrayList<String>(); String[] closedTimes = _newValues.split(StringConstants.LF); TimeTool day = new TimeTool(); for (Termin t : appointments) { if (t.getId().equals(StringConstants.ONE)) continue; if (t.getDay() == null || t.getDay().length() < 3) continue; day.set(t.getDay()); if (_startDate.isBeforeOrEqual(day)) { if (day.get(Calendar.DAY_OF_WEEK) == _applyForDay.numericDayValue) { // ignore locktimes if (!t.getType().equals(Termin.typReserviert())) { for (String s : closedTimes) { int von = TimeTool.minutesStringToInt(s.split("-")[0]); //$NON-NLS-1$ int bis = TimeTool.minutesStringToInt(s.split("-")[1]); //$NON-NLS-1$ //check for collision if (t.crossesTimeFrame(von, bis - von)) { boolean keepOldLocktimes = MessageDialog.openQuestion(PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(), Messages.TermineLockedTimesUpdater_4, Messages.TermineLockedTimesUpdater_5 + t.getLabel() + Messages.TermineLockedTimesUpdater_6 + s + ". " + Messages.TermineLockedTimesUpdater_7); //update anyway -> add appointment to delete list if (keepOldLocktimes) skipUpdate.add(t.getDay()); } } } } } monitor.worked(1); } return skipUpdate; } }