package no.playtrd.ui; import java.util.Iterator; import no.playtrd.v10.playtrd.ObjectPosition; import no.playtrd.v10.playtrd.Playtrd; import no.playtrd.v10.playtrd.PositionService; import no.playtrd.v10.playtrd.Positioned; import no.playtrd.v10.playtrd.Service; import no.playtrd.v10.playtrd.impl.PlaytrdFactoryImpl; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.edit.command.SetCommand; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.js4emf.ui.AbstractSelectionView; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.widgets.Composite; import org.jscience.geography.coordinates.LatLong; import swingxmap.MapViewContent; public class PositionMapView extends AbstractSelectionView { private MapViewContent mapViewContent; protected boolean isValidSelection(Object o) { return o instanceof EObject; } private EObject getSelectedEObject() { return (EObject) getSelection(); } public final static String playtrdSourceUri = "http://playtrd.no/v10/playtrd.ecore"; public static EAttribute getPositionAttribute(EObject eObject) { for (Iterator<EAttribute> attributes = eObject.eClass().getEAllAttributes().iterator(); attributes.hasNext();) { final EAttribute attrFeature = attributes.next(); String annotation = EcoreUtil.getAnnotation(attrFeature, playtrdSourceUri, "positionFeature"); if (annotation != null) { return attrFeature; } } return null; } private MultiAdapter positionsAdapter = new MultiAdapter() { public void notifyChanged(Notification msg) { mapViewContent.updatePositions(); } }; protected void selectionChanged(ISelection selection) { super.selectionChanged(selection); positionsAdapter.clearTargets(); mapViewContent.clearPositions(); EObject eObject = getSelectedEObject(); if (eObject != null) { addPositions(eObject, -1); } mapViewContent.updatePositions(); } private void addPositions(EObject eObject, int level) { ObjectPosition position = null; if (eObject instanceof ObjectPosition) { position = (ObjectPosition)eObject; } else if (eObject instanceof Positioned) { position = findObjectPosition((Positioned)eObject); } if (position != null) { mapViewContent.addPosition(new ObjectPositionProvider((ObjectPosition)position) { public void setPosition(double latitude, double longitude) { PositionMapView.this.setPosition(getObjectPosition(), latitude, longitude); } }); positionsAdapter.addTarget(position); } else if (level != 0) { for (EObject child: eObject.eContents()) { addPositions(child, level - 1); } } } private ObjectPosition findObjectPosition(Positioned positioned) { EObject eObject = positioned; while (eObject != null) { if (eObject instanceof Playtrd) { for (Service service: ((Playtrd)eObject).getServices()) { if (service instanceof PositionService) { return findObjectPosition((PositionService)service, positioned); } } } eObject = eObject.eContainer(); } return null; } private ObjectPosition findObjectPosition(PositionService positionService, Positioned positioned) { for (ObjectPosition objectPosition: positionService.getObjectPositions()) { if (objectPosition.getPositioned() == positioned) { return objectPosition; } } return null; } private void setPosition(EObject eObject, double lat, double lng) { if (editingDomainProvider != null) { EAttribute attr = getPositionAttribute(eObject); if (attr != null) { EditingDomain editingDomain = editingDomainProvider.getEditingDomain(); LatLong position = PlaytrdFactoryImpl.createLatLong(lat, lng); Command command = new SetCommand(editingDomain, eObject, attr, position); if (command.canExecute()) { editingDomain.getCommandStack().execute(command); } } } } public void createPartControl(final Composite parent) { mapViewContent = new MapViewContent() { protected void updateStatus(final String status) { super.updateStatus(status); parent.getDisplay().asyncExec(new Runnable() { public void run() { getViewSite().getActionBars().getStatusLineManager().setMessage(status); } }); } }; mapViewContent.createControls(parent); } public void setFocus() { mapViewContent.setFocus(); } }