home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1995 November
/
PCWK1195.iso
/
inne
/
win95
/
sieciowe
/
hotja32.lzh
/
hotjava
/
classsrc
/
browser
/
hotjava.java
< prev
next >
Wrap
Text File
|
1995-08-11
|
57KB
|
2,257 lines
/*
* @(#)hotjava.java 1.184 95/08/04 Jonathan Payne and Patrick Naughton
*
* Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL purposes and without
* fee is hereby granted provided that this copyright notice
* appears in all copies. Please refer to the file "copyright.html"
* for further important copyright and licensing information.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/
package browser;
import awt.*;
import net.*;
import java.lang.*;
import java.io.*;
import java.util.*;
import net.www.html.URL;
import net.www.html.MeteredStream;
import net.www.html.ProgressReport;
import net.www.http.HttpClient;
import net.ftp.FtpClient;
import browser.tools.JavaSearch.SearchWindow;
/**
* Class hotjava is really an awt.Frame, with code to create and
* manage all the UI components of hotjava.
* @version 1.184, 04 Aug 1995
* @author Jonathan Payne
* @author Sami Shaio
* @author Arthur van Hoff
*/
public class hotjava extends Frame {
static private boolean securityConfigured = false;
static WRAccessHandler handler = null;
static WServer server = null;
static Font labelFont;
static Font inputFont;
static Font dialogFont;
static Color blue = null;
static SecurityDialog sDialog = null;
static ProgressDialog pDialog = null;
public static Color anchorColor = null;
public static Color visitedAnchorColor = null;
public static Properties props;
static int copiesRunning;
public static String home;
public static String dochome;
public static String version = "1.0 alpha3";
public static String programName = "HotJava";
public static String untitledTitle = "Untitled";
public static URLHistory history;
public static int windowWidth = 641;
public static int windowHeight = 729;
StatusWindow statusWindow;
ToolBar toolBar;
InfoWindow infoWindow;
SearchWindow searchWindow;
HistoryWindow histWindow;
StringDialog findDialog;
MenuBar mbar;
public FileMenu fileMenu;
GoToMenu gotoMenu;
protected WRWindow doc;
HotList hlist;
String urlSpec;
String pageTitle;
Image icon;
static {
home = System.getenv("WWW_HOME");
if (home == null) {
home = "doc:index.html";
}
dochome = "doc:/doc/";
initHistory();
}
static void initHistory() {
history = new URLHistory();
if (false) {
FileInputStream is = null;
String home = System.getenv("HOME");
String hotjavaName;
hotjavaName = home + File.separator + ".hotjava"
+ File.separator + ".hotjava-global-history";
try {
is = new FileInputStream(hotjavaName);
history.parseStream(is);
} catch (IOException e) {
} catch (Exception e) {
System.err.println("Error " + e + " while reading your global history file!");
System.err.println("Therefore, your global history will not be updated in this session.");
return;
}
history.openOutputStream(hotjavaName);
}
}
public static GifImage fetchGIF(String fromURL) {
try {
URL imgUrl = new URL(null, fromURL);
InputStream iStream = imgUrl.openStream();
return new GifImage(iStream, null);
} catch (Exception e) {
return null;
}
}
public void go(String u) {
doc.pushURL(new URL(null, u));
}
public void goHome() {
doc.pushURL(new URL(null, home));
}
public void setTitle(String t) {
if (t == null || t.equals("")) {
super.setTitle(programName + " " + version);
pageTitle = "";
} else {
super.setTitle(programName+": "+t);
pageTitle = t;
}
}
public void setURL(String u) {
infoWindow.urlField.setText(u);
}
/**
* Call this to say that this document has HTML source. Can be used
* to turn on/off various commands, etc.
*/
public void pageHasSource(boolean source) {
if (source) {
fileMenu.viewSourceItem.enable();
} else {
fileMenu.viewSourceItem.disable();
}
}
public void handleQuit() {
if (--hotjava.copiesRunning > 0) {
// XXX: should actually be destroying the window and
// recovering resources...
unMap();
} else {
System.exit(0);
}
}
public void setMessage(String msg) {
if (statusWindow.message != null) {
statusWindow.message.setText(msg);
} else {
setStatusMessage(msg);
}
}
public void readProperties() {
props = new Properties(System.getenv("HOME") + File.separator + ".hotjava" + File.separator + "properties");
WRWindow.delayImageLoading = "true".equals(props.get("delayImageLoading"));
WRWindow.delayAppletLoading = "true".equals(props.get("delayAppletLoading"));
WRTextItem.underlineAnchors = ! "plain".equals(props.get("anchorStyle"));
if (!version.equals(props.get("version"))) {
urlSpec = "doc:copyright.html";
props.put("version", version);
props.save();
}
Object pval;
if ((pval = props.get("firewallSet")) != null) {
HttpClient.useProxyForFirewall = "true".equals(pval);
}
pval = props.get("firewallHost");
if (pval != null) {
HttpClient.firewallProxyHost = (String)pval;
}
pval = props.get("firewallPort");
if (pval != null) {
try {
HttpClient.firewallProxyPort = Integer.parseInt((String)pval);
} catch (NumberFormatException e) {
System.out.println("Error parsing firewallProxyPort: "
+ (String)pval);
HttpClient.useProxyForFirewall = false;
}
}
if ((pval = props.get("proxySet")) != null) {
HttpClient.useProxyForCaching = "true".equals(pval);
}
if ((pval = props.get("proxyHost")) != null) {
HttpClient.cachingProxyHost = (String)pval;
}
if ((pval = props.get("proxyPort")) != null) {
try {
HttpClient.cachingProxyPort = Integer.parseInt((String)pval);
} catch (NumberFormatException e) {
System.out.println("Error parsing cachingProxyPort: "
+ (String)pval);
HttpClient.useProxyForCaching = false;
}
}
if ((pval = props.get("useFtpProxy")) != null) {
FtpClient.useFtpProxy = "true".equals(pval);
}
if ((pval = props.get("ftpProxyHost")) != null) {
FtpClient.ftpProxyHost = (String)pval;
}
if ((pval = props.get("ftpProxyPort")) != null) {
try {
FtpClient.ftpProxyPort = Integer.parseInt((String)pval);
} catch (NumberFormatException e) {
System.out.println("Error parsing ftpProxyPort: "
+ (String)pval);
FtpClient.useFtpProxy = false;
}
}
}
public hotjava(WServer serv, String args[]) {
super(serv, true, null, windowWidth, windowHeight, Color.lightGray);
setInsets(4,0,4,0);
copiesRunning++;
super.setTitle(programName);
urlSpec = args.length > 0 ? args[0] : home;
// Read properties and set defaults
readProperties();
if (blue == null) {
blue = Color.black;
anchorColor = new Color(serv, 0, 0, 192);
visitedAnchorColor = new Color(serv, 96, 32, 128);
labelFont = serv.fonts.getFont("Helvetica", Font.BOLD, 14);
inputFont = serv.fonts.getFont("DialogInput", Font.BOLD, 12);
}
dialogFont = serv.fonts.getFont("Dialog", Font.BOLD, 12);
setDefaultFont(dialogFont);
doc = new WRWindow(this, "Center");
infoWindow = new InfoWindow(this);
doc.setScrollbar(new Scrollbar(doc, "sbar", Scrollbar.VERTICAL, true));
statusWindow = new StatusWindow(this);
toolBar = statusWindow.getToolBar();
mbar = new MenuBar(this);
fileMenu = new FileMenu(mbar, this);
new OptionsMenu(mbar, this);
new NavigateMenu(mbar, this);
gotoMenu = new GoToMenu(mbar, this);
new HelpMenu(mbar, this);
hlist = new HotList(serv, this);
histWindow = new HistoryWindow(serv, this, doc.docHistory);
findDialog = new StringDialog(this, hotjava.dialogFont,
"Find", "Find what:",
false, false, "Find", "Cancel",
"Help", "", null);
// Set the HotJava icon
// XXX: Note that this needs to be done before the frame is
// mapped for it to take effect.
//
serv.sync();
try {
GifImage gif = hotjava.fetchGIF("doc:demo/images/wricon.gif");
icon = doc.createImage(gif, 32, 32);
setIconImage(icon);
} catch (Exception e) {
System.out.println("Couldn't set icon image");
}
if (sDialog == null) {
sDialog = new SecurityDialog(this);
}
if (pDialog == null) {
pDialog = new ProgressDialog(this);
}
map();
if (! securityConfigured) {
sDialog.map();
sDialog.resize();
}
URL current_url = null;
try {
current_url = new URL(current_url, urlSpec);
doc.pushURL(current_url);
} catch(Exception e) {
System.out.println("Ignoring error " + e);
}
}
public static void main(String args[]) {
try {
File.setReadACL(System.getenv("HOTJAVA_READ_PATH"));
File.setWriteACL(System.getenv("HOTJAVA_WRITE_PATH"));
} catch (IOException e) {
System.out.println("Couldn't initialize security ACLs.");
return;
}
Firewall.readFirewallHosts();
if (!Firewall.readAccessMode()) {
securityConfigured = false;
} else {
securityConfigured = true;
}
try {
server = new WServer();
} catch(Exception e) {
System.out.println("Couldn't open connection to window server");
return;
}
server.start();
hotjava wr = new hotjava(server, args);
handler = new WRAccessHandler(wr);
File.setAccessErrorHandler(handler);
Firewall.setHandler(new WRSecurityHandler(wr));
}
}
class WRAccessHandler extends AccessErrorHandler {
MessageDialog diag;
WRAccessHandler(hotjava w) {
diag = new MessageDialog(w,
"Access Exception",
"",
MessageDialog.ERROR_TYPE,
2,
true,
"Deny Access",
"Allow This Access",
null,
null);
}
public int readException(String path) {
diag.setMessage("An applet has attempted to read " + path);
switch (diag.show()) {
case 2:
return AccessErrorHandler.ALLOW_THIS_ACCESS;
case 1:
default:
return AccessErrorHandler.DENY_ACCESS;
}
}
public int writeException(String path) {
diag.setMessage("An applet has attempted to write " + path);
switch (diag.show()) {
case 2:
return AccessErrorHandler.ALLOW_THIS_ACCESS;
case 1:
default:
return AccessErrorHandler.DENY_ACCESS;
}
}
}
class WRSecurityHandler extends AccessErrorHandler {
MessageDialog diag;
WRSecurityHandler(hotjava w) {
diag = new MessageDialog(w,
"Security Exception",
"",
MessageDialog.ERROR_TYPE,
1,
true,
"Ok",
null,
null,
null);
}
public int readException(String msg) {
diag.setMessage(msg);
diag.show();
return AccessErrorHandler.DENY_ACCESS;
}
}
class ClearButton extends Button {
hotjava target;
public ClearButton(Container w, hotjava hj) {
super("Document URL:", null, w);
target = hj;
}
public ClearButton(Image i, Image iP, Container w,
hotjava hj) {
super(i, iP, null, w);
target = hj;
}
public void selected(Component c, int pos) {
target.setURL("");
}
}
class BackButton extends Button {
hotjava target;
public BackButton(Container w, hotjava mw) {
super("Back", null, w);
target = mw;
}
public BackButton(Image i, Image iP, Image dis, Container w,
hotjava mw) {
super(i, iP, dis, null, w);
target = mw;
}
public void selected(Component c, int pos) {
target.doc.backup();
}
}
class FwdButton extends Button {
hotjava target;
public FwdButton(Container w, hotjava mw) {
super("Forward", null, w);
target = mw;
}
public FwdButton(Image i, Image iP, Image dis, Container w,
hotjava mw) {
super(i, iP, dis, null, w);
target = mw;
}
public void selected(Component c, int pos) {
target.doc.forward();
}
}
class HomeButton extends Button {
hotjava target;
public HomeButton(Container w, hotjava mw) {
super("Home", null, w);
target = mw;
}
public HomeButton(Image i, Image iP, Container w,
hotjava mw) {
super(i, iP, null, w);
target = mw;
}
public void selected(Component c, int pos) {
target.goHome();
}
}
class ReloadButton extends Button {
hotjava target;
public ReloadButton(Container w, hotjava mw) {
super("Reload", null, w);
target = mw;
}
public ReloadButton(Image i, Image iP, Container w,
hotjava mw) {
super(i, iP, null, w);
target = mw;
}
public void selected(Component c, int pos) {
target.doc.reload();
}
}
class StopButton extends Button {
hotjava target;
public StopButton(Container w, hotjava mw) {
super("Stop", null, w);
target = mw;
}
public StopButton(Image i, Image iP, Image dis, Container w,
hotjava mw) {
super(i, iP, dis, null, w);
target = mw;
}
public void selected(Component c, int pos) {
target.doc.stopFetch();
}
}
/*
* This class displays control buttons and status messages for
* hotjava. It is an observer of the MeteredStream class, which
* notifies it of progress while reading HTTP streams.
*/
class StatusWindow extends Window implements Runnable {
Color fg;
Label message;
hotjava hj;
ToolBar toolBar;
final int sepBarHeight = 2;
public StatusWindow(hotjava mw) {
super(mw, "South", mw.background, 500, 30);
setLayout(new ColumnLayout(true));
hj = mw;
toolBar = new ToolBar(this, this, hj);
new Space(this, null, 0, sepBarHeight + 2, true, false);
fg = Color.black;
InputStream iStream;
URL imgUrl;
if (mw.hasStatusBar()) {
mw.showStatusBar(true);
} else {
message=new Label("", "status", this,hotjava.labelFont);
message.setColor(hotjava.blue);
message.setHFill(true);
}
// Finally, fork a thread to execute the run() method defined below.
new Thread(this, "Progress Reporter").start();
}
public ToolBar getToolBar() {
return toolBar;
}
public void paint() {
paint3DRect(0, 0, width, sepBarHeight, false, true);
}
public void setMessage(String msg) {
if (message != null) {
message.setText(msg);
} else {
hj.setStatusMessage(msg);
}
}
private String plural(int n) {
return (n == 1) ? "" : "s";
}
/*
* Notify any observers that the amount expected or the amount
* read has changed. The notification only happens if the total
* number of bytes (read and expected) has changed by more than
* 3% of the last amount reported. Make sure that this method
* is only called from synchronized static methods.
*/
public void run() {
ProgressReport pr = new ProgressReport();
int lastReport = 0;
int connections = 0;
Thread.currentThread().setPriority(Thread.NORM_PRIORITY + 1);
while (true) {
Thread.sleep(500);
MeteredStream.checkProgress(pr);
int total = pr.recvd + pr.expected;
if (connections != pr.connections || total != lastReport) {
int diff = pr.expected - pr.recvd;
int percent = (int) (((float)pr.recvd/pr.expected) * 100);
if (pr.connections == 0 && diff == 0) {
String msg = hj.statusMessage;
if (message != null)
msg = message.label;
if (msg.endsWith("% completed)]"))
setMessage("");
} else {
setMessage("[" + pr.connections + " connection"
+ plural(pr.connections) + ": " + diff
+ " bytes remaining (" + percent + "% completed)]");
}
lastReport = total;
connections = pr.connections;
}
}
}
}
/**
* This class displays control buttons for hotjava.
*/
class ToolBar extends Row {
Button backButton;
Button fwdButton;
Button stopButton;
public ToolBar(Container cont, Window win, hotjava hj) {
super(cont, null, true);
try {
final String base = "doc:demo/images/";
GifImage bbm = hotjava.fetchGIF(base + "back.gif");
GifImage bbPm = hotjava.fetchGIF(base + "backP.gif");
GifImage bdbm = hotjava.fetchGIF(base + "backD.gif");
GifImage fbm = hotjava.fetchGIF(base + "fwd.gif");
GifImage fbPm = hotjava.fetchGIF(base + "fwdP.gif");
GifImage fdbm = hotjava.fetchGIF(base + "fwdD.gif");
GifImage hbm = hotjava.fetchGIF(base + "home.gif");
GifImage hbPm = hotjava.fetchGIF(base + "homeP.gif");
GifImage rbm = hotjava.fetchGIF(base + "reload.gif");
GifImage rbPm = hotjava.fetchGIF(base + "reloadP.gif");
GifImage stopbm = hotjava.fetchGIF(base + "stop.gif");
GifImage stopPbm = hotjava.fetchGIF(base + "stopP.gif");
GifImage stopDbm = hotjava.fetchGIF(base + "stopD.gif");
if (bbm==null) {
backButton = new BackButton(this, hj);
} else {
Image bimg = win.createImage(bbm);
Image bPimg = win.createImage(bbPm);
Image bDisImg = win.createImage(bdbm);
backButton = new BackButton(bimg, bPimg, bDisImg, this, hj);
}
if (fbm==null) {
fwdButton = new FwdButton(this, hj);
} else {
Image fimg = win.createImage(fbm);
Image fPimg = win.createImage(fbPm);
Image fDisImg = win.createImage(fdbm);
fwdButton = new FwdButton(fimg, fPimg, fDisImg, this, hj);
}
if (hbm==null) {
new HomeButton(this, hj);
} else {
Image himg = win.createImage(hbm);
Image hPimg = win.createImage(hbPm);
new HomeButton(himg, hPimg, this, hj);
}
if (rbm==null) {
new ReloadButton(this, hj);
} else {
Image rimg = win.createImage(rbm);
Image rPimg = win.createImage(rbPm);
new ReloadButton(rimg, rPimg, this, hj);
}
if (stopbm==null) {
new StopButton(this, hj);
} else {
Image stopImg = win.createImage(stopbm);
Image stopPImg = win.createImage(stopPbm);
Image stopDImg = win.createImage(stopDbm);
stopButton = new StopButton(stopImg, stopPImg, stopDImg,
this, hj);
}
} catch (Exception e) {
System.err.println("Unable to read one or more button "+
"images - using text labels instead");
backButton = new BackButton(this, hj);
fwdButton = new FwdButton(this, hj);
new HomeButton(this, hj);
new ReloadButton(this, hj);
stopButton = new StopButton(this, hj);
}
backButton.disable();
fwdButton.disable();
stopButton.disable();
}
public void setButtonStates(int stkIndex, Stack docStack) {
fwdButton.enable();
backButton.enable();
if (docStack.size() == 1) {
backButton.disable();
fwdButton.disable();
} else if (stkIndex >= docStack.size()) {
fwdButton.disable();
} else if (stkIndex == 1) {
backButton.disable();
}
}
public void allowStop(boolean yes) {
if (yes) {
stopButton.enable();
} else {
stopButton.disable();
}
}
}
class FileMenu extends Menu {
OpenDialog openDialog;
PrintDialog printDialog;
public MenuItem viewSourceItem;
public FileMenu(MenuBar mbar, hotjava w) {
super("File", mbar);
mw = w;
MenuItem item;
item = new MenuItem("New", this);
item.disable();
item = new MenuItem("Open...", this);
item = new MenuItem("Reload", this);
item = new MenuItem("Save", this);
item.disable();
item = new MenuItem("Save As...", this);
item.disable();
item = new MenuItem("Print...", this);
item.disable();
viewSourceItem = new MenuItem("View Source...", this);
viewSourceItem.disable();
item = new MenuItem("Close", this);
item.disable();
new MenuItem("Quit", this);
enabled = true;
}
public void selected(int index) {
int height;
int width;
String args[];
switch (index) {
case 0: // New
args = new String[1];
args[0] = mw.urlSpec;
new hotjava(hotjava.server, args);
break;
case 1: // Open
if (openDialog == null) {
openDialog = new OpenDialog(hotjava.server, mw);
}
openDialog.map();
break;
case 2: // Reload
mw.doc.reload();
break;
case 3: // Save
break;
case 4: // Save As
break;
case 5: // Print...
if (printDialog == null) {
printDialog = new PrintDialog(mw, mw.doc.document());
}
printDialog.map();
break;
case 6: // View Source...
new SourceViewer(mw, mw.doc.document().thisURL);
break;
case 7: // Close Window
hotjava.copiesRunning--;
if (hotjava.copiesRunning > 0) {
// XXX: should actually be destroying the window and
// recovering resources...
mw.unMap();
break;
}
// else fall into quit case
case 8: // Quit
System.exit(0);
break;
default:
break;
}
}
hotjava mw;
private boolean enabled;
}
class OptionsMenu extends Menu {
hotjava mw;
MenuItem showToggle;
PropertySheet propSheet = null;
public OptionsMenu(MenuBar mbar, hotjava w) {
super("Options", mbar);
mw = w;
MenuItem item;
item = new MenuItem("Font", this);
item.disable();
item = new MenuItem("Color", this);
item.disable();
new MenuItem("Security...", this);
new MenuItem("Properties...", this);
new MenuItem("Flush Cache", this);
new MenuItem("Progress Monitor", this);
}
public void selected(int index) {
boolean st;
switch (index) {
case 2: // Security...
hotjava.sDialog.map();
hotjava.sDialog.resize();
break;
case 3: // Properties...
if (propSheet == null) {
propSheet = new PropertySheet(mw);
}
propSheet.show();
break;
case 4: // Flush Cache
ImageCache.flush();
browser.audio.AudioData.flushCache();
break;
case 5: // Progress
hotjava.pDialog.map();
hotjava.pDialog.resize();
break;
default:
break;
}
}
}
class HotlistMenuItem extends MenuItem {
String url;
hotjava mw;
public HotlistMenuItem(String title, String url, Menu parent,
hotjava mw) {
super(title, parent);
this.url = url;
this.mw = mw;
}
public void selected() {
mw.doc.pushURL(new URL(null, url));
}
}
class GoToMenu extends Menu {
hotjava mw;
public GoToMenu(MenuBar mbar, hotjava w) {
super("Goto", mbar);
mw = w;
new MenuItem("Add Current", this);
addSeparator();
}
public void selected(int index) {
switch (index) {
case 0:
mw.hlist.addItem(mw.pageTitle,
mw.infoWindow.urlField.getText(),
true,
true);
break;
default:
break;
}
}
public HotlistMenuItem addHotItem(String title, String url) {
if ((title == null) || (title.length() == 0)) {
title = hotjava.untitledTitle+" (" + url + ")";
}
return new HotlistMenuItem(title, url, this, mw);
}
}
class NavigateMenu extends Menu {
hotjava mw;
boolean addedSeparator = false;
public NavigateMenu(MenuBar mbar, hotjava w) {
super("Navigate", mbar);
mw = w;
MenuItem item;
new MenuItem("Forward", this);
new MenuItem("Back", this);
new MenuItem("Home", this);
addSeparator();
new MenuItem("Show History...", this);
addSeparator();
new MenuItem("Add Current to Hotlist", this);
new MenuItem("Show Hotlist...", this);
addSeparator();
(new MenuItem("Find...", this)).disable();
}
public void selected(int index) {
String urlstring;
switch (index) {
case 0:
// Forward
mw.doc.forward();
break;
case 1:
// Back
mw.doc.backup();
break;
case 2:
// Home
mw.goHome();
break;
case 3:
// History
mw.histWindow.showWindow();
break;
case 4:
// Add Current to HotList
mw.hlist.addItem(mw.pageTitle,
mw.infoWindow.urlField.getText(),
false,
false);
break;
case 5:
// Show HotList
mw.hlist.map();
mw.hlist.resize();
mw.hlist.wServer.sync();
break;
case 6:
mw.findDialog.setHandler(new FindHandler(mw));
mw.findDialog.show();
default:
break;
}
}
}
class HotlistGotoButton extends Button {
public HotlistGotoButton(Container w, HotList hl) {
super("Visit","", w);
hlist = hl;
}
public void selected(Component c, int pos) {
HotListItem hItem = (HotListItem)hlist.urlList.elementAt(hlist.selectedItem);
hlist.mw.doc.pushURL(new URL(null, hItem.url));
}
HotList hlist;
}
class DismissButton extends Button {
public DismissButton(Container w, Frame f) {
this(w, f, "Cancel");
}
public DismissButton(Container w, Frame f, String label) {
super(label, null, w);
frame = f;
}
public void selected(Component c, int pos) {
frame.unMap();
}
Frame frame;
}
class PropertiesDismissButton extends Button {
hotjava wr;
PropertySheet props;
public PropertiesDismissButton(Container w,
PropertySheet f,
hotjava wr) {
super("Cancel", null, w);
this.wr = wr;
this.props = f;
}
public void selected(Component c, int pos) {
wr.readProperties();
props.setAllValues();
props.unMap();
}
}
class DeleteButton extends Button {
public DeleteButton(Container w, HotList hl) {
super("Delete",null,w);
hlist = hl;
}
public void selected(Component c, int pos) {
hlist.delete(hlist.selectedItem);
}
HotList hlist;
}
class ApplyButton extends Button {
public ApplyButton(Container w, PropertySheet f) {
super("Apply",null, w);
propSheet = f;
}
private void portError(String wouldBeNumber, String portName) {
MessageDialog error = propSheet.errorDialog;
error.setMessage("'"+wouldBeNumber+"' is not a valid "+portName+
" port number. Try again.");
error.show();
}
private void hostError(String wouldBeHost, String hostName) {
MessageDialog error = propSheet.errorDialog;
error.setMessage("'"+wouldBeHost+"' is not a valid "+hostName+
" host name. Try again.");
error.show();
}
public void selected(Component c, int pos) {
boolean wasError = false;
// Try to parse port numbers. If we fail, pitch an error dialog,
// and don't store any values.
String firewallPort = propSheet.fProxyPort.getText();
try {
HttpClient.firewallProxyPort = Integer.parseInt(firewallPort);
} catch (NumberFormatException e) {
portError(firewallPort, "Firewall Proxy");
propSheet.fProxyPort.setText(HttpClient.firewallProxyPort+"");
wasError = true;
}
String proxyPort = propSheet.cProxyPort.getText();
try {
HttpClient.cachingProxyPort = Integer.parseInt(proxyPort);
} catch (NumberFormatException e) {
portError(proxyPort, "Caching Proxy");
propSheet.cProxyPort.setText(HttpClient.cachingProxyPort+"");
wasError = true;
}
String ftpProxyPort = propSheet.ftpProxyPort.getText();
try {
FtpClient.ftpProxyPort = Integer.parseInt(ftpProxyPort);
} catch (NumberFormatException e) {
portError(ftpProxyPort, "FTP Proxy");
propSheet.ftpProxyPort.setText(FtpClient.ftpProxyPort+"");
wasError = true;
}
String firewallProxy = propSheet.fProxyField.getText();
try {
if (propSheet.fProxyToggle.getState()) {
InetAddress iaddr = InetAddress.getByName(firewallProxy);
}
HttpClient.firewallProxyHost = firewallProxy;
} catch (UnknownHostException e) {
hostError(firewallProxy, "Firewall Proxy");
propSheet.fProxyField.setText(HttpClient.firewallProxyHost);
wasError = true;
}
String cachingProxy = propSheet.cProxyField.getText();
try {
if (propSheet.cProxyToggle.getState()) {
InetAddress iaddr = InetAddress.getByName(cachingProxy);
}
HttpClient.cachingProxyHost = cachingProxy;
} catch (UnknownHostException e) {
hostError(cachingProxy, "Caching Proxy");
propSheet.cProxyField.setText(HttpClient.cachingProxyHost);
wasError = true;
}
String ftpProxy = propSheet.ftpProxyField.getText();
try {
if (propSheet.ftpProxyToggle.getState()) {
InetAddress iaddr = InetAddress.getByName(ftpProxy);
}
FtpClient.ftpProxyHost = ftpProxy;
} catch (UnknownHostException e) {
hostError(ftpProxy, "FTP Proxy");
propSheet.ftpProxyField.setText(FtpClient.ftpProxyHost);
wasError = true;
}
if (! wasError) {
if (WRTextItem.underlineAnchors != propSheet.ulField.getState()) {
WRTextItem.underlineAnchors = propSheet.ulField.getState();
propSheet.mw.doc.paint();
}
propSheet.mw.doc.setDelayImageLoading(propSheet.dilField.getState());
propSheet.mw.doc.setDelayAppletLoading(propSheet.dalField.getState());
HttpClient.useProxyForFirewall = propSheet.fProxyToggle.getState();
HttpClient.useProxyForCaching = propSheet.cProxyToggle.getState();
FtpClient.useFtpProxy = propSheet.ftpProxyToggle.getState();
propSheet.unMap();
// set and save properties
propSheet.mw.props.put("anchorStyle",
WRTextItem.underlineAnchors ?
"underline" : "plain");
propSheet.mw.props.put("delayAppletLoading",
WRWindow.delayAppletLoading ?
"true" : "false");
propSheet.mw.props.put("delayImageLoading",
WRWindow.delayImageLoading ?
"true" : "false");
propSheet.mw.props.put("firewallSet",
HttpClient.useProxyForFirewall ?
"true":"false");
propSheet.mw.props.put("firewallHost",
HttpClient.firewallProxyHost);
propSheet.mw.props.put("firewallPort", firewallPort);
propSheet.mw.props.put("proxySet",
HttpClient.useProxyForCaching ?
"true": "false");
propSheet.mw.props.put("proxyHost", HttpClient.cachingProxyHost);
propSheet.mw.props.put("proxyPort", proxyPort);
propSheet.mw.props.put("useFtpProxy",
FtpClient.useFtpProxy ?
"true": "false");
propSheet.mw.props.put("ftpProxyHost", FtpClient.ftpProxyHost);
propSheet.mw.props.put("ftpProxyPort", ftpProxyPort);
propSheet.mw.props.save();
}
}
PropertySheet propSheet;
}
class SaveButton extends Button {
public SaveButton(Container w, SourceViewer f) {
super("Save...",null, w);
sViewer = f;
}
public void selected(Component c, int pos) {
if (fdialog == null) {
fdialog = new FileDialog("Save HTML Source...", sViewer);
}
String path = fdialog.chooseFile(null);
if (path != null) {
try {
File fpath = new File(path);
PrintStream pStr = new PrintStream(new FileOutputStream(fpath));
pStr.print(sViewer.t.getText());
pStr.close();
} catch (Exception e) {
sViewer.status.setText("Error writing to " + path);
return;
}
sViewer.status.setText("Wrote " + path);
}
}
SourceViewer sViewer;
FileDialog fdialog = null;
}
class SourceViewer extends Frame implements Runnable {
URL doc;
TextArea t;
Label status;
SourceViewer(hotjava wr, URL doc) {
super(hotjava.server, true, wr, 725, 500, Color.lightGray);
this.doc = doc;
Font defaultFont = wServer.fonts.getFont("Courier", Font.PLAIN, 14);
setDefaultFont(hotjava.dialogFont);
setTitle("Source Viewer " + doc.toExternalForm());
Window w = new Window(this, "Center", background, 700, 300);
w.setLayout(new ColumnLayout(true));
t = new TextArea(w, "Center", defaultFont, 80, 24);
t.setHFill(true);
t.setVFill(true);
t.setEditable(false);
w = new Window(this,"South",background,700,200);
w.setLayout(new ColumnLayout(true));
Row row = new Row(w,null,true);
new SaveButton(row, this);
new DismissButton(row, this);
status = new Label("",null, w, defaultFont);
status.setHFill(true);
map();
resize();
new Thread(this, "SourceViewer").start();
}
public void run() {
InputStream in = null;
try {
in = doc.openStream();
} catch (FileNotFoundException e) {
t.setText(""); // can you say HACK?
return;
}
OutputStreamBuffer out = new OutputStreamBuffer();
byte buffer[] = new byte[1024];
while (true) {
int n = in.read(buffer, 0, buffer.length);
if (n < 0) {
break;
}
out.write(buffer, 0, n);
}
in.close();
t.setText(out.toString());
}
}
class PrintButton extends Button implements Runnable {
PrintDialog printDialog;
public PrintButton(Container w, PrintDialog f) {
super("Print",null, w);
printDialog = f;
}
public void selected(Component c, int pos) {
new Thread(this, "Print Dialog").start();
}
public void run() {
OutputStream os;
Dimension paper = null;
Properties props = printDialog.theWR.props;
Object prop;
String destType = null;
String paperType = null;
printDialog.theWR.setMessage("Printing...");
prop = props.get("printerName");
if (prop == null || !(prop instanceof String)
|| !((String) prop).equals(printDialog.printerName.getText()))
props.put("printerName", printDialog.printerName.getText());
prop = props.get("printCommand");
if (prop == null || !(prop instanceof String)
|| !((String) prop).equals(printDialog.commandName.getText()))
props.put("printCommand", printDialog.commandName.getText());
prop = props.get("printFile");
if (prop == null || !(prop instanceof String)
|| !((String) prop).equals(printDialog.fileName.getText()))
props.put("printFile", printDialog.fileName.getText());
if (printDialog.useFile.getState()){
destType = "file";
String file = printDialog.fileName.getText();
try {
os = (OutputStream) new FileOutputStream(file);
} catch (Exception e) {
printDialog.unMap();
printDialog.theWR.setMessage("Printing: Bad File...Cancelled");
return;
}
} else if (printDialog.useCommand.getState()){
destType = "command";
String command = printDialog.commandName.getText();
os = System.execout(command);
} else {
String printer;
if (printDialog.usePrinter.getState()) {
destType = "printer";
printer = printDialog.printerName.getText();
if (!printer.equals(""))
printer = " -d " + printer;
} else {
// assert(printDialog.useDefault.getState())
destType = "default";
printer = "";
}
os = System.execout("lp" + printer);
}
if (destType != null) {
prop = props.get("printDestination");
if (prop == null || !(prop instanceof String)
|| !((String) prop).equals(destType))
props.put("printDestination", destType);
}
if (printDialog.letterSheets.getState()) {
paperType = "letter";
paper = PSGraphics.Letter;
} else if (printDialog.legalSheets.getState()) {
paperType = "legal";
paper = PSGraphics.Legal;
} else if (printDialog.executiveSheets.getState()) {
paperType = "executive";
paper = PSGraphics.Executive;
} else if (printDialog.A4Sheets.getState()) {
paperType = "A4";
paper = PSGraphics.A4;
}
if (paperType != null) {
prop = props.get("paperType");
if (prop == null || !(prop instanceof String)
|| !((String) prop).equals(paperType))
props.put("paperType", paperType);
}
if (props.changed)
props.save();
Dimension layout = new Dimension(printDialog.theWin.width,
printDialog.theWin.height);
BufferedOutputStream bos = new BufferedOutputStream(os);
PSGraphics pg = new PSGraphics(printDialog.theWin, bos,
printDialog.theDoc.getTitle(),
layout, paper);
String finalmsg = "Printing...Done";
try {
printDialog.theWin.print(pg);
} catch (Exception e) {
e.printStackTrace();
finalmsg = "Printing: I/O Error...Cancelled";
}
try {
pg.close();
} catch (Exception e) {
finalmsg = "Printing: I/O Error...Cancelled";
}
printDialog.unMap();
printDialog.theWR.setMessage(finalmsg);
// REMIND: dispose is broken
// printDialog.dispose();
}
}
class DisposeButton extends Button {
Frame theFrame;
public DisposeButton(Container w, Frame f) {
this(w, f, "Cancel");
}
public DisposeButton(Container w, Frame f, String label) {
super(label, null, w);
theFrame = f;
}
public void selected(Component c, int pos) {
theFrame.unMap();
// REMIND: dispose is broken
// theFrame.dispose();
}
}
class PrintDialog extends Frame {
hotjava theWR;
Document theDoc;
WRWindow theWin;
RadioGroup paperSize = new RadioGroup();
Toggle letterSheets;
Toggle legalSheets;
Toggle executiveSheets;
Toggle A4Sheets;
RadioGroup destType = new RadioGroup();
Toggle useDefault;
Toggle usePrinter;
Toggle useFile;
Toggle useCommand;
TextField printerName;
TextField fileName;
TextField commandName;
public PrintDialog(hotjava wr, Document doc) {
super(hotjava.server, true, wr, 400, 270, Color.lightGray);
setDefaultFont(hotjava.dialogFont);
setTitle("Print HotJava Document");
theWR = wr;
theWin = wr.doc;
theDoc = doc;
Window w;
RowColLayout r;
Properties props = theWR.props;
Object prop;
String propStr;
prop = props.get("paperType");
if (prop != null && (prop instanceof String))
propStr = (String) prop;
else
propStr = "";
w = new Window(this, "Page Sizes", background, 400, 40);
r = new RowColLayout(0, 7, true);
r.setGaps(0,0,0,0);
w.setLayout(r);
new Label("Paper Size:", null, w);
new Label("", null, w); // Extra label provides gap before choices.
letterSheets = new Toggle("Letter", null, w, paperSize,
propStr.equals("letter"));
legalSheets = new Toggle("Legal", null, w, paperSize,
propStr.equals("legal"));
executiveSheets = new Toggle("Executive", null, w, paperSize,
propStr.equals("executive"));
A4Sheets = new Toggle("A4", null, w, paperSize,
propStr.equals("A4"));
if (paperSize.getCurrent() == null)
letterSheets.setState(true);
w.move(0, 0);
prop = props.get("printDestination");
if (prop != null && (prop instanceof String))
propStr = (String) prop;
else
propStr = "default";
String defPrinter = System.getenv("PRINTER");
if (defPrinter == null)
defPrinter = "";
w = new Window(this, "Destinations Title", background, 400, 30);
new Label("Print Destinations", null, w);
w.move(0, 40);
w = new Window(this, "Default Destination", background, 400, 40);
r = new RowColLayout(0, 2, true);
r.setGaps(0,0,0,0);
w.setLayout(r);
useDefault = new Toggle(" System Default Printer: " + defPrinter,
null, w, destType, propStr.equals("default"));
w.move(0, 70);
w = new Window(this, "Other Destinations", background, 400, 120);
r = new RowColLayout(0, 2, true);
r.setGaps(0,0,0,4);
w.setLayout(r);
usePrinter = new Toggle("Printer:", null, w, destType,
propStr.equals("printer"));
prop = props.get("printerName");
if (prop == null || !(prop instanceof String))
prop = defPrinter;
printerName = new TextField((String) prop, null, w, true);
useFile = new Toggle("File:", null, w, destType,
propStr.equals("file"));
prop = props.get("printFile");
if (prop == null || !(prop instanceof String))
prop = (Object) "/tmp/";
fileName = new TextField((String) prop, null, w, true);
useCommand = new Toggle(" Command:", null, w, destType,
propStr.equals("command"));
prop = props.get("printCommand");
if (prop == null || !(prop instanceof String))
prop = (Object) "lp";
commandName = new TextField((String) prop, null, w, true);
if (destType.getCurrent() == null)
useDefault.setState(true);
w.move(0, 110);
w = new Window(this, "Buttons", background, 400, 40);
new PrintButton(w, this);
new DisposeButton(w, this);
w.move(0, 230);
resize();
}
}
class PropertySheet extends Frame {
public PropertySheet(hotjava wr) {
super(hotjava.server, true, wr, 500, 446, Color.lightGray);
setDefaultFont(hotjava.dialogFont);
setTitle("HotJava Properties");
mw = wr;
RowColLayout r;
Window w;
int h;
String acl;
String path = System.getenv("HOME") + File.separator +
".hotjava" + File.separator + "properties";
File wpath = new File(System.getenv("HOME") +
File.separator + ".hotjava");
wpath.mkdir();
propFile = new File(path);
w = new Window(this,"Center", background, 300, 130);
r = new RowColLayout(0, 2, true);
r.setGaps(0,0,0,0);
w.setLayout(r);
// XXX: this layout needs fixing...
fProxyToggle = new Toggle("Firewall Proxy","proxy",w,
HttpClient.useProxyForFirewall);
new Label("Port",null, w);
fProxyField = new TextField(HttpClient.firewallProxyHost,
null,w,true);
fProxyPort = new TextField("" + HttpClient.firewallProxyPort,
null,w,true);
ftpProxyToggle = new Toggle("FTP Proxy",
null,w,FtpClient.useFtpProxy);
new Label("Port",null, w);
ftpProxyField = new TextField(FtpClient.ftpProxyHost,
null,w,true);
ftpProxyPort = new TextField("" + FtpClient.ftpProxyPort,
null,w,true);
cProxyToggle = new Toggle("Caching Proxy",null,w,
HttpClient.useProxyForCaching);
new Label("Port",null, w);
cProxyField = new TextField(HttpClient.cachingProxyHost,
null,w,true);
cProxyPort = new TextField("" + HttpClient.cachingProxyPort,
null,w,true);
new Label("Read Path:",null,w);
acl = File.getReadACL();
new TextField(acl,null,w,false);
new Label("Write Path:",null,w);
acl = File.getWriteACL();
new TextField(acl,null,w,false);
//new Label("Delay Image loading:","dil",w);
new Label("Underline anchors:",null,w);
ulField = new Toggle("", null,w,WRTextItem.underlineAnchors);
new Label("Delay image loading:",null,w);
dilField = new Toggle("", null,w,WRWindow.delayImageLoading);
new Label("Delay applet loading:",null,w);
dalField = new Toggle("", null,w,WRWindow.delayAppletLoading);
w = new Window(this,"South",background,300,50);
new ApplyButton(w, this);
new PropertiesDismissButton(w, this, wr);
errorDialog = new MessageDialog(this, "Error", null,
MessageDialog.ERROR_TYPE, 1, true,
null, null, null, null);
}
void setAllValues() {
ulField.setState(WRTextItem.underlineAnchors);
dilField.setState(mw.doc.delayImageLoading);
dalField.setState(mw.doc.delayAppletLoading);
fProxyToggle.setState(HttpClient.useProxyForFirewall);
fProxyField.setText(HttpClient.firewallProxyHost);
fProxyPort.setText(HttpClient.firewallProxyPort+"");
cProxyToggle.setState(HttpClient.useProxyForCaching);
cProxyField.setText(HttpClient.cachingProxyHost);
cProxyPort.setText(HttpClient.cachingProxyPort+"");
ftpProxyToggle.setState(FtpClient.useFtpProxy);
ftpProxyField.setText(FtpClient.ftpProxyHost);
ftpProxyPort.setText(FtpClient.ftpProxyPort+"");
}
void show() {
setAllValues();
map();
resize();
}
hotjava mw;
TextField fProxyField;
TextField fProxyPort;
Toggle fProxyToggle;
TextField cProxyField;
TextField cProxyPort;
Toggle cProxyToggle;
Toggle ftpProxyToggle;
TextField ftpProxyField;
TextField ftpProxyPort;
File propFile;
Toggle ulField;
Toggle dilField;
Toggle dalField;
MessageDialog errorDialog;
}
class OpenButton extends Button {
public OpenButton(Container w, OpenDialog d, hotjava mw) {
super("Open",null, w);
target = mw;
dialog = d;
}
public void selected(Component c, int pos) {
dialog.unMap();
target.doc.pushURL(new URL(null, dialog.urlField.getText()));
}
hotjava target;
OpenDialog dialog;
}
class OpenTextField extends TextField {
hotjava target;
OpenTextField(Window w, hotjava mw) {
super("",null,w,true);
target = mw;
}
public void selected() {
target.doc.pushURL(new URL(null, getText()));
}
}
class OpenDialog extends Frame {
TextField urlField;
public OpenDialog(WServer server, hotjava w) {
super(server, true, w, 400, 120, Color.lightGray);
setTitle("Open URL...");
setDefaultFont(hotjava.dialogFont);
Window cw = new Window(this, "Center", background, 300, 100);
urlField = new OpenTextField(cw,w);
urlField.setHFill(true);
new OpenButton(cw, this, w);
new DismissButton(cw, this);
}
}
class HotListItem {
public String url;
public boolean inMenu;
public MenuItem menuItem;
public HotListItem(String url, boolean inMenu) {
this.url = url;
this.inMenu = inMenu;
}
public String toString() {
String m;
if (menuItem != null) {
m = "<menuitem>";
} else {
m = null;
}
return "HotListItem[" + url + ", " + inMenu + ", " + m + "]";
}
}
class MenuToggle extends Toggle {
HotList target;
public MenuToggle(Container parent, HotList target) {
super("In Goto Menu",null,parent, false);
this.target = target;
}
public void selected() {
target.changeMenuStatus(getState(), target.selectedItem);
}
}
class HotList extends Frame implements ChoiceHandler {
String hName;
String home;
File hotlist;
Window cw;
int selectedItem;
HotlistGotoButton gotoButton;
List slist;
Vector urlList;
Vector inMenuList;
hotjava mw;
TextField urlValue;
Toggle inMenuToggle;
public HotList(WServer server, hotjava w) {
super(server, true, w, 300, 400, Color.lightGray);
setTitle("HotJava Hotlist");
setDefaultFont(hotjava.dialogFont);
Label l;
mw = w;
cw = new Window(this, "Center", background, 300, 200);
cw.setLayout(new ColumnLayout(true));
slist = new List(cw,this,null, 10, false);
slist.setHFill(true);
slist.setVFill(true);
urlList = new Vector();
inMenuList = new Vector();
readHotList("default");
cw = new Window(this, "South", background, 300, 100);
cw.setLayout(new ColumnLayout(true));
new Label("URL:", null, cw);
urlValue = new TextField("",null,cw, false);
urlValue.setHFill(true);
Row row = new Row(cw, null, true);
inMenuToggle = new MenuToggle(row,this);
row = new Row(cw, null, true);
gotoButton = new HotlistGotoButton(row, this);
new DeleteButton(row, this);
new DismissButton(row, this);
selectedItem = 0;
}
/**
* Change whether the given item is in the Goto menu or not.
*/
public void changeMenuStatus(boolean inMenu, int index) {
HotListItem hItem = (HotListItem)urlList.elementAt(index);
String title = slist.itemAt(index);
if (hItem.inMenu == inMenu) {
return;
}
if (inMenu) {
hItem.menuItem = mw.gotoMenu.addHotItem(title, hItem.url);
} else {
if (hItem.menuItem != null) {
hItem.menuItem.dispose();
}
}
hItem.inMenu = inMenu;
if (index == selectedItem && inMenu != inMenuToggle.getState()) {
inMenuToggle.setState(inMenu);
}
write();
}
/**
* Add an item to the hotlist
*/
public void addItem(String title,
String url,
boolean inMenu,
boolean checkMenu) {
HotListItem prev;
int i;
int nitems = urlList.size();
for (i=0; i < nitems; i++) {
prev = (HotListItem)urlList.elementAt(i);
if (prev.url.equals(url)) {
if (checkMenu) {
changeMenuStatus(inMenu, i);
}
return;
}
}
if (title.length() == 0) {
title = "Untitled (" + url + ")";
}
slist.addItem(title);
urlList.addElement(prev = new HotListItem(url, false));
if (checkMenu && inMenu) {
prev.inMenu = inMenu;
prev.menuItem = mw.gotoMenu.addHotItem(title, url);
}
write();
}
/**
* write out this hotlist.
*/
public void write() {
FileOutputStream outStr;
PrintStream pStr;
int i;
int nitems = urlList.size();
File hfile;
HotListItem hItem;
hfile = new File(hotlist.getParent());
hfile.mkdir();
outStr = new FileOutputStream(hotlist);
pStr = new PrintStream(outStr);
pStr.println("hotjava-hotlist-version-1");
pStr.println(hName);
for (i = 0; i < nitems; i++) {
hItem = (HotListItem)urlList.elementAt(i);
if (hItem.inMenu) {
pStr.println(hItem.url + " inMenu");
} else {
pStr.println(hItem.url);
}
pStr.println(slist.itemAt(i));
}
outStr.close();
}
/**
* Delete the given item from the hotlist. Assumes item is the
* current one selected, so clears the URL value.
*/
public void delete(int item) {
HotListItem hItem = (HotListItem)urlList.elementAt(item);
slist.delItem(item);
if (hItem.inMenu && hItem.menuItem != null) {
hItem.menuItem.dispose();
}
urlList.removeElementAt(item);
urlValue.setText("");
write();
}
public void readHotList(String name) {
FileInputStream fstream;
String hlPath;
hlPath = System.getenv("HOME") + File.separator + ".hotjava" +
File.separator + "hotlist-" + name;
hName = name;
try {
hotlist = new File(hlPath);
fstream = new FileInputStream(hotlist);
} catch (Exception e) {
try {
hotlist = new File(System.getenv("HOME") + File.separator + ".mosaic-hotlist-default");
fstream = new FileInputStream(hotlist);
} catch (Exception ee) {
return;
}
}
DataInputStream dis = new DataInputStream(fstream);
String url;
String title;
/* read version number and stupid line after it */
dis.readLine();
dis.readLine();
try {
while (true) {
url = dis.readLine();
title = dis.readLine();
if (url == null || title == null) {
break;
}
int separator = url.indexOf(' ');
boolean putInMenu = false;
if (separator != -1) {
if (url.substring(separator).startsWith(" inMenu")) {
putInMenu = true;
}
url = url.substring(0, separator);
}
HotListItem item = new HotListItem(url, putInMenu);
urlList.addElement(item);
slist.addItem(title);
if (putInMenu) {
item.menuItem = mw.gotoMenu.addHotItem(title, item.url);
}
}
} finally {
fstream.close();
}
hotlist = new File(hlPath);
}
public void selected(Component c, int pos) {
HotListItem hItem;
selectedItem = pos;
hItem = (HotListItem)urlList.elementAt(pos);
inMenuToggle.setState(hItem.inMenu);
urlValue.setText(hItem.url);
}
public void doubleClick(Component c, int pos) {
selectedItem = pos;
gotoButton.selected(c, pos);
}
}
class HelpMenu extends Menu {
hotjava mw;
static String topics[] = {
"doc:readme.html",
"doc:copyright.html",
"doc:index.html",
"doc:/doc/misc/using.html",
"http://java.sun.com/",
"doc:demo/index.html",
"doc:/doc/misc/people.html",
"doc:/doc/misc/BugReport.html",
"doc:/doc/misc/Register.html",
"doc:/doc/",
"doc:/doc/misc/JavaSearchHelp.html"
};
public HelpMenu(MenuBar mbar, hotjava w) {
super("Help", mbar);
mw = w;
MenuItem item;
new MenuItem("README!", this);
new MenuItem("Copyright and License", this);
addSeparator();
new MenuItem("About HotJava", this);
new MenuItem("Using HotJava", this);
new MenuItem("Latest HotJava Info", this);
new MenuItem("HotJava Demos", this);
new MenuItem("Meet the People", this);
addSeparator();
new MenuItem("Submit a Bug Report", this);
new MenuItem("Register", this);
addSeparator();
new MenuItem("HotJava Documentation", this);
new MenuItem("How to Search the Documentation", this);
new MenuItem("Search HotJava Documentation...", this);
}
public void selected(int index) {
if (index >= topics.length) {
if (mw.searchWindow == null) {
mw.searchWindow = new SearchWindow(mw, mw.server);
}
mw.searchWindow.map();
mw.searchWindow.resize();
} else {
mw.doc.pushURL(new URL(null, topics[index]));
}
}
}
class UrlField extends TextField {
public UrlField(String value, Container parent, hotjava w) {
super(value, null, parent, true);
setColor(Color.black);
setFont(hotjava.inputFont);
mw = w;
}
public void selected() {
mw.doc.pushURL(new URL(null, getText()));
}
hotjava mw;
}
class InfoWindow extends Window {
Label urlTitle;
TextField urlField;
final int sepBarHeight = 2;
public InfoWindow(hotjava hj) {
super(hj, "North", hj.background, 100, 10);
setLayout(new RowLayout(true));
Column col = new Column(this, null, false);
new Space(col, null, 10, 3, false, false);
urlTitle = new Label("Document URL:", null, col, hotjava.labelFont);
urlTitle.setColor(hotjava.blue);
urlField = new UrlField("", this, hj);
urlField.setHFill(true);
}
public void paint() {
paint3DRect(0, height - sepBarHeight, width, sepBarHeight, false, true);
}
}
class FindHandler implements DialogHandler {
/** The HotJava in which we reside. */
hotjava wr;
/** The document window we're leaching off of. */
WRWindow docWin;
/** Where we should start (or resume) searching from. */
int fromPos = 0;
FindHandler(hotjava runner) {
wr = runner;
docWin = runner.doc;
}
public void okCallback(Dialog m) {
String text = ""; //docWin.document().getText();
StringDialog sd = (StringDialog)m;
String lookFor = sd.getText();
int index = text.indexOf(lookFor, fromPos);
if (index != -1) {
docWin.scrollToTextPosition(index);
wr.setMessage("Found '"+lookFor+"' at character "+index+".");
fromPos = index + 1;
} else {
String msg = "Not found. Start again from beginning?";
MessageDialog md = new MessageDialog(sd, "Not found", msg,
MessageDialog.QUESTION_TYPE,
2, true, null, null, null,
null);
boolean startOver = (md.show() == 1); // user pressed OK button
if (startOver) {
fromPos = 0;
docWin.scrollToTextPosition(0);
// do some sort of highlighting here, when possible.
} else {
sd.hide();
}
}
// now change message to "find again" and let user do it again
sd.setTitle("Find again");
}
/** Invoked when the user presses the "Cancel" button. */
public void cancelCallback(Dialog m) {
m.hide();
}
/** Invoked when the user presses the "Help" button. */
public void helpCallback(Dialog m) {
}
}
class HistoryItem {
URL url;
String title;
HistoryItem(URL url, String title) {
this.url = url;
this.title = title;
}
}
class HistoryWindow extends Frame implements ChoiceHandler, Runnable {
hotjava wRunner;
TextField urlValue;
HistoryVector historyVec;
int lastUpdated;
int selectedItem;
List scrollingList;
Vector urlList;
public synchronized void newElement() {
notify();
}
public synchronized void run() {
while (true) {
wait();
int time = historyVec.getTimeStamp();
if (mapped && (lastUpdated != time)) {
stickHistoryOnList();
lastUpdated = time;
}
}
}
public HistoryWindow(WServer server, hotjava w, HistoryVector history) {
super(server, true, w, 300, 400, Color.lightGray);
setTitle(hotjava.programName+" History");
setDefaultFont(hotjava.dialogFont);
historyVec = history;
urlList = new Vector();
Label l;
Window cw;
cw = new Window(this, "Center", background, 300, 350);
cw.setLayout(new ColumnLayout(true));
scrollingList = new List(cw, this, "", 14, false, false);
scrollingList.setHFill(true);
scrollingList.setVFill(true);
cw = new Window(this, "South", background, 300, 50);
cw.setLayout(new ColumnLayout(true));
urlValue = new TextField("destination URL", "urlValue", cw, false);
urlValue.setHFill(true);
Row row = new Row(cw, null, true);
new HistoryGotoButton(row, this);
new DismissButton(row, this);
selectedItem = 0;
wRunner = w;
Thread th = new Thread(this);
th.setName("History Updater");
th.start();
}
private void showURL(int pos) {
URL url = (URL)urlList.elementAt(pos);
urlValue.setText(url.toExternalForm());
}
public void selected(Component c, int pos) {
selectedItem = pos;
showURL(selectedItem);
}
public void doubleClick(Component c, int pos) {
selectedItem = pos;
gotoDocument();
}
public void showWindow() {
map();
resize();
wServer.sync();
int time = historyVec.getTimeStamp();
if (lastUpdated != time) {
stickHistoryOnList();
lastUpdated = time;
}
}
public void gotoDocument() {
wRunner.doc.pushURL((URL)urlList.elementAt(selectedItem));
}
public void stickHistoryOnList() {
scrollingList.clear();
urlList.removeAllElements();
for (int i = 0; i < historyVec.size(); i++) {
HistoryItem dInfo = (HistoryItem)historyVec.elementAt(i);
URL url = dInfo.url;
String title = dInfo.title;
if (title == null || title.length() == 0) {
title = hotjava.untitledTitle+" ("+url.toExternalForm()+")";
}
scrollingList.addItem(title);
urlList.addElement(url);
}
if (historyVec.size() > 0) {
int showItem = historyVec.getCurrent();
scrollingList.makeVisible(showItem);
scrollingList.select(showItem);
showURL(showItem);
}
}
}
class HistoryGotoButton extends Button {
public HistoryGotoButton(Container w, HistoryWindow hw) {
super("Visit", null, w);
histWin = hw;
}
public void selected(Component c, int pos) {
histWin.gotoDocument();
}
HistoryWindow histWin;
}