/*
* 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.Product;
import org.esa.snap.core.datamodel.ProductManager;
import org.esa.snap.core.datamodel.ProductNodeListener;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* A node that represents a {@link Product} (=P).
* Every {@code PNode} holds a dedicated undo/redo context.
*
* @author Norman
*/
public class ProductGroupNode extends AbstractNode {
private final ProductManager productManager;
private final PGroup group;
private final Map<Product, ProductNodeListener> productNodeListenerMap;
public ProductGroupNode(ProductManager productManager) {
super(Children.LEAF);
Assert.notNull(productManager, "productManager");
this.productManager = productManager;
this.group = new PGroup();
this.productNodeListenerMap = new HashMap<>();
setChildren(Children.create(group, false));
setDisplayName("Products");
productManager.addListener(new ProductManager.Listener() {
@Override
public void productAdded(ProductManager.Event event) {
group.refresh();
}
@Override
public void productRemoved(ProductManager.Event event) {
uninstallListener(event.getProduct());
group.refresh();
}
});
}
private void installListener(PNode node) {
Product newProduct = node.getProduct();
newProduct.addProductNodeListener(node);
productNodeListenerMap.put(newProduct, node);
}
private void uninstallListener(Product oldProduct) {
ProductNodeListener productNodeListener = productNodeListenerMap.remove(oldProduct);
if (productNodeListener != null) {
oldProduct.removeProductNodeListener(productNodeListener);
}
}
class PGroup extends PNGroupBase<Product> {
@Override
protected boolean createKeys(List<Product> list) {
list.addAll(Arrays.asList(productManager.getProducts()));
return true;
}
@Override
protected Node createNodeForKey(Product key) {
PNode node = new PNode(key);
installListener(node);
return node;
}
}
}