/*
* Open Source Physics software is free software as described near the bottom of this code file.
*
* For additional information and documentation on Open Source Physics please see:
* <http://www.opensourcephysics.org/>
*/
package org.opensourcephysics.ejs.control;
import javax.swing.ImageIcon;
import org.opensourcephysics.tools.ResourceLoader;
/**
* Some utility functions
*/
public class Utils {
static private java.util.Hashtable<String, ImageIcon> cacheImages = new java.util.Hashtable<String, ImageIcon>();
static public boolean fileExists(String _codebase, String _filename) {
if(_filename==null) {
return false;
}
if(cacheImages.get(_filename)!=null) {
return true;
}
if(_codebase!=null) {
if(_codebase.startsWith("file:")) { //$NON-NLS-1$
_codebase = "file:///"+_codebase.substring(6); //$NON-NLS-1$
}
if(!_codebase.endsWith("/")) { //$NON-NLS-1$
_codebase += "/"; //$NON-NLS-1$
}
}
int index = _filename.indexOf('+');
if(index>=0) {
return fileExistsInJar(_codebase, _filename.substring(0, index), _filename.substring(index+1));
} else if(_codebase==null) {
java.io.File file = new java.io.File(_filename);
return file.exists();
} else {
try {
java.net.URL url = new java.net.URL(_codebase+_filename);
java.io.InputStream stream = url.openStream();
stream.close();
return true;
} catch(Exception exc) {
return false;
}
}
}
static public boolean fileExistsInJar(String _codebase, String _jarFile, String _filename) {
if((_filename==null)||(_jarFile==null)) {
return false;
}
java.io.InputStream inputStream = null;
java.util.jar.JarInputStream jis=null;
try {
if(_codebase==null) {
inputStream = new java.io.FileInputStream(_jarFile);
jis = new java.util.jar.JarInputStream(inputStream);
} else {
java.net.URL url = new java.net.URL(_codebase+_jarFile);
inputStream = url.openStream();
jis = new java.util.jar.JarInputStream(inputStream);
}
while(true) {
java.util.jar.JarEntry je = jis.getNextJarEntry();
if(je==null) {
break;
}
if(je.isDirectory()) {
continue;
}
if(je.getName().equals(_filename)) {
jis.close();
inputStream.close();
return true;
}
}
jis.close();
inputStream.close();
} catch(Exception exc) {
return false;
}
return false;
}
static public javax.swing.ImageIcon icon(String _codebase, String _gifFile) {
return icon(_codebase, _gifFile, true);
}
static public javax.swing.ImageIcon icon(String _codebase, String _gifFile, boolean _verbose) {
if(_gifFile==null) {
return null;
}
// System.out.println ("Reading from "+_codebase+" :"+_gifFile);
javax.swing.ImageIcon icon = cacheImages.get(_gifFile);
if(icon!=null) {
return icon;
}
if(_codebase!=null) {
if(_codebase.startsWith("file:")) { //$NON-NLS-1$
_codebase = "file:///"+_codebase.substring(6); //$NON-NLS-1$
}
if(!_codebase.endsWith("/")) { //$NON-NLS-1$
_codebase += "/"; //$NON-NLS-1$
}
}
int index = _gifFile.indexOf('+');
if(index>=0) {
icon = iconJar(_codebase, _gifFile.substring(0, index), _gifFile.substring(index+1), _verbose);
} else if(_codebase==null) {
// System.out.println ("Reading from "+_codebase+" :"+_gifFile);
java.io.File file = new java.io.File(_gifFile);
if(file.exists()) {
icon = new javax.swing.ImageIcon(_gifFile);
}
if(icon==null) {
// code modified by Doug Brown June 2015 to get ImageIcon from ResourceLoader
javax.swing.Icon resIcon = ResourceLoader.getIcon(_gifFile);
if (resIcon!=null && resIcon instanceof org.opensourcephysics.display.ResizableIcon) {
resIcon = ((org.opensourcephysics.display.ResizableIcon)resIcon).getBaseIcon();
icon = (ImageIcon)resIcon;
}
}
} else {
// System.out.println ("Reading from "+_codebase+" :"+_gifFile);
try {
java.net.URL url = new java.net.URL(_codebase+_gifFile);
icon = new javax.swing.ImageIcon(url);
} catch(Exception exc) {
if(_verbose) {
exc.printStackTrace();
}
icon = null;
}
}
if((icon==null)||(icon.getIconHeight()<=0)) {
if(_verbose) {
System.out.println("Unable to load image "+_gifFile); //$NON-NLS-1$
}
} else {
cacheImages.put(_gifFile, icon);
}
return icon;
}
static private byte[] enormous = new byte[100000]; // Maximum size for a gif file in a Jar
static public javax.swing.ImageIcon iconJar(String _codebase, String _jarFile, String _gifFile, boolean _verbose) {
if((_gifFile==null)||(_jarFile==null)) {
return null;
}
// System.out.println ("Jar Reading from "+_codebase+" + "+_jarFile+":"+_gifFile);
javax.swing.ImageIcon icon = null;
java.io.InputStream inputStream = null;
java.util.jar.JarInputStream jis=null;
try {
if(_codebase==null) {
inputStream = new java.io.FileInputStream(_jarFile);
jis = new java.util.jar.JarInputStream(inputStream);
} else {
java.net.URL url = new java.net.URL(_codebase+_jarFile);
inputStream = url.openStream();
jis = new java.util.jar.JarInputStream(inputStream);
}
boolean done = false;
byte[] b = null;
while(!done) {
java.util.jar.JarEntry je = jis.getNextJarEntry();
if(je==null) {
break;
}
if(je.isDirectory()) {
continue;
}
if(je.getName().equals(_gifFile)) {
// System.out.println ("Found entry "+je.getName());
long size = (int) je.getSize();
// System.out.println ("Size is "+size);
int rb = 0;
int chunk = 0;
while(chunk>=0) {
chunk = jis.read(enormous, rb, 255);
if(chunk==-1) {
break;
}
rb += chunk;
}
size = rb;
// System.out.println ("Real Size is "+size);
b = new byte[(int) size];
System.arraycopy(enormous, 0, b, 0, (int) size);
done = true;
}
}
icon = new javax.swing.ImageIcon(b);
jis.close();
} catch(Exception exc) {
if(_verbose) {
exc.printStackTrace();
}
icon = null;
}
return icon;
}
} // end of class
/*
* Open Source Physics software is free software; you can redistribute
* it and/or modify it under the terms of the GNU General Public License (GPL) as
* published by the Free Software Foundation; either version 2 of the License,
* or(at your option) any later version.
* Code that uses any portion of the code in the org.opensourcephysics package
* or any subpackage (subdirectory) of this package must must also be be released
* under the GNU GPL license.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA
* or view the license online at http://www.gnu.org/copyleft/gpl.html
*
* Copyright (c) 2007 The Open Source Physics project
* http://www.opensourcephysics.org
*/