package at.medevit.elexis.agenda.ui.composite; import java.io.IOException; import java.net.URL; import java.time.LocalDate; import java.util.List; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.ProgressAdapter; import org.eclipse.swt.browser.ProgressEvent; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IWorkbenchPartSite; import org.osgi.framework.FrameworkUtil; import org.slf4j.LoggerFactory; import at.medevit.elexis.agenda.ui.function.ContextMenuFunction; import at.medevit.elexis.agenda.ui.function.DayClickFunction; import at.medevit.elexis.agenda.ui.function.DoubleClickFunction; import at.medevit.elexis.agenda.ui.function.EventDropFunction; import at.medevit.elexis.agenda.ui.function.EventResizeFunction; import at.medevit.elexis.agenda.ui.function.LoadEventsFunction; import at.medevit.elexis.agenda.ui.function.SingleClickFunction; public class WeekComposite extends Composite implements ISelectionProvider, IAgendaComposite { private Browser browser; private LoadEventsFunction loadEventsFunction; private ScriptingHelper scriptingHelper; private ISelection currentSelection; private ListenerList listeners = new ListenerList(); private AgendaSpanSize currentSpanSize; private DayClickFunction dayClickFunction; public WeekComposite(IWorkbenchPartSite partSite, Composite parent, int style){ super(parent, style); setLayout(new FillLayout()); browser = new Browser(this, SWT.NONE); scriptingHelper = new ScriptingHelper(browser); loadEventsFunction = new LoadEventsFunction(browser, "loadEventsFunction"); new SingleClickFunction(browser, "singleClickFunction").setSelectionProvider(this); new DoubleClickFunction(browser, "doubleClickFunction"); new ContextMenuFunction(browser, "contextMenuFunction").setSelectionProvider(this); new EventDropFunction(browser, "eventDropFunction"); new EventResizeFunction(browser, "eventResizeFunction"); dayClickFunction = new DayClickFunction(browser, "dayClickFunction"); try { URL url = FileLocator.toFileURL( FrameworkUtil.getBundle(getClass()).getResource("/rsc/html/defaultWeek.html")); LoggerFactory.getLogger(getClass()).debug("Open url [" + url.getFile() + "]"); browser.setUrl(url.toString()); } catch (IOException e) { LoggerFactory.getLogger(getClass()) .error("Could not set url to /rsc/html/defaultWeek.html", e); } browser.addControlListener(new ControlAdapter() { @Override public void controlResized(ControlEvent e){ loadEventsFunction.updateCalendarHeight(); } }); // register context menu for table viewer MenuManager menuManager = new MenuManager(); Menu menu = menuManager.createContextMenu(browser); browser.setMenu(menu); if (partSite != null) { partSite.setSelectionProvider(this); partSite.registerContextMenu("at.medevit.elexis.agenda.ui.week", menuManager, this); } browser.addProgressListener(new ProgressAdapter() { @Override public void changed(ProgressEvent event){ if (event.current == 0 && event.total == 0) { if (currentSpanSize != null) { setSelectedSpanSize(currentSpanSize); } } } }); } @Override public boolean setFocus(){ refetchEvents(); return browser.setFocus(); } public void refetchEvents(){ scriptingHelper.refetchEvents(); } @Override public void setSelectedDate(LocalDate date){ scriptingHelper.setSelectedDate(date); } @Override public void setSelectedSpanSize(AgendaSpanSize size){ currentSpanSize = size; scriptingHelper.setSelectedSpanSize(size); } @Override public void setSelectedResources(List<String> selectedResources){ loadEventsFunction.setResources(selectedResources); dayClickFunction.setSelectedResources(selectedResources); refetchEvents(); } @Override public String getConfigId(){ return "week"; } @Override public void addSelectionChangedListener(ISelectionChangedListener listener){ listeners.add(listener); } @Override public ISelection getSelection(){ if (currentSelection != null) { return currentSelection; } return StructuredSelection.EMPTY; } @Override public void removeSelectionChangedListener(ISelectionChangedListener listener){ listeners.remove(listener); } @Override public void setSelection(ISelection selection){ currentSelection = selection; for (Object listener : listeners.getListeners()) { ((ISelectionChangedListener) listener) .selectionChanged(new SelectionChangedEvent(this, selection)); } } }