/*
* 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.nodes;
import com.bc.ceres.core.Assert;
import org.esa.snap.core.datamodel.Band;
import org.esa.snap.core.datamodel.FlagCoding;
import org.esa.snap.core.datamodel.IndexCoding;
import org.esa.snap.core.datamodel.Mask;
import org.esa.snap.core.datamodel.MetadataElement;
import org.esa.snap.core.datamodel.Product;
import org.esa.snap.core.datamodel.ProductNode;
import org.esa.snap.core.datamodel.ProductNodeGroup;
import org.esa.snap.core.datamodel.quicklooks.Quicklook;
import org.esa.snap.core.datamodel.TiePointGrid;
import org.esa.snap.core.datamodel.VectorDataNode;
import org.openide.nodes.Node;
import org.openide.util.NbBundle;
import java.util.List;
/**
* A group that gets its nodes from a {@link ProductNodeGroup} (=PNG).
*
* @author Norman
*/
@NbBundle.Messages({
"LBL_MetadataGroupName=Metadata",
"LBL_FlagCodingGroupName=Flag Codings",
"LBL_IndexCodingGroupName=Index Codings",
"LBL_VectorDataGroupName=Vector Data",
"LBL_QuicklookGroupName=Quicklooks",
})
abstract class PNGGroup<T extends ProductNode> extends PNGroup<T> {
private final String displayName;
private final ProductNodeGroup<T> group;
protected PNGGroup(String displayName, ProductNodeGroup<T> group) {
Assert.notNull(group, "group");
this.displayName = displayName;
this.group = group;
}
@Override
public Product getProduct() {
return group.getProduct();
}
@Override
public String getDisplayName() {
return displayName;
}
@Override
boolean isDirectChild(ProductNode productNode) {
int nodeCount = group.getNodeCount();
for (int i = 0; i < nodeCount; i++) {
if (group.get(i) == productNode) {
return true;
}
}
return false;
}
@Override
protected boolean createKeys(List<T> list) {
int nodeCount = group.getNodeCount();
for (int i = 0; i < nodeCount; i++) {
list.add(group.get(i));
}
return true;
}
@Override
protected abstract Node createNodeForKey(T key);
public static class B extends PNGGroup<Band> {
private final Product product;
private final ProductNodeGroup<Band> group;
public B(String displayName, ProductNodeGroup<Band> group, Product product) {
super(displayName, group);
this.product = product;
this.group = group;
}
@Override
protected PNNode createNodeForKey(Band key) {
return new PNNode.B(key);
}
@Override
void refresh() {
refreshGroup();
super.refresh();
}
private void refreshGroup() {
final ProductNodeGroup<Band> productBandGroup = product.getBandGroup();
if (group != productBandGroup) {
final Product.AutoGrouping autoGrouping = product.getAutoGrouping();
if (autoGrouping != null) {
final int groupIndex = autoGrouping.indexOf(group.getDisplayName());
group.removeAll();
for (int i = 0; i < productBandGroup.getNodeCount(); i++) {
final Band band = productBandGroup.get(i);
if (autoGrouping.indexOf(band.getName()) == groupIndex) {
group.add(band);
}
}
}
}
}
@Override
public Product getProduct() {
return product;
}
}
public static class TPG extends PNGGroup<TiePointGrid> {
private final Product product;
private final ProductNodeGroup<TiePointGrid> group;
public TPG(String displayName, ProductNodeGroup<TiePointGrid> group, Product product) {
super(displayName, group);
this.product = product;
this.group = group;
}
@Override
protected PNNode createNodeForKey(TiePointGrid key) {
return new PNNode.TPG(key);
}
@Override
void refresh() {
refreshGroup();
super.refresh();
}
private void refreshGroup() {
final ProductNodeGroup<TiePointGrid> productTiePointGridGroup = product.getTiePointGridGroup();
if (group != productTiePointGridGroup) {
final Product.AutoGrouping autoGrouping = product.getAutoGrouping();
if (autoGrouping != null) {
final int groupIndex = autoGrouping.indexOf(group.getDisplayName());
group.removeAll();
for (int i = 0; i < productTiePointGridGroup.getNodeCount(); i++) {
final TiePointGrid tiePointGrid = productTiePointGridGroup.get(i);
if (autoGrouping.indexOf(tiePointGrid.getName()) == groupIndex) {
group.add(tiePointGrid);
}
}
}
}
}
@Override
public Product getProduct() {
return product;
}
}
public static class VDN extends PNGGroup<VectorDataNode> {
public VDN(ProductNodeGroup<VectorDataNode> group) {
super(Bundle.LBL_VectorDataGroupName(), group);
}
@Override
protected PNNode createNodeForKey(VectorDataNode key) {
return new PNNode.VDN(key);
}
}
public static class M extends PNGGroup<Mask> {
private final Product product;
private final ProductNodeGroup<Mask> group;
public M(String displayName, ProductNodeGroup<Mask> group, Product product) {
super(displayName, group);
this.product = product;
this.group = group;
}
@Override
protected PNNode createNodeForKey(Mask key) {
return new PNNode.M(key);
}
@Override
void refresh() {
refreshGroup();
super.refresh();
}
private void refreshGroup() {
final ProductNodeGroup<Mask> productMaskGroup = product.getMaskGroup();
if (group != productMaskGroup) {
final Product.AutoGrouping autoGrouping = product.getAutoGrouping();
if (autoGrouping != null) {
final int groupIndex = autoGrouping.indexOf(group.getDisplayName());
group.removeAll();
for (int i = 0; i < productMaskGroup.getNodeCount(); i++) {
final Mask mask = productMaskGroup.get(i);
if (autoGrouping.indexOf(mask.getName()) == groupIndex) {
group.add(mask);
}
}
}
}
}
@Override
public Product getProduct() {
return product;
}
}
public static class FC extends PNGGroup<FlagCoding> {
public FC(ProductNodeGroup<FlagCoding> group) {
super(Bundle.LBL_FlagCodingGroupName(), group);
}
@Override
protected PNNode createNodeForKey(FlagCoding key) {
return new PNNode.FC(key);
}
}
public static class IC extends PNGGroup<IndexCoding> {
public IC(ProductNodeGroup<IndexCoding> group) {
super(Bundle.LBL_IndexCodingGroupName(), group);
}
@Override
protected PNNode createNodeForKey(IndexCoding key) {
return new PNNode.IC(key);
}
}
public static class ME extends PNGGroup<MetadataElement> {
public ME(ProductNodeGroup<MetadataElement> group) {
super(Bundle.LBL_MetadataGroupName(), group);
}
@Override
protected PNNode createNodeForKey(MetadataElement key) {
return new PNNode.ME(key);
}
}
public static class QL extends PNGGroup<Quicklook> {
public QL(ProductNodeGroup<Quicklook> group) {
super(Bundle.LBL_QuicklookGroupName(), group);
}
@Override
protected PNNode createNodeForKey(Quicklook key) {
return new PNNode.QL(key);
}
}
}