/**
 * @(#)HTMLEditorKitEx.java
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 * @author  Intelligent Technology Inc.
 * @version 1.00 2002/09/02
 */
package	jp.co.nri.rid.web;

import	java.io.*;
import	javax.swing.text.*;
import	javax.swing.text.html.*;
import	javax.swing.text.html.parser.*;

/**
 * WebPageクラス用に機能を拡張したHTMLEditorKit。
 */
public class HTMLEditorKitEx extends HTMLEditorKit{
	private boolean ese;
	
	protected Parser getParser(){ return new ParserEx(); }
	
	public boolean isEmptyStack(){ return ese; }
	
	private class ParserEx extends ParserDelegator{
	    public void parse(Reader r, HTMLEditorKit.ParserCallback cb, boolean ignoreCharSet) throws IOException {
			new DocumentParserEx(DTD.getDTD("html32")).parse(r, cb, ignoreCharSet);
	    }
	}
	
	private class DocumentParserEx extends DocumentParser{
		private HTMLDocumentEx.HTMLReaderEx reader;
		private boolean end;
		
		public DocumentParserEx(DTD dtd){ super(dtd); }
		
		public void parse(Reader in,  HTMLEditorKit.ParserCallback callback, boolean ignoreCharSet) throws IOException {
			reader	= (HTMLDocumentEx.HTMLReaderEx)callback;
			end		= false;
			ese		= false;
			super.parse(in ,callback ,ignoreCharSet);
    	}
		
		protected  void handleEndTag(TagElement tag){	// 終了タグを検出したときに呼び出されます。
			if(end){
				ese = true;
				return;
			}
			
			if("html".equalsIgnoreCase(tag.getHTMLTag().toString()))	end = true;
			super.handleEndTag(tag);
		}
		
		protected  void handleStartTag(TagElement tag){	// 開始タグを検出したときに呼び出されます。
			if(!end)	super.handleStartTag(tag);
			else		ese = true;
		}
		
		protected  void handleComment(char[] text){	// HTML のコメントを検出したときに呼び出されます。
			if(!end)	super.handleComment(text);
			else		ese = true;
		}
		
		protected  void handleEmptyTag(TagElement tag) throws ChangedCharSetException{	// 空のタグを検出したときに呼び出されます。
			if(!end)	super.handleEmptyTag(tag);
			else		ese = true;
		}
		
		protected  void handleText(char[] text){	// PCDATA を検出したときに呼び出されます。 
			if(!end)	super.handleText(text);
			else		ese = true;
		}
		
		protected  void handleTitle(char[] text){	// HTML の title タグを検出したときに呼び出されます。
			if(!end)	super.handleTitle(text);
			else		ese = true;
		}
	}

}
