/*
* 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.Mask;
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.TiePointGrid;
import org.openide.nodes.Node;
import org.openide.util.NbBundle;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* A group that gets its nodes from a {@link ProductNodeGroup} (=PNG)
* and can have a {@link ProductNodeGroup} as child
*
* @author Tonio Fincke
*/
@NbBundle.Messages({
"LBL_TiePointGroupName=Tie-Point Grids",
"LBL_BandGroupName=Bands",
"LBL_MaskGroupName=Masks",
})
abstract class PNGroupingGroup extends PNGroup<Object> {
private final String displayName;
private final ProductNodeGroup group;
List<Node> nodes;
Map<String, Boolean> nodesAreSelected;
protected PNGroupingGroup(String displayName, ProductNodeGroup group) {
Assert.notNull(group, "group");
this.displayName = displayName;
this.group = group;
nodes = new ArrayList<>();
nodesAreSelected = new HashMap<>();
}
@Override
public Product getProduct() {
return group.getProduct();
}
@Override
public String getDisplayName() {
return displayName;
}
@Override
boolean isDirectChild(ProductNode productNode) {
return group.contains(productNode);
}
@Override
void refresh() {
for (Node node : nodes) {
nodesAreSelected.put(node.getDisplayName(), NodeExpansionManager.isNodeExpanded(node));
}
nodes.clear();
super.refresh();
for (Node node : nodes) {
if (nodesAreSelected.containsKey(node.getDisplayName()) && nodesAreSelected.get(node.getDisplayName())) {
NodeExpansionManager.expandNode(node);
}
}
nodesAreSelected.clear();
}
@Override
boolean shallReactToPropertyChange(String propertyName) {
return propertyName.equals("autoGrouping");
}
/**
* A group that represents a {@link ProductNodeGroup}
* of {@link Band} members
*
* @author Tonio
*/
static class B extends PNGroupingGroup {
private final ProductNodeGroup<Band> group;
protected B(ProductNodeGroup<Band> group) {
super(Bundle.LBL_BandGroupName(), group);
this.group = group;
}
@Override
protected Node createNodeForKey(Object key) {
if (key instanceof Band) {
return new PNNode.B((Band) key);
} else {
final PNGroupNode pnGroupNode = new PNGroupNode((PNGroup) key);
nodes.add(pnGroupNode);
return pnGroupNode;
}
}
@Override
protected boolean createKeys(List<Object> list) {
final Product.AutoGrouping autoGrouping = getProduct().getAutoGrouping();
if (autoGrouping == null) {
for (int i = 0; i < group.getNodeCount(); i++) {
list.add(group.get(i));
}
return true;
}
ProductNodeGroup<Band>[] autogroupingNodes = new ProductNodeGroup[autoGrouping.size() + 1];
for (int i = 0; i < autoGrouping.size(); i++) {
autogroupingNodes[i] = new ProductNodeGroup<>(autoGrouping.get(i)[0]);
}
autogroupingNodes[autoGrouping.size()] = new ProductNodeGroup<>(Bundle.LBL_BandGroupName());
for (int i = 0; i < this.group.getNodeCount(); i++) {
final Band band = this.group.get(i);
final int index = autoGrouping.indexOf(band.getName());
if (index != -1) {
autogroupingNodes[index].add(band);
} else {
autogroupingNodes[autoGrouping.size()].add(band);
}
}
for (int i = 0; i < autoGrouping.size(); i++) {
if (autogroupingNodes[i].getNodeCount() > 0) {
list.add(new PNGGroup.B(autoGrouping.get(i)[0], autogroupingNodes[i], getProduct()));
}
}
for (int i = 0; i < autogroupingNodes[autoGrouping.size()].getNodeCount(); i++) {
list.add(autogroupingNodes[autoGrouping.size()].get(i));
}
return true;
}
}
/**
* A group that represents a {@link ProductNodeGroup}
* of {@link TiePointGrid} members
*
* @author Tonio
*/
static class TPG extends PNGroupingGroup {
private final ProductNodeGroup<TiePointGrid> group;
protected TPG(ProductNodeGroup<TiePointGrid> group) {
super(Bundle.LBL_TiePointGroupName(), group);
this.group = group;
}
@Override
protected Node createNodeForKey(Object key) {
if (key instanceof TiePointGrid) {
return new PNNode.TPG((TiePointGrid) key);
} else {
final PNGroupNode pnGroupNode = new PNGroupNode((PNGroup) key);
nodes.add(pnGroupNode);
return pnGroupNode;
}
}
@Override
protected boolean createKeys(List<Object> list) {
final Product.AutoGrouping autoGrouping = getProduct().getAutoGrouping();
if (autoGrouping == null) {
for (int i = 0; i < group.getNodeCount(); i++) {
list.add(group.get(i));
}
return true;
}
ProductNodeGroup<TiePointGrid>[] autogroupingNodes = new ProductNodeGroup[autoGrouping.size() + 1];
for (int i = 0; i < autoGrouping.size(); i++) {
autogroupingNodes[i] = new ProductNodeGroup<>(autoGrouping.get(i)[0]);
}
autogroupingNodes[autoGrouping.size()] = new ProductNodeGroup<>(Bundle.LBL_TiePointGroupName());
for (int i = 0; i < this.group.getNodeCount(); i++) {
final TiePointGrid tiePointGrid = this.group.get(i);
final int index = autoGrouping.indexOf(tiePointGrid.getName());
if (index != -1) {
autogroupingNodes[index].add(tiePointGrid);
} else {
autogroupingNodes[autoGrouping.size()].add(tiePointGrid);
}
}
for (int i = 0; i < autoGrouping.size(); i++) {
if (autogroupingNodes[i].getNodeCount() > 0) {
list.add(new PNGGroup.TPG(autoGrouping.get(i)[0], autogroupingNodes[i], getProduct()));
}
}
for (int i = 0; i < autogroupingNodes[autoGrouping.size()].getNodeCount(); i++) {
list.add(autogroupingNodes[autoGrouping.size()].get(i));
}
return true;
}
}
/**
* A group that represents a {@link ProductNodeGroup}
* of {@link Mask} members
*
* @author Tonio
*/
static class M extends PNGroupingGroup {
private final ProductNodeGroup<Mask> group;
protected M(ProductNodeGroup<Mask> group) {
super(Bundle.LBL_MaskGroupName(), group);
this.group = group;
}
@Override
protected Node createNodeForKey(Object key) {
if (key instanceof Mask) {
return new PNNode.M((Mask) key);
} else {
final PNGroupNode pnGroupNode = new PNGroupNode((PNGroup) key);
nodes.add(pnGroupNode);
return pnGroupNode;
}
}
@Override
protected boolean createKeys(List<Object> list) {
final Product.AutoGrouping autoGrouping = getProduct().getAutoGrouping();
if (autoGrouping == null) {
for (int i = 0; i < group.getNodeCount(); i++) {
list.add(group.get(i));
}
return true;
}
ProductNodeGroup<Mask>[] autogroupingNodes = new ProductNodeGroup[autoGrouping.size() + 1];
for (int i = 0; i < autoGrouping.size(); i++) {
autogroupingNodes[i] = new ProductNodeGroup<>(autoGrouping.get(i)[0]);
}
autogroupingNodes[autoGrouping.size()] = new ProductNodeGroup<>(Bundle.LBL_MaskGroupName());
for (int i = 0; i < this.group.getNodeCount(); i++) {
final Mask mask = this.group.get(i);
final int index = autoGrouping.indexOf(mask.getName());
if (index != -1) {
autogroupingNodes[index].add(mask);
} else {
autogroupingNodes[autoGrouping.size()].add(mask);
}
}
for (int i = 0; i < autoGrouping.size(); i++) {
if (autogroupingNodes[i].getNodeCount() > 0) {
list.add(new PNGGroup.M(autoGrouping.get(i)[0], autogroupingNodes[i], getProduct()));
}
}
for (int i = 0; i < autogroupingNodes[autoGrouping.size()].getNodeCount(); i++) {
list.add(autogroupingNodes[autoGrouping.size()].get(i));
}
return true;
}
}
}