com.kitfox.svg.app.beans.SVGPanel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of svgSalamander Show documentation
Show all versions of svgSalamander Show documentation
A tool for displaying and playing SVG content using the Java2D.
/*
* SVG Salamander
* Copyright (c) 2004, Mark McKay
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Mark McKay can be contacted at [email protected]. Salamander and other
* projects can be found at http://www.kitfox.com
*
* Created on April 21, 2005, 10:43 AM
*/
package com.kitfox.svg.app.beans;
import com.kitfox.svg.*;
import java.awt.*;
import java.awt.geom.*;
import java.net.*;
import javax.swing.*;
/**
*
* @author kitfox
*/
public class SVGPanel extends JPanel
{
public static final long serialVersionUID = 1;
public static final String PROP_AUTOSIZE = "PROP_AUTOSIZE";
SVGUniverse svgUniverse = SVGCache.getSVGUniverse();
private boolean antiAlias;
// private String svgPath;
URI svgURI;
// private boolean scaleToFit;
AffineTransform scaleXform = new AffineTransform();
public static final int AUTOSIZE_NONE = 0;
public static final int AUTOSIZE_HORIZ = 1;
public static final int AUTOSIZE_VERT = 2;
public static final int AUTOSIZE_BESTFIT = 3;
public static final int AUTOSIZE_STRETCH = 4;
private int autosize = AUTOSIZE_NONE;
/** Creates new form SVGIcon */
public SVGPanel()
{
initComponents();
}
public int getSVGHeight()
{
if (autosize == AUTOSIZE_VERT || autosize == AUTOSIZE_STRETCH
|| autosize == AUTOSIZE_BESTFIT)
{
return getPreferredSize().height;
}
SVGDiagram diagram = svgUniverse.getDiagram(svgURI);
if (diagram == null)
{
return 0;
}
return (int)diagram.getHeight();
}
public int getSVGWidth()
{
if (autosize == AUTOSIZE_HORIZ || autosize == AUTOSIZE_STRETCH
|| autosize == AUTOSIZE_BESTFIT)
{
return getPreferredSize().width;
}
SVGDiagram diagram = svgUniverse.getDiagram(svgURI);
if (diagram == null)
{
return 0;
}
return (int)diagram.getWidth();
}
@Override
public void paintComponent(Graphics gg)
{
super.paintComponent(gg);
Graphics2D g = (Graphics2D)gg.create();
paintComponent(g);
g.dispose();
}
private void paintComponent(Graphics2D g)
{
Object oldAliasHint = g.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, antiAlias ? RenderingHints.VALUE_ANTIALIAS_ON : RenderingHints.VALUE_ANTIALIAS_OFF);
SVGDiagram diagram = svgUniverse.getDiagram(svgURI);
if (diagram == null)
{
return;
}
if (autosize == AUTOSIZE_NONE)
{
try
{
diagram.render(g);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, oldAliasHint);
}
catch (SVGException e)
{
throw new RuntimeException(e);
}
return;
}
Dimension dim = getSize();
final int width = dim.width;
final int height = dim.height;
// final Rectangle2D.Double rect = new Rectangle2D.Double();
// diagram.getViewRect(rect);
double diaWidth = diagram.getWidth();
double diaHeight = diagram.getHeight();
double scaleW = 1;
double scaleH = 1;
if (autosize == AUTOSIZE_BESTFIT)
{
scaleW = scaleH = (height / diaHeight < width / diaWidth)
? height / diaHeight : width / diaWidth;
}
else if (autosize == AUTOSIZE_HORIZ)
{
scaleW = scaleH = width / diaWidth;
}
else if (autosize == AUTOSIZE_VERT)
{
scaleW = scaleH = height / diaHeight;
}
else if (autosize == AUTOSIZE_STRETCH)
{
scaleW = width / diaWidth;
scaleH = height / diaHeight;
}
scaleXform.setToScale(scaleW, scaleH);
AffineTransform oldXform = g.getTransform();
g.transform(scaleXform);
try
{
diagram.render(g);
}
catch (SVGException e)
{
throw new RuntimeException(e);
}
g.setTransform(oldXform);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, oldAliasHint);
}
public SVGUniverse getSvgUniverse()
{
return svgUniverse;
}
public void setSvgUniverse(SVGUniverse svgUniverse)
{
SVGUniverse old = this.svgUniverse;
this.svgUniverse = svgUniverse;
firePropertyChange("svgUniverse", old, svgUniverse);
}
public URI getSvgURI()
{
return svgURI;
}
public void setSvgURI(URI svgURI)
{
URI old = this.svgURI;
this.svgURI = svgURI;
firePropertyChange("svgURI", old, svgURI);
}
/**
* Most resources your component will want to access will be resources on your classpath.
* This method will interpret the passed string as a path in the classpath and use
* Class.getResource() to determine the URI of the SVG.
*/
public void setSvgResourcePath(String resourcePath) throws SVGException
{
URI old = this.svgURI;
try
{
svgURI = new URI(getClass().getResource(resourcePath).toString());
//System.err.println("SVGPanel: new URI " + svgURI + " from path " + resourcePath);
firePropertyChange("svgURI", old, svgURI);
repaint();
}
catch (Exception e)
{
throw new SVGException("Could not resolve path " + resourcePath, e);
// svgURI = old;
}
}
/**
* If this SVG document has a viewbox, if scaleToFit is set, will scale the viewbox to match the
* preferred size of this icon
* @deprecated
* @return
*/
public boolean isScaleToFit()
{
return autosize == AUTOSIZE_STRETCH;
}
/**
* @deprecated
*/
public void setScaleToFit(boolean scaleToFit)
{
setAutosize(AUTOSIZE_STRETCH);
// boolean old = this.scaleToFit;
// this.scaleToFit = scaleToFit;
// firePropertyChange("scaleToFit", old, scaleToFit);
}
/**
* @return true if antiAliasing is turned on.
* @deprecated
*/
public boolean getUseAntiAlias()
{
return getAntiAlias();
}
/**
* @param antiAlias true to use antiAliasing.
* @deprecated
*/
public void setUseAntiAlias(boolean antiAlias)
{
setAntiAlias(antiAlias);
}
/**
* @return true if antiAliasing is turned on.
*/
public boolean getAntiAlias()
{
return antiAlias;
}
/**
* @param antiAlias true to use antiAliasing.
*/
public void setAntiAlias(boolean antiAlias)
{
boolean old = this.antiAlias;
this.antiAlias = antiAlias;
firePropertyChange("antiAlias", old, antiAlias);
}
/**
* @return the autosize
*/
public int getAutosize()
{
return autosize;
}
/**
* @param autosize the autosize to set
*/
public void setAutosize(int autosize)
{
int oldAutosize = this.autosize;
this.autosize = autosize;
firePropertyChange(PROP_AUTOSIZE, oldAutosize, autosize);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// //GEN-BEGIN:initComponents
private void initComponents()
{
setLayout(new java.awt.BorderLayout());
}
// //GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
}