?? browser.java
字號:
/*
* Control a web browser from your java application.
* Copyright (C) 2001-2002 Stephen Ostermiller
* http://ostermiller.org/contact.pl?regarding=Java+Utilities
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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.
*
* See COPYING.TXT for details.
*/
package com.Ostermiller.util;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringReader;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.Properties;
import java.util.ResourceBundle;
import java.util.Vector;
import java.util.prefs.Preferences;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/**
* Allows URLs to be opened in the system browser on Windows and Unix.
* More information about this class is available from <a target="_top" href=
* "http://ostermiller.org/utils/Browser.html">ostermiller.org</a>.
*
* @author Stephen Ostermiller http://ostermiller.org/contact.pl?regarding=Java+Utilities
* @since ostermillerutils 1.00.00
*/
public class Browser {
/**
* The dialog that allows user configuration of the options for this class.
*
* @since ostermillerutils 1.00.00
*/
protected static BrowserDialog dialog;
/**
* Locale specific strings displayed to the user.
*
* @since ostermillerutils 1.00.00
*/
protected static ResourceBundle labels = ResourceBundle.getBundle("com.Ostermiller.util.Browser", Locale.getDefault());
/**
* Set the locale used for getting localized
* strings.
*
* @param locale Locale used to for i18n.
*
* @since ostermillerutils 1.00.00
*/
public static void setLocale(Locale locale){
labels = ResourceBundle.getBundle("com.Ostermiller.util.Browser", locale);
}
/**
* A list of commands to try in order to display the url.
* The url is put into the command using MessageFormat, so
* the URL will be specified as {0} in the command.
* Some examples of commands to try might be:<br>
* <code>rundll32 url.dll,FileProtocolHandler {0}</code></br>
* <code>netscape {0}</code><br>
* These commands are passed in order to exec until something works
* when displayURL is used.
*
* @since ostermillerutils 1.00.00
*/
public static String[] exec = null;
/**
* Determine appropriate commands to start a browser on the current
* operating system. On windows: <br>
* <code>rundll32 url.dll,FileProtocolHandler {0}</code></br>
* On other operating systems, the "which" command is used to
* test if Mozilla, netscape, and lynx(xterm) are available (in that
* order).
*
* @since ostermillerutils 1.00.00
*/
public static void init(){
exec = defaultCommands();
}
/**
* Retrieve the default commands to open a browser for this system.
*
* @since ostermillerutils 1.00.00
*/
public static String[] defaultCommands(){
String[] exec = null;
if ( System.getProperty("os.name").startsWith("Windows")){
exec = new String[]{
"rundll32 url.dll,FileProtocolHandler {0}",
};
} else if (System.getProperty("os.name").startsWith("Mac")){
Vector browsers = new Vector();
try {
Process p = Runtime.getRuntime().exec("which open");
if (p.waitFor() == 0){
browsers.add("open {0}");
}
} catch (IOException e){
} catch (InterruptedException e){
}
if (browsers.size() == 0){
exec = null;
} else {
exec = (String[])browsers.toArray(new String[0]);
}
} else {
Vector browsers = new Vector();
try {
Process p = Runtime.getRuntime().exec("which firebird");
if (p.waitFor() == 0){
browsers.add("firebird -remote openURL({0})");
browsers.add("firebird {0}");
}
} catch (IOException e){
} catch (InterruptedException e){
}try {
Process p = Runtime.getRuntime().exec("which mozilla");
if (p.waitFor() == 0){
browsers.add("mozilla -remote openURL({0})");
browsers.add("mozilla {0}");
}
} catch (IOException e){
} catch (InterruptedException e){
}
try {
Process p = Runtime.getRuntime().exec("which opera");
if (p.waitFor() == 0){
browsers.add("opera -remote openURL({0})");
browsers.add("opera {0}");
}
} catch (IOException e){
} catch (InterruptedException e){
}
try {
Process p = Runtime.getRuntime().exec("which galeon");
if (p.waitFor() == 0){
browsers.add("galeon {0}");
}
} catch (IOException e){
} catch (InterruptedException e){
}
try {
Process p = Runtime.getRuntime().exec("which konqueror");
if (p.waitFor() == 0){
browsers.add("konqueror {0}");
}
} catch (IOException e){
} catch (InterruptedException e){
}
try {
Process p = Runtime.getRuntime().exec("which netscape");
if (p.waitFor() == 0){
browsers.add("netscape -remote openURL({0})");
browsers.add("netscape {0}");
}
} catch (IOException e){
} catch (InterruptedException e){
}
try {
Process p = Runtime.getRuntime().exec("which xterm");
if (p.waitFor() == 0){
p = Runtime.getRuntime().exec("which lynx");
if (p.waitFor() == 0){
browsers.add("xterm -e lynx {0}");
}
}
} catch (IOException e){
} catch (InterruptedException e){
}
if (browsers.size() == 0){
exec = null;
} else {
exec = (String[])browsers.toArray(new String[0]);
}
}
return exec;
}
/**
* Save the options used to the given properties file.
* Property names used will all start with com.Ostermiller.util.Browser
* Properties are saved in such a way that a call to load(props); will
* restore the state of this class.
* If the default commands to open a browser are being used then
* they are not saved in the properties file, assuming that the user
* will want to use the defaults next time even if the defaults change.
*
* @param props properties file to which configuration is saved.
*
* @since ostermillerutils 1.00.00
*/
public static void save(Properties props){
boolean saveBrowser = false;
if (Browser.exec != null && Browser.exec.length > 0){
String[] exec = Browser.defaultCommands();
if (exec != null && exec.length == Browser.exec.length){
for (int i=0; i<exec.length; i++){
if (!exec[i].equals(Browser.exec[i])){
saveBrowser = true;
}
}
} else {
saveBrowser = true;
}
}
if (saveBrowser){
StringBuffer sb = new StringBuffer();
for (int i=0; Browser.exec != null && i < Browser.exec.length; i++){
sb.append(Browser.exec[i]).append('\n');
}
props.put("com.Ostermiller.util.Browser.open", sb.toString());
} else {
props.remove("com.Ostermiller.util.Browser.open");
}
}
public static void save(Preferences prefs){
boolean saveBrowser = false;
if (Browser.exec != null && Browser.exec.length > 0){
String[] exec = Browser.defaultCommands();
if (exec != null && exec.length == Browser.exec.length){
for (int i=0; i<exec.length; i++){
if (!exec[i].equals(Browser.exec[i])){
saveBrowser = true;
}
}
} else {
saveBrowser = true;
}
}
if (saveBrowser){
StringBuffer sb = new StringBuffer();
for (int i=0; Browser.exec != null && i < Browser.exec.length; i++){
sb.append(Browser.exec[i]).append('\n');
}
prefs.put("com.Ostermiller.util.Browser.open", sb.toString());
} else {
prefs.remove("com.Ostermiller.util.Browser.open");
}
}
/**
* Load the options for this class from the given properties file.
* This method is designed to work with the save(props) method. All
* properties used will start with com.Ostermiller.util.Browser. If
* no configuration is found, the default configuration will be used.
* If this method is used, a call to Browser.init(); is not needed.
*
* @param props properties file from which configuration is loaded.
*
* @since ostermillerutils 1.00.00
*/
public static void load(Properties props){
if (props.containsKey("com.Ostermiller.util.Browser.open")){
java.util.StringTokenizer tok = new java.util.StringTokenizer(props.getProperty("com.Ostermiller.util.Browser.open"), "\r\n", false);
int count = tok.countTokens();
String[] exec = new String[count];
for (int i=0; i < count; i++){
exec[i] = tok.nextToken();
}
Browser.exec = exec;
} else {
Browser.init();
}
}
public static void load(Preferences prefs){
if (!prefs.get("com.Ostermiller.util.Browser.open","NOT SET").equals("NOT SET")){
java.util.StringTokenizer tok = new java.util.StringTokenizer(prefs.get("com.Ostermiller.util.Browser.open","error loading prefs"), "\r\n", false);
int count = tok.countTokens();
String[] exec = new String[count];
for (int i=0; i < count; i++){
exec[i] = tok.nextToken();
}
Browser.exec = exec;
} else {
Browser.init();
}
}
/**
* Display a URL in the system browser.
*
* Browser.init() should be called before calling this function or
* Browser.exec should be set explicitly.
*
* For security reasons, the URL will may not be passed directly to the
* browser as it is passed to this method. The URL may be made safe for
* the exec command by URLEncoding the URL before passing it.
*
* @param url the url to display
* @throws IOException if the url is not valid or the browser fails to star
*
* @since ostermillerutils 1.00.00
*/
public static void displayURL(String url) throws IOException {
if (exec == null || exec.length == 0){
if (System.getProperty("os.name").startsWith("Mac")){
boolean success = false;
try {
Class nSWorkspace;
if (new File("/System/Library/Java/com/apple/cocoa/application/NSWorkspace.class").exists()){
// Mac OS X has NSWorkspace, but it is not in the classpath, add it.
ClassLoader classLoader = new URLClassLoader(new URL[]{new File("/System/Library/Java").toURL()});
nSWorkspace = Class.forName("com.apple.cocoa.application.NSWorkspace", true, classLoader);
} else {
nSWorkspace = Class.forName("com.apple.cocoa.application.NSWorkspace");
}
Method sharedWorkspace = nSWorkspace.getMethod("sharedWorkspace", new Class[] {});
Object workspace = sharedWorkspace.invoke(null, new Object[] {});
Method openURL = nSWorkspace.getMethod("openURL", new Class[] {Class.forName("java.net.URL")});
success = ((Boolean)openURL.invoke(workspace, new Object[] {new java.net.URL(url)})).booleanValue();
//success = com.apple.cocoa.application.NSWorkspace.sharedWorkspace().openURL(new java.net.URL(url));
} catch (Exception x) {}
if (!success){
try {
Class mrjFileUtils = Class.forName("com.apple.mrj.MRJFileUtils");
Method openURL = mrjFileUtils.getMethod("openURL", new Class[] {Class.forName("java.lang.String")});
openURL.invoke(null, new Object[] {url});
//com.apple.mrj.MRJFileUtils.openURL(url);
} catch (Exception x){
System.err.println(x.getMessage());
throw new IOException(labels.getString("failed"));
}
}
} else {
throw new IOException(labels.getString("nocommand"));
}
} else {
// for security, see if the url is valid.
// this is primarily to catch an attack in which the url
// starts with a - to fool the command line flags, bu
// it could catch other stuff as well, and will throw a
// MalformedURLException which will give the caller of this
// function useful information.
new URL(url);
// escape any weird characters in the url. This is primarily
// to prevent an attacker from putting in spaces
// that might fool exec into allowing
// the attacker to execute arbitrary code.
StringBuffer sb = new StringBuffer(url.length());
for (int i=0; i<url.length(); i++){
char c = url.charAt(i);
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -