⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 browser.java

📁 Gmail API for Java 一个gmail信箱的客户端
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/*
 * 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')

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -