package at.oefai.aaa.animation;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Window;

import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.swing.svg.SVGUserAgent;

/**
 * just extends the JSVGCanvas to eliminate unnecessary packing.
 * adapted from a tip found on the batik mailinglist
 * @author Stefan Rank
 */
public class JNoPackSVGCanvas extends JSVGCanvas {

    public JNoPackSVGCanvas() {
        this(null, true, true); // standard creation
    }

    public JNoPackSVGCanvas(final SVGUserAgent ua, final boolean eventsEnabled, final boolean selectableText) {
        super(ua, eventsEnabled, selectableText);
        this.setBackground(Color.black);
    }

    /**
      * Diese Methode wird im Constructor von JGVTComponent aufgerufen und soll
      * einen Listener fur Maus und GVTTreeRenderer erzeugen.
      * Damit der eigene Listener verwendet wird muss diese Methode
      * uberschrieben werden.
      */
     protected final Listener createListener() {
         return new ScrollableCanvasSVGListener();
     }

     /**
      * To hide the listener methods. This class just reset the tooltip.
      * Diese Klasse ist nur uberschrieben im Zusammenhang mit der Methode
      * createListener
      * Das Problem des nicht erwunschten Vergrossern des Frames lag hier in der
      * Anwendung der pack()-Methode.
      * Dieser Aufruf fuhrt zu einer Neuberechnung der erforderlichen
      * fenstergroesze. Durch den Aufruf von validate werden die
      * preferredSize-Werte angepasst und das Fenster nicht vergrossert.
      */
     protected class ScrollableCanvasSVGListener extends CanvasSVGListener {
         public final void setMySize(final Dimension d) {
             setPreferredSize(d);
             invalidate();
             Container p = getParent();
             while (p != null) {
                 if (p instanceof Window) {
                     Window w = (Window) p;
                     w.validate(); // im Orignial wurde hier pack() aufgerufen
                     break;
                 }
                 p = p.getParent();
             }
         }
     }

}
