/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.commons.cismap.io; import org.apache.log4j.Logger; import org.openide.util.NbBundle; import org.openide.util.WeakListeners; import java.awt.EventQueue; import java.util.concurrent.TimeUnit; import javax.swing.JPanel; import javax.swing.SwingWorker; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import de.cismet.cismap.commons.CrsTransformer; import de.cismet.cismap.commons.XBoundingBox; import de.cismet.cismap.commons.features.Feature; import de.cismet.cismap.commons.features.PureNewFeature; import de.cismet.cismap.commons.gui.MappingComponent; import de.cismet.cismap.commons.gui.layerwidget.ActiveLayerModel; import de.cismet.cismap.commons.raster.wms.simple.SimpleWMS; import de.cismet.cismap.commons.raster.wms.simple.SimpleWmsGetMapUrl; import de.cismet.commons.concurrency.CismetConcurrency; /** * DOCUMENT ME! * * @author mscholl * @version 1.0 */ public class AddGeometriesToMapPreviewVisualPanel extends JPanel { //~ Static fields/initializers --------------------------------------------- /** LOGGER. */ private static final transient Logger LOG = Logger.getLogger(AddGeometriesToMapPreviewVisualPanel.class); //~ Instance fields -------------------------------------------------------- private final transient AddGeometriesToMapPreviewWizardPanel model; private final transient ChangeListener modelChangeL; // Variables declaration - do not modify//GEN-BEGIN:variables private final transient javax.swing.JPanel pnlPreview = new javax.swing.JPanel(); private final transient de.cismet.commons.gui.progress.BusyStatusPanel pnlStatus = new de.cismet.commons.gui.progress.BusyStatusPanel(); private final transient de.cismet.cismap.commons.gui.MappingComponent previewMap = new de.cismet.cismap.commons.gui.MappingComponent(); // End of variables declaration//GEN-END:variables //~ Constructors ----------------------------------------------------------- /** * Creates new form AddGeometriesToMapPreviewVisualPanel. * * @param model DOCUMENT ME! */ public AddGeometriesToMapPreviewVisualPanel(final AddGeometriesToMapPreviewWizardPanel model) { this.model = model; initComponents(); modelChangeL = new ModelChangeListener(); model.addChangeListener(WeakListeners.change(modelChangeL, model)); this.setName(NbBundle.getMessage( AddGeometriesToMapPreviewVisualPanel.class, "AddGeometriesToMapPreviewVisualPanel.<init>(AddGeometryToMapPreviewWizardPanel).panelName")); // NOI18N } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public AddGeometriesToMapPreviewWizardPanel getModel() { return model; } /** * DOCUMENT ME! */ private void initMap() { // map is locked final double buffer; if (model.getCurrentCrs().isMetric()) { buffer = 5.0; } else { buffer = 0.001; } // TODO: use proper executor CismetConcurrency.getInstance("cismap-commons") // NOI18N .getDefaultExecutor().execute(new SwingWorker<XBoundingBox, Void>() { @Override protected XBoundingBox doInBackground() throws Exception { Thread.currentThread().setName("AddGeometriesToMapPreviewVisualPanel initMap()"); try { // home bbox for the current crs final XBoundingBox box = new XBoundingBox( model.getGeometry().getEnvelope().buffer(buffer)); final CrsTransformer transformer = new CrsTransformer(model.getCurrentCrs().getCode()); return transformer.transformBoundingBox(box); } catch (final Exception e) { LOG.warn( "cannot create home bbox for current crs, preview most likely without background layer", // NOI18N e); return null; } } @Override protected void done() { XBoundingBox homeBbox = null; try { homeBbox = get(300, TimeUnit.MILLISECONDS); } catch (final Exception ex) { LOG.warn("cannot retrieve home boundingbox, preview unusable", ex); // NOI18N } final XBoundingBox box = new XBoundingBox(model.getGeometry().getEnvelope().buffer(buffer)); final ActiveLayerModel mappingModel = (ActiveLayerModel)previewMap.getMappingModel(); mappingModel.setSrs(model.getCurrentCrs()); mappingModel.addHome(box); if (homeBbox != null) { mappingModel.addHome(homeBbox); } final String previewUrl = model.getPreviewUrl(); // background map cannot be initialised without proper url if (previewUrl != null) { final SimpleWMS swms = new SimpleWMS(new SimpleWmsGetMapUrl(previewUrl)); swms.setName("background"); // NOI18N mappingModel.addLayer(swms); } final Feature dsf = new PureNewFeature(model.getGeometry()); previewMap.setMappingModel(mappingModel); previewMap.setAnimationDuration(0); previewMap.gotoInitialBoundingBox(); previewMap.setInteractionMode(MappingComponent.ZOOM); previewMap.setInteractionMode("MUTE"); // NOI18N previewMap.getFeatureCollection().addFeature(dsf); previewMap.setAnimationDuration(300); // finally when all configurations are done the map may animate again previewMap.unlock(); previewMap.zoomToFeatureCollection(); } }); } /** * DOCUMENT ME! */ private void clearMap() { assert EventQueue.isDispatchThread() : "may only be accessed in EDT"; // NOI18N previewMap.getFeatureCollection().removeAllFeatures(); final ActiveLayerModel mappingModel = new ActiveLayerModel(); previewMap.setMappingModel(mappingModel); previewMap.lock(); } /** * This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The * content of this method is always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; setOpaque(false); setLayout(new java.awt.GridBagLayout()); pnlPreview.setBorder(javax.swing.BorderFactory.createTitledBorder( NbBundle.getMessage( AddGeometriesToMapPreviewVisualPanel.class, "AddGeometriesToMapPreviewVisualPanel.pnlPreview.border.title"))); // NOI18N pnlPreview.setOpaque(false); pnlPreview.setLayout(new java.awt.BorderLayout()); pnlPreview.add(previewMap, java.awt.BorderLayout.CENTER); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); add(pnlPreview, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); add(pnlStatus, gridBagConstraints); } // </editor-fold>//GEN-END:initComponents //~ Inner Classes ---------------------------------------------------------- /** * DOCUMENT ME! * * @version 1.0 */ // TODO: use property change listener for more fine grained control private final class ModelChangeListener implements ChangeListener { //~ Methods ------------------------------------------------------------ @Override public void stateChanged(final ChangeEvent e) { // maybe we should use propertychangelistener to be able to specifically react to updates if (e.getSource() instanceof AddGeometriesToMapPreviewWizardPanel) { pnlStatus.setBusy(model.isBusy()); pnlStatus.setStatusMessage(model.getStatusMessage()); // TODO proper initialisation so that overview is loaded and zoom is done here if (model.getGeometry() == null) { clearMap(); } else { // do zoom to geometry instead of init initMap(); } } } } }