📄 xhtmldocument.java
字号:
/****************************************************************
* XBrowser - eXtended web Browser *
* *
* Copyright (c) 2000-2001 Armond Avanes *
* Refer to ReadMe & License files for more information *
* *
* *
* By: Armond Avanes *
* Armond555@yahoo.com & Armond333@yahoo.com *
* http://xbrowser.sourceforge.net/ *
*****************************************************************/
package xbrowser.renderer.custom;
import java.util.*;
import java.net.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import xbrowser.renderer.XRenderer;
import xbrowser.renderer.custom.js.*;
public class XHTMLDocument extends HTMLDocument implements XIScriptConsumer {
public XHTMLDocument(StyleSheet styles) {
super(styles);
}
private synchronized void ensureJSThread() {
if( jsThread == null) {
jsThread = new XJSThread( getBase(), this);
if( jsThread instanceof XIScriptConsumer)
sink = (XIScriptConsumer)jsThread;
jsThread.start();
}
}
public void addScript( String script, Element startTag) {
ensureJSThread();
if( sink != null)
sink.addScript( script, startTag);
}
public void addScriptLink( String src) {
ensureJSThread();
if( sink != null )
sink.addScriptLink( src);
}
public XDOM getSink() {
ensureJSThread();
if( sink != null)
return sink.getSink();
return null;
}
public void setEndScriptTag( Element startTag, Element endTag) {
if( sink != null)
sink.setEndScriptTag( startTag, endTag);
else
XRendererSupport.getContext().getLogger().error( this, "setCurScript(): sink == null?");
}
public void endParsing() {
ensureJSThread();
if( sink != null)
sink.endParsing();
}
public synchronized void stopJScript() {
if( jsThread != null) {
jsThread.interrupt();
jsThread = null; // free thread
}
}
public XRenderer getWindow() {
return window;
}
public void setWindow( XRenderer wnd) {
window = wnd;
}
public XJSThread getDocThread() {
ensureJSThread();
return (XJSThread)jsThread;
}
public synchronized void addSaveThread( Thread imgSave) {
if( imageSaveQueue == null)
imageSaveQueue = new LinkedList();
imageSaveQueue.add( imgSave);
}
public synchronized void removeSaveThread( Thread imgSave) {
if( imageSaveQueue != null) {
imageSaveQueue.remove( imgSave);
// We now can show message '73 images of 999 are loaded...'
// Do after making XImageView.
}
}
public synchronized java.util.List getSaveQueue() {
if( imageSaveQueue == null)
imageSaveQueue = new LinkedList();
return imageSaveQueue;
}
public HTMLEditorKit.ParserCallback getReader(int pos) {
Object desc = getProperty(Document.StreamDescriptionProperty);
if (desc instanceof URL)
setBase((URL)desc);
HTMLDocument.HTMLReader reader = new XHTMLReader(pos);
return reader;
}
public class XHTMLReader extends HTMLDocument.HTMLReader {
public XHTMLReader( int pos) {
super( pos);
inBody = false;
inScript = false;
lastScriptStart = -1;
}
public void handleStartTag( HTML.Tag t, MutableAttributeSet a, int pos) {
if( t == HTML.Tag.BODY) {
inBody = true;
} else
if( ! inBody && t == HTML.Tag.SCRIPT) {
inScript = true;
lastScriptStart = pos;
// Maybe src?
Object src = a.getAttribute( HTML.Attribute.SRC);
if( src != null) {
addScriptLink( (String)src);
debugExtract( "Script SRC", (String)src);
}
}
super.handleStartTag( t, a, pos);
}
public void handleEndTag( HTML.Tag t, int pos) {
if( inScript && t == HTML.Tag.SCRIPT)
inScript = false;
else if( t==HTML.Tag.HTML )
endParsing();
super.handleEndTag( t, pos);
}
public void handleComment(char[] data, int pos) {
if (! inBody && inScript) {
String script = new String(data);
// Bugfix: first line of comment does not execute.
int iLinePos = script.indexOf( '\n');
if( iLinePos >= 0) {
script = script.substring( iLinePos+1);
addScript( script, null);
}
debugExtract( "In head in comment", script);
}
super.handleComment( data, pos);
}
public void handleText(char[] data, int pos) {
if (! inBody && inScript) {
String script = new String(data);
addScript( script, null);
debugExtract( "In head", script);
}
super.handleText( data, pos);
}
private void debugExtract( String where, String script) {
if( DEBUG_EXTRACT )
XRendererSupport.getContext().getLogger().message(this, where + ": {" + script + "}");
}
// Attributes:
boolean inBody;
boolean inScript;
int lastScriptStart;
} // class XHTMLReader
// Attributes:
private static final boolean DEBUG_EXTRACT = false;
protected Thread jsThread = null;
protected XIScriptConsumer sink = null;
protected LinkedList imageSaveQueue = null;
XRenderer window;
} // class XHTMLDocument
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -