/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.ui.views.styledmap;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IPartService;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.PlatformUI;
import org.jdesktop.swingx.mapviewer.TileOverlayPainter;
import de.fhg.igd.eclipse.util.extension.selective.SelectiveExtension.SelectiveExtensionListener;
import de.fhg.igd.mapviewer.view.MapView;
import de.fhg.igd.mapviewer.view.MapViewExtension;
import de.fhg.igd.mapviewer.view.overlay.ITileOverlayService;
import de.fhg.igd.mapviewer.view.overlay.TileOverlayFactory;
import eu.esdihumboldt.hale.ui.common.service.style.StyleService;
import eu.esdihumboldt.hale.ui.geometry.service.GeometrySchemaService;
import eu.esdihumboldt.hale.ui.service.instance.InstanceService;
import eu.esdihumboldt.hale.ui.views.styledmap.clip.layout.extension.PainterLayoutController;
import eu.esdihumboldt.hale.ui.views.styledmap.painter.AbstractInstancePainter;
/**
* Map view extension for the styled instance map.
*
* @author Simon Templer
*/
public class StyledMapExtra implements MapViewExtension, IPartListener2 {
private MapView mapView;
private PainterLayoutController layoutController;
/**
* @see MapViewExtension#setMapView(MapView)
*/
@Override
public void setMapView(MapView mapView) {
this.mapView = mapView;
layoutController = new PainterLayoutController(mapView.getMapKit());
/*
* Listen for activated/deactivated instance painters
*
* - remove listeners for deactivated painters and clear the waypoints -
* update activated listeners and add the corresponding listeners
*/
ITileOverlayService overlayService = PlatformUI.getWorkbench()
.getService(ITileOverlayService.class);
overlayService.addListener(
new SelectiveExtensionListener<TileOverlayPainter, TileOverlayFactory>() {
@Override
public void deactivated(TileOverlayPainter object,
TileOverlayFactory definition) {
if (object instanceof AbstractInstancePainter) {
AbstractInstancePainter painter = (AbstractInstancePainter) object;
// get services
ISelectionService selection = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getSelectionService();
InstanceService instances = PlatformUI.getWorkbench()
.getService(InstanceService.class);
StyleService styles = PlatformUI.getWorkbench()
.getService(StyleService.class);
GeometrySchemaService geometries = PlatformUI.getWorkbench()
.getService(GeometrySchemaService.class);
// remove listeners
selection.removeSelectionListener(painter);
instances.removeListener(painter);
styles.removeListener(painter.getStyleListener());
geometries.removeListener(painter.getGeometryListener());
// clear way-points
painter.clearWaypoints();
}
}
@Override
public void activated(TileOverlayPainter object,
TileOverlayFactory definition) {
if (object instanceof AbstractInstancePainter) {
AbstractInstancePainter painter = (AbstractInstancePainter) object;
// get services
ISelectionService selection = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getSelectionService();
InstanceService instances = PlatformUI.getWorkbench()
.getService(InstanceService.class);
StyleService styles = PlatformUI.getWorkbench()
.getService(StyleService.class);
GeometrySchemaService geometries = PlatformUI.getWorkbench()
.getService(GeometrySchemaService.class);
// update
painter.update(selection.getSelection());
// add listeners
selection.addSelectionListener(painter);
instances.addListener(painter);
styles.addListener(painter.getStyleListener());
geometries.addListener(painter.getGeometryListener());
}
}
});
IPartService partService = mapView.getSite().getService(IPartService.class);
partService.addPartListener(this);
// map tips
mapView.getMapTips().addMapTip(new InstanceMapTip(mapView.getMapKit()), 5);
}
/**
* @see IPartListener2#partClosed(org.eclipse.ui.IWorkbenchPartReference)
*/
@Override
public void partClosed(IWorkbenchPartReference partRef) {
if (partRef.getPart(false) == mapView) {
layoutController.disable();
// get services
ISelectionService selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getSelectionService();
InstanceService instances = PlatformUI.getWorkbench().getService(InstanceService.class);
StyleService styles = PlatformUI.getWorkbench().getService(StyleService.class);
GeometrySchemaService geometries = PlatformUI.getWorkbench()
.getService(GeometrySchemaService.class);
// remove listeners
disableScenePainterListeners(selection, instances, styles, geometries);
}
}
/**
* @see IPartListener2#partOpened(org.eclipse.ui.IWorkbenchPartReference)
*/
@Override
public void partOpened(IWorkbenchPartReference partRef) {
if (partRef.getPart(false) == mapView) {
mapView.restoreState();
// get services
ISelectionService selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getSelectionService();
InstanceService instances = PlatformUI.getWorkbench().getService(InstanceService.class);
StyleService styles = PlatformUI.getWorkbench().getService(StyleService.class);
GeometrySchemaService geometries = PlatformUI.getWorkbench()
.getService(GeometrySchemaService.class);
// update
updateScenePainters(selection);
// add listeners
enableScenePainterListeners(selection, instances, styles, geometries);
layoutController.enable();
}
}
/**
* Add the instance painters as listeners.
*
* @param selection the selection service
* @param instances the instance service
* @param styles the style service
* @param geometries the geometry schema service
*/
private void enableScenePainterListeners(ISelectionService selection, InstanceService instances,
StyleService styles, GeometrySchemaService geometries) {
for (AbstractInstancePainter painter : mapView.getMapKit()
.getTilePainters(AbstractInstancePainter.class)) {
selection.addSelectionListener(painter);
instances.addListener(painter);
styles.addListener(painter.getStyleListener());
geometries.addListener(painter.getGeometryListener());
}
}
/**
* Update the instance painters.
*
* @param selection the selection service
*/
private void updateScenePainters(ISelectionService selection) {
for (AbstractInstancePainter painter : mapView.getMapKit()
.getTilePainters(AbstractInstancePainter.class)) {
painter.update(selection.getSelection());
}
}
/**
* Remove the instance painters as listeners.
*
* @param selection the selection service
* @param instances the instance service
* @param styles the style service
* @param geometries the geometry schema service
*/
private void disableScenePainterListeners(ISelectionService selection,
InstanceService instances, StyleService styles, GeometrySchemaService geometries) {
for (AbstractInstancePainter painter : mapView.getMapKit()
.getTilePainters(AbstractInstancePainter.class)) {
selection.removeSelectionListener(painter);
instances.removeListener(painter);
styles.removeListener(painter.getStyleListener());
geometries.removeListener(painter.getGeometryListener());
painter.clearWaypoints();
}
}
/**
* @see IPartListener2#partActivated(IWorkbenchPartReference)
*/
@Override
public void partActivated(IWorkbenchPartReference partRef) {
// ignore
}
/**
* @see IPartListener2#partBroughtToTop(IWorkbenchPartReference)
*/
@Override
public void partBroughtToTop(IWorkbenchPartReference partRef) {
// ignore
}
/**
* @see IPartListener2#partHidden(IWorkbenchPartReference)
*/
@Override
public void partHidden(IWorkbenchPartReference partRef) {
// ignore
}
/**
* @see IPartListener2#partVisible(IWorkbenchPartReference)
*/
@Override
public void partVisible(IWorkbenchPartReference partRef) {
// ignore
}
/**
* @see IPartListener2#partDeactivated(org.eclipse.ui.IWorkbenchPartReference)
*/
@Override
public void partDeactivated(IWorkbenchPartReference partRef) {
// ignore
}
/**
* @see IPartListener2#partInputChanged(org.eclipse.ui.IWorkbenchPartReference)
*/
@Override
public void partInputChanged(IWorkbenchPartReference partRef) {
// ignore
}
}