package org.argeo.support.openlayers; import java.util.List; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.observation.Event; import javax.jcr.observation.EventIterator; import javax.jcr.observation.EventListener; import javax.jcr.query.Query; import org.argeo.cms.ui.CmsUiProvider; import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.entity.EntityType; import org.argeo.jcr.JcrException; import org.argeo.jcr.JcrUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; /** Displays an overview map. */ public class OverviewMap implements CmsUiProvider { @Override public Control createUi(Composite parent, Node context) throws RepositoryException { parent.setLayout(new GridLayout()); refreshUi(parent, context); try { String[] nodeTypes = { EntityType.geopoint.get() }; context.getSession().getWorkspace().getObservationManager().addEventListener(new EventListener() { @Override public void onEvent(EventIterator events) { if (!parent.isDisposed()) parent.getDisplay().asyncExec(() -> { try { refreshUi(parent, context); } catch (RepositoryException e) { throw new JcrException(e); } }); } }, Event.PROPERTY_CHANGED | Event.NODE_ADDED | Event.NODE_REMOVED | Event.PROPERTY_ADDED, "/", true, null, nodeTypes, false); } catch (RepositoryException e) { throw new IllegalStateException("Cannot add JCR observer", e); } return parent; } protected void refreshUi(Composite parent, Node context) throws RepositoryException { CmsUiUtils.clear(parent); Query query = context.getSession().getWorkspace().getQueryManager() .createQuery("SELECT * FROM [" + EntityType.geopoint.get() + "]", Query.JCR_SQL2); List geoPoints = JcrUtils.nodeIteratorToList(query.execute().getNodes()); OpenLayersMap apafMap = new OpenLayersMap(parent, SWT.NONE, getClass().getResource("map-osm.html")); apafMap.setLayoutData(CmsUiUtils.fillAll()); // apafMap.setZoom(7); // apafMap.setCenter(-2.472, 8.010); apafMap.addPoints(geoPoints); } }