package ij.plugin;
import java.awt.*;
import java.io.*;
import java.net.URL;
import ij.*;
import ij.io.*;
import ij.gui.*;
import ij.plugin.frame.*;
/** Opens TIFFs, ZIP compressed TIFFs, DICOMs, GIFs and JPEGs using a URL.
TIFF file names must end in ".tif", ZIP file names must end
in ".zip" and DICOM file names must end in ".dcm".
Opens a Web page in the default browser if the URL ends with "/".
*/
public class URLOpener implements PlugIn {
private static String url = IJ.URL+"/images/clown.gif";
/** If 'urlOrName' is a URL, opens the image at that URL. If it is
a file name, opens the image with that name from the 'images.location'
URL in IJ_Props.txt. If it is blank, prompts for an image
URL and open the specified image. */
public void run(String urlOrName) {
if (!urlOrName.equals("")) {
if (urlOrName.endsWith("StartupMacros.txt"))
openTextFile(urlOrName, true);
else {
String url = urlOrName.indexOf("://")>0?urlOrName:Prefs.getImagesURL()+urlOrName;
ImagePlus imp = new ImagePlus(url);
if (Recorder.record)
Recorder.recordCall("imp = IJ.openImage(\""+url+"\");");
if (imp.getType()==ImagePlus.COLOR_RGB)
Opener.convertGrayJpegTo8Bits(imp);
WindowManager.checkForDuplicateName = true;
FileInfo fi = imp.getOriginalFileInfo();
if (fi!=null && fi.fileType==FileInfo.RGB48)
imp = new CompositeImage(imp, CompositeImage.COMPOSITE);
else if (imp.getNChannels()>1 && fi!=null && fi.description!=null && fi.description.indexOf("mode=")!=-1) {
int mode = CompositeImage.COLOR;
if (fi.description.indexOf("mode=composite")!=-1)
mode = CompositeImage.COMPOSITE;
else if (fi.description.indexOf("mode=gray")!=-1)
mode = CompositeImage.GRAYSCALE;
imp = new CompositeImage(imp, mode);
}
if (fi!=null && (fi.url==null || fi.url.length()==0)) {
fi.url = url;
imp.setFileInfo(fi);
}
imp.show();
}
return;
}
GenericDialog gd = new GenericDialog("Enter a URL");
gd.addMessage("Enter URL of an image, macro or web page");
gd.addStringField("URL:", url, 45);
gd.showDialog();
if (gd.wasCanceled())
return;
url = gd.getNextString();
url = url.trim();
if (url.indexOf("://")==-1)
url = "http://" + url;
if (url.endsWith("/"))
IJ.runPlugIn("ij.plugin.BrowserLauncher", url.substring(0, url.length()-1));
else if (url.endsWith(".html") || url.endsWith(".htm") || url.indexOf(".html#")>0 || noExtension(url))
IJ.runPlugIn("ij.plugin.BrowserLauncher", url);
else if (url.endsWith(".txt")||url.endsWith(".ijm")||url.endsWith(".js")||url.endsWith(".java"))
openTextFile(url, false);
else if (url.endsWith(".jar")||url.endsWith(".class"))
IJ.open(url);
else {
IJ.showStatus("Opening: " + url);
ImagePlus imp = new ImagePlus(url);
WindowManager.checkForDuplicateName = true;
FileInfo fi = imp.getOriginalFileInfo();
if (fi!=null && fi.fileType==FileInfo.RGB48)
imp = new CompositeImage(imp, CompositeImage.COMPOSITE);
imp.show();
IJ.showStatus("");
}
IJ.register(URLOpener.class); // keeps this class from being GC'd
}
boolean noExtension(String url) {
int lastSlash = url.lastIndexOf("/");
if (lastSlash==-1) lastSlash = 0;
int lastDot = url.lastIndexOf(".");
if (lastDot==-1 || lastDot<lastSlash || (url.length()-lastDot)>6)
return true; // no extension
else
return false;
}
void openTextFile(String urlString, boolean install) {
StringBuffer sb = null;
try {
URL url = new URL(urlString);
InputStream in = url.openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
sb = new StringBuffer() ;
String line;
while ((line=br.readLine()) != null)
sb.append (line + "\n");
in.close ();
} catch (IOException e) {
if (!(install&&urlString.endsWith("StartupMacros.txt")))
IJ.error("URL Opener", ""+e);
sb = null;
}
if (sb!=null) {
if (install)
(new MacroInstaller()).install(new String(sb));
else {
int index = urlString.lastIndexOf("/");
if (index!=-1 && index<=urlString.length()-1)
urlString = urlString.substring(index+1);
(new Editor()).create(urlString, new String(sb));
}
}
}
}