/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.esa.snap.rcp.actions.file; import com.bc.ceres.core.Assert; import org.esa.snap.core.dataio.dimap.DimapProductReader; import org.esa.snap.core.datamodel.Product; import org.esa.snap.core.datamodel.ProductNode; import org.esa.snap.rcp.SnapApp; import org.esa.snap.rcp.util.Dialogs; import org.netbeans.api.progress.ProgressUtils; import org.openide.awt.ActionID; import org.openide.awt.ActionReference; import org.openide.awt.ActionReferences; import org.openide.awt.ActionRegistration; import org.openide.util.NbBundle; import javax.swing.AbstractAction; import java.awt.event.ActionEvent; import java.io.File; import java.lang.ref.WeakReference; import java.text.MessageFormat; /** * Action which closes a selected product. * * @author Norman */ @ActionID(category = "File", id = "SaveProductAction") @ActionRegistration(displayName = "#CTL_SaveProductActionName") @ActionReferences({ @ActionReference(path = "Menu/File", position = 40, separatorBefore = 38), @ActionReference(path = "Context/Product/Product", position = 90) }) @NbBundle.Messages({"CTL_SaveProductActionName=Save Product"}) public final class SaveProductAction extends AbstractAction{ private WeakReference<ProductNode> productNodeRef; public SaveProductAction(ProductNode productNode) { productNodeRef = new WeakReference<>(productNode); } static Boolean saveProduct(Product product) { Assert.notNull(product.getFileLocation()); final File file = product.getFileLocation(); if (file.isFile() && !file.canWrite()) { Dialogs.showWarning(Bundle.CTL_SaveProductActionName(), MessageFormat.format("The product\n" + "''{0}''\n" + "exists and cannot be overwritten, because it is read only.\n" + "Please choose another file or remove the write protection.", file.getPath()), null); return false; } SnapApp.getDefault().setStatusBarMessage(MessageFormat.format("Writing product ''{0}'' to {1}...", product.getDisplayName(), file)); boolean incremental = true; WriteProductOperation operation = new WriteProductOperation(product, incremental); ProgressUtils.runOffEventThreadWithProgressDialog(operation, Bundle.CTL_SaveProductActionName(), operation.getProgressHandle(), true, 50, 1000); SnapApp.getDefault().setStatusBarMessage(""); return operation.getStatus(); } @Override public void actionPerformed(ActionEvent e) { execute(); } /** * Executes the action command. * * @return {@code Boolean.TRUE} on success, {@code Boolean.FALSE} on failure, or {@code null} on cancellation. */ public Boolean execute() { ProductNode productNode = productNodeRef.get(); if (productNode != null && productNode.getProduct() != null) { Product product = productNode.getProduct(); if (product != null) { if (product.getFileLocation() != null && (product.getProductReader() == null || product.getProductReader() instanceof DimapProductReader)) { return saveProduct(product); } else { // if file location not set, delegate to save-as return new SaveProductAsAction(product).execute(); } } else { // reference was garbage collected, that's fine, no need to save. return true; } } return true; } }