package ui; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import javax.swing.JComponent; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import common.ProofModel; import common.ProofNode; public abstract class AbstractView extends JComponent implements TreeModelListener { protected AbstractNode rootNode; protected ProofModel model = null; public AbstractView() { super (); setFocusable (true); new SettingsGUI (); } public void setModel (ProofModel model) { this.model = model; this.model.addTreeModelListener(this); reloadTree(); relayout(); this.addComponentListener(new ComponentAdapter() { public void componentResized (ComponentEvent event) { doLayouting(); } }); } public void treeNodesChanged(TreeModelEvent e) { relayout(); } public void treeNodesInserted(TreeModelEvent e) { ProofNode pnode = (ProofNode)e.getTreePath().getLastPathComponent(); if (pnode == null) return; AbstractNode node = getNode (pnode); if (node == null) return; Object[] children = e.getChildren(); int[] indices = e.getChildIndices(); // save the last nod that should be inserted // it will be used to determin AbstractNode lastNode = null; if (children.length != indices.length) return; for (int i=0; i<children.length; i++) { AbstractNode aNode = createNode ((ProofNode)children[i]); aNode.setModel(this.model); node.addChildNode(aNode, indices [i]); lastNode = aNode; } relayout(); nodeAdded (lastNode); } public void treeNodesRemoved(TreeModelEvent e) { ProofNode pnode = (ProofNode)e.getTreePath().getLastPathComponent(); if (pnode == null) return; AbstractNode node = getNode (pnode); if (node == null) return; int[] indices = e.getChildIndices(); for (int i=indices.length-1; i >= 0; i--) { node.removeChildNode(indices[i]); } relayout(); } public void treeStructureChanged(TreeModelEvent e) { ProofNode pnode = (ProofNode)e.getTreePath().getLastPathComponent(); if (pnode == null) return; AbstractNode node = getNode (pnode); if (node == null) return; reloadNode (node); } private AbstractNode getNode (ProofNode node) { if (rootNode == null) { reloadTree (); } return getNode (rootNode, node); } private AbstractNode getNode (AbstractNode aNode, ProofNode node) { if (aNode == null) return null; if (aNode.getProofNode() == node) { return aNode; } for (AbstractNode child : aNode.getChildren()) { AbstractNode cNode = getNode (child, node); if (cNode != null) return cNode; } return null; } private void reloadNode (AbstractNode parent, ProofNode node) { for (int i=0; i<node.getChildCount(); i++) { ProofNode pnode = node.getChildAt(i); AbstractNode aNode = createNode (pnode); aNode.setModel(model); parent.addChildNode(aNode, i); reloadNode (aNode, pnode); } } protected void reloadNode (AbstractNode node) { if (node == null) { node = rootNode = createNode(model.getRoot()); if (node != null) node.setModel(model); } // // The nodes have been reloaded previously // I realy don't know why that was needed // // node.removeChildeNodes(); // // // ProofNode pnode = node.getProofNode(); // reloadNode (node, pnode); relayout(); } protected void reloadTree () { reloadNode (null); } public ProofNode getRootNode() { return this.rootNode.getProofNode(); } protected abstract AbstractNode createNode(ProofNode node); protected abstract void relayout(); protected abstract void doLayouting(); protected abstract void nodeAdded (AbstractNode node); }