package at.medevit.elexis.agenda.ui.function; import java.time.LocalDate; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.widgets.Display; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import at.medevit.elexis.agenda.ui.model.Event; import ch.elexis.agenda.data.Termin; import ch.elexis.agenda.data.TerminUtil; import ch.elexis.core.model.IPeriod; import ch.elexis.data.Query; import ch.rgw.tools.TimeTool; public class LoadEventsFunction extends AbstractBrowserFunction { private Gson gson; private Set<String> resources = new HashSet<String>(); public LoadEventsFunction(Browser browser, String name){ super(browser, name); gson = new GsonBuilder().create(); } public Object function(Object[] arguments){ if (arguments.length == 3) { LocalDate startDate = getDateArg(arguments[0]); LocalDate endDate = getDateArg(arguments[1]); List<IPeriod> periods = getPeriods(startDate, endDate); ArrayList<Event> events = new ArrayList<>(); for (IPeriod iPeriod : periods) { events.add(Event.of(iPeriod)); } Display.getDefault().asyncExec(new Runnable() { @Override public void run(){ // update calendar height updateCalendarHeight(); } }); return gson.toJson(events); } else { throw new IllegalArgumentException("Unexpected arguments"); } } public void addResource(String resource) { this.resources.add(resource); } public void removeResource(String resource){ this.resources.remove(resource); } public void setResources(List<String> resources){ this.resources.clear(); this.resources.addAll(resources); } private List<IPeriod> getPeriods(LocalDate from, LocalDate to) throws IllegalStateException{ for (String resource : resources) { LocalDate updateDate = LocalDate.from(from); do { TerminUtil.updateBoundaries(resource, new TimeTool(updateDate)); updateDate = updateDate.plusDays(1); } while (updateDate.isBefore(to) || updateDate.isEqual(to)); } ArrayList<IPeriod> ret = new ArrayList<IPeriod>(); Query<Termin> query = new Query<Termin>(Termin.class); if (!resources.isEmpty()) { String[] resourceArray = resources.toArray(new String[resources.size()]); query.startGroup(); for (int i = 0; i < resourceArray.length; i++) { if (i > 0) { query.or(); } query.add(Termin.FLD_BEREICH, Query.EQUALS, resourceArray[i]); } query.endGroup(); query.and(); query.startGroup(); if (from != null) { TimeTool time = new TimeTool(from); query.add(Termin.FLD_TAG, Query.GREATER_OR_EQUAL, time.toString(TimeTool.DATE_COMPACT)); } if (to != null) { TimeTool time = new TimeTool(to); query.add(Termin.FLD_TAG, Query.LESS_OR_EQUAL, time.toString(TimeTool.DATE_COMPACT)); } query.endGroup(); ret.addAll((Collection<? extends IPeriod>) query.execute()); } return ret; } }