package de.unisiegen.tpml.graphics; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JComponent; import javax.swing.SwingUtilities; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import de.unisiegen.tpml.core.AbstractProofModel; import de.unisiegen.tpml.core.languages.LanguageTranslator; import de.unisiegen.tpml.core.util.Theme ; public abstract class AbstractProofComponent extends JComponent { /** * */ private static final long serialVersionUID = 4038129211367836077L; protected AbstractProofModel proofModel; protected LanguageTranslator translator; protected boolean currentlyLayouting; protected int availableWidth; /** * this is only needed when printing. The availableHeight stands for the height available eache side and comes form * the dialoge from the gui */ protected int availableHeight; /** * to place the singel components on the singel pages */ protected int actualPageSpaceCounter=0; private Theme theme; public AbstractProofComponent (AbstractProofModel proofModel) { super (); // if nobody is printing prevent pagebreak by setting the availableHeight to Integer.MAX_VALUE; this.availableHeight = Integer.MAX_VALUE; this.proofModel = proofModel; this.currentlyLayouting = false; this.translator = this.proofModel.getLanguage().newTranslator(); this.proofModel.addTreeModelListener(new TreeModelListener() { public void treeNodesChanged (TreeModelEvent e) { AbstractProofComponent.this.nodesChanged(e); AbstractProofComponent.this.relayout (); } public void treeNodesInserted (TreeModelEvent e) { AbstractProofComponent.this.nodesInserted (e); AbstractProofComponent.this.treeContentChanged (); } public void treeNodesRemoved (TreeModelEvent e) { AbstractProofComponent.this.nodesRemoved (e); AbstractProofComponent.this.treeContentChanged (); } public void treeStructureChanged (TreeModelEvent e) { AbstractProofComponent.this.treeContentChanged (); } }); // reset the layout whenever the font changes this.theme = Theme.currentTheme(); this.theme.addPropertyChangeListener("font", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { SwingUtilities.invokeLater(new Runnable() { public void run() { resetLayout(); relayout(); } }); } }); } protected abstract void nodesInserted (TreeModelEvent event); protected abstract void nodesChanged (TreeModelEvent event); protected abstract void nodesRemoved (TreeModelEvent event); protected abstract void treeContentChanged (); protected abstract void relayout (); protected abstract void forcedRelayout(); protected abstract void resetLayout (); public void setAvailableWidth (int availableWidth) { this.availableWidth = availableWidth; relayout(); } /** * set the availableHeight. It is used while printing. * * @param pAvailableHeight */ public void setAvailableHeight (int pAvailableHeight) { this.availableHeight = pAvailableHeight; // the relayout must be performed immediately forcedRelayout(); } /** * resets the availableHeight * * @param pAvailableHeight */ public void resetAvailableHeight () { this.availableHeight = Integer.MAX_VALUE; // TODO test //forcedRelayout(); relayout(); } /** * @param currentlyLayouting the currentlyLayouting to set */ public void setCurrentlyLayouting(boolean currentlyLayouting) { this.currentlyLayouting = currentlyLayouting; } /** * @return the proofModel */ public AbstractProofModel getProofModel() { return this.proofModel; } /** * @return the availableWidth */ public int getAvailableWidth() { return this.availableWidth; } /** * @return the availableHeight */ public int getAvailableHeight() { return this.availableHeight; } }