package com.vividsolutions.jump.workbench.ui.plugin; import java.util.ArrayList; import java.util.Iterator; import javax.swing.JOptionPane; import com.vividsolutions.jump.coordsys.CoordinateSystem; import com.vividsolutions.jump.coordsys.CoordinateSystemRegistry; import com.vividsolutions.jump.coordsys.Reprojector; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.plugin.AbstractPlugIn; import com.vividsolutions.jump.workbench.plugin.PlugInContext; import com.vividsolutions.jump.workbench.ui.EditTransaction; /** * Implements a {@link com.vividsolutions.jump.workbench.plugin.PlugIn} * that allows the user to change coordinate systems. * */ public class ChangeCoordinateSystemPlugIn extends AbstractPlugIn { public boolean execute(PlugInContext context) throws Exception { //Don't make this plug-in undoable -- it's a lot of data to store in memory [Jon Aquino] context.getLayerManager().getUndoableEditReceiver() .reportIrreversibleChange(); CoordinateSystem destination = (CoordinateSystem) JOptionPane .showInputDialog(context.getWorkbenchFrame(), "Coordinate system for task:", getName(), JOptionPane.PLAIN_MESSAGE, null, new ArrayList( CoordinateSystemRegistry .instance(context.getWorkbenchContext() .getBlackboard()) .getCoordinateSystems()) .toArray(), context.getLayerManager().getCoordinateSystem()); if (destination == null) { return false; } if (context.getLayerManager().getCoordinateSystem() == destination) { return true; } if (Reprojector.instance().wouldChangeValues(context.getLayerManager() .getCoordinateSystem(), destination)) { //Two-phase commit [Jon Aquino] ArrayList transactions = new ArrayList(); for (Iterator i = context.getLayerManager().iterator(); i.hasNext();) { Layer layer = (Layer) i.next(); EditTransaction transaction = new EditTransaction(layer.getFeatureCollectionWrapper() .getFeatures(), getName(), layer, isRollingBackInvalidEdits(context), false, context.getLayerViewPanel()); for (int j = 0; j < transaction.size(); j++) { Reprojector.instance().reproject(transaction.getGeometry(j), context.getLayerManager().getCoordinateSystem(), destination); } transactions.add(transaction); } EditTransaction.commit(transactions); } for (Iterator i = context.getLayerManager().iterator(); i.hasNext();) { Layer layer = (Layer) i.next(); layer.getFeatureCollectionWrapper().getFeatureSchema() .setCoordinateSystem(destination); } context.getLayerManager().setCoordinateSystem(destination); if (context.getLayerViewPanel() != null) { context.getLayerViewPanel().getViewport().zoomToFullExtent(); } return true; } }