package org.esa.snap.rcp.imgfilter;
import org.esa.snap.core.datamodel.Product;
import org.esa.snap.core.datamodel.ProductNode;
import org.esa.snap.core.util.SystemUtils;
import org.esa.snap.rcp.SnapApp;
import org.esa.snap.rcp.imgfilter.model.Filter;
import org.esa.snap.rcp.imgfilter.model.FilterSet;
import org.esa.snap.rcp.imgfilter.model.StandardFilters;
import org.esa.snap.rcp.util.Dialogs;
import org.esa.snap.ui.ModalDialog;
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
/**
* The dialog that lets users select existing or define new image filters.
*
* @author Norman
*/
public class CreateFilteredBandDialog extends ModalDialog implements FilterSetForm.Listener {
public static final String TITLE = "Create Filtered Band"; /*I18N*/
private final Product product;
private final FilterSetsForm filterSetsForm;
private final FilterSetFileStore filterSetStore;
private List<FilterSet> userFilterSets;
public CreateFilteredBandDialog(Product product, String sourceBandName, String helpId) {
super(SnapApp.getDefault().getMainFrame(),
TITLE,
ModalDialog.ID_OK_CANCEL_HELP,
helpId);
this.product = product;
FilterSet systemFilterSet = new FilterSet("System", false);
systemFilterSet.addFilter("Detect Lines", StandardFilters.LINE_DETECTION_FILTERS);
systemFilterSet.addFilter("Detect Gradients (Emboss)", StandardFilters.GRADIENT_DETECTION_FILTERS);
systemFilterSet.addFilter("Smooth and Blurr", StandardFilters.SMOOTHING_FILTERS);
systemFilterSet.addFilter("Sharpen", StandardFilters.SHARPENING_FILTERS);
systemFilterSet.addFilter("Enhance Discontinuities", StandardFilters.LAPLACIAN_FILTERS);
systemFilterSet.addFilter("Non-Linear Filters", StandardFilters.NON_LINEAR_FILTERS);
systemFilterSet.addFilter("Morphological Filters", StandardFilters.MORPHOLOGICAL_FILTERS);
filterSetStore = new FilterSetFileStore(getFiltersDir());
try {
userFilterSets = filterSetStore.loadFilterSetModels();
} catch (IOException e) {
userFilterSets = new ArrayList<>();
Dialogs.showError(TITLE, "Failed to load filter sets:\n" + e.getMessage());
SystemUtils.LOG.log(Level.WARNING, "Failed to load filter sets", e);
}
ArrayList<FilterSet> filterSets = new ArrayList<>();
filterSets.add(systemFilterSet);
if (userFilterSets.isEmpty()) {
userFilterSets.add(new FilterSet("User", true));
}
filterSets.addAll(userFilterSets);
filterSetsForm = new FilterSetsForm(sourceBandName,
this,
filterSetStore, new FilterWindow(getJDialog()),
filterSets.toArray(new FilterSet[filterSets.size()]));
setContent(filterSetsForm);
}
@Override
protected void onOK() {
super.onOK();
for (FilterSet userFilterSet : userFilterSets) {
userFilterSet.setEditable(true);
try {
filterSetStore.storeFilterSetModel(userFilterSet);
} catch (IOException e) {
Dialogs.showError(TITLE, "Failed to store filter sets:\n" + e.getMessage());
}
}
}
public DialogData getDialogData() {
return new DialogData(filterSetsForm.getSelectedFilter(), filterSetsForm.getTargetBandName(), filterSetsForm.getIterationCount());
}
@Override
protected boolean verifyUserInput() {
String message = null;
final String targetBandName = filterSetsForm.getTargetBandName();
if (targetBandName.equals("")) {
message = "Please enter a name for the new filtered band."; /*I18N*/
} else if (!ProductNode.isValidNodeName(targetBandName)) {
message = MessageFormat.format("The band name ''{0}'' appears not to be valid.\n" +
"Please choose a different band name.", targetBandName); /*I18N*/
} else if (product.containsBand(targetBandName)) {
message = MessageFormat.format("The selected product already contains a band named ''{0}''.\n" +
"Please choose a different band name.", targetBandName); /*I18N*/
} else if (filterSetsForm.getSelectedFilter() == null) {
message = "Please select an image filter."; /*I18N*/
}
if (message != null) {
Dialogs.showError(TITLE, message);
return false;
}
return true;
}
@Override
public void filterSelected(FilterSet filterSet, Filter filter) {
//System.out.println("filterModelSelected: filterModel = " + filter);
}
@Override
public void filterAdded(FilterSet filterSet, Filter filter) {
//System.out.println("filterModelAdded: filterModel = " + filter);
}
@Override
public void filterRemoved(FilterSet filterSet, Filter filter) {
//System.out.println("filterModelRemoved: filterModel = " + filter);
}
@Override
public void filterChanged(FilterSet filterSet, Filter filter, String propertyName) {
//System.out.println("filterModelChanged: filterModel = " + filter + ", propertyName = \"" + propertyName + "\"");
}
private File getFiltersDir() {
return new File(SystemUtils.getAuxDataPath().toFile(), "image_filters");
}
public static class DialogData {
private final Filter filter;
private final String bandName;
private final int iterationCount;
private DialogData(Filter filter, String bandName, int iterationCount) {
this.filter = filter;
this.bandName = bandName;
this.iterationCount = iterationCount;
}
public String getBandName() {
return bandName;
}
public Filter getFilter() {
return filter;
}
public int getIterationCount() {
return iterationCount;
}
}
}