package org.simantics.interop.update.model; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.eclipse.jface.resource.ImageDescriptor; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.common.utils.NameUtils; import org.simantics.db.exception.DatabaseException; import org.simantics.layer0.Layer0; public class UpdateNode { private UpdateNode parent; private UpdateStatus status; private UpdateOp op; private Resource r; private String label; private boolean visible = true; private List children; /** * * @param resource old Resource if status is DELETED or EXISTS. * @param status * @param changes */ public UpdateNode(ReadGraph g, UpdateStatus status, UpdateOp op) throws DatabaseException{ this.status = status; this.op = op; this.r = op.getResource(); init(g); } public UpdateNode(ReadGraph g, UpdateStatus status, Resource r) throws DatabaseException { this.status = status; this.op = null; this.r = r; init(g); } protected void init(ReadGraph g) throws DatabaseException { this.label = getLabel(g, r); } public Resource getResource() { return r; } public Resource getParentResource(ReadGraph g) throws DatabaseException { if (op != null) { Resource parent = op.getParentResource(g); if (parent != null) return parent; } Layer0 l0 = Layer0.getInstance(g); return g.getPossibleObject(r, l0.PartOf); } public void setStatus(UpdateStatus status) { this.status = status; } public UpdateStatus getStatus() { return status; } @SuppressWarnings("unchecked") public List getChildren() { if (children == null) return Collections.EMPTY_LIST; return children; } public void addChild(UpdateNode node) { if (children == null) children = new ArrayList(2); children.add(node); node.parent = this; if (op != null && node.op != null) { if (!op.getSubOps().contains(node.op)) { op.addSubOp(node.op); node.op.addParentOp(op); } } } public void sort() { if (children == null) return; Collections.sort(this.children, new Comparator() { @Override public int compare(UpdateNode o1, UpdateNode o2) { return o1.getLabel().compareTo(o2.getLabel()); } }); } public ImageDescriptor getImage(ReadGraph graph) throws DatabaseException { return null; } public String getLabel() { return label; } @Override public String toString() { return label; } protected String getLabel(ReadGraph graph, Resource r) throws DatabaseException { String label = NameUtils.getSafeLabel(graph, r); if (label.length() == 0) label = NameUtils.getSafeName(graph, r); return label; } public UpdateOp getOp() { return op; } public boolean isVisible() { return visible; } public void setVisible(boolean visible) { this.visible = visible; if (op != null) op.visible = visible; if (visible) { if (parent != null && !parent.visible) parent.setVisible(true); } else { if (children != null) for (UpdateNode n : children) n.setVisible(false); } } public void setAllVisible(boolean visible) { this.visible = visible; if (op != null) op.visible = visible; if (children != null) for (UpdateNode n : children) n.setAllVisible(visible); } }