001 package org.util.xml; 002 003 import java.awt.*; 004 import java.awt.event.*; 005 import java.awt.geom.*; 006 import java.io.*; 007 import java.net.*; 008 import javax.swing.*; 009 import javax.swing.event.*; 010 011 import org.util.xml.element.*; 012 import org.util.xml.parse.*; 013 import org.util.xml.parse.policy.*; 014 //import org.util.xml.renderer.html.*; 015 import org.util.html.objects.*; 016 017 import static org.gui.GUITool.alert; 018 import static org.gui.GUITool.showFrame; 019 020 /** 021 * 022 * @author masaru 023 */ 024 public class Main6 { 025 026 private JPanel panel_; 027 private JTextArea text_area_; 028 private String doctype_; 029 private JTextField text_; 030 031 private ParserPolicy keep_all_parser_; 032 private ParserPolicy body_tag_parser_; 033 private ParserPolicy html_tag_parser_; 034 private ParserPolicy html_document_parser_; 035 036 037 038 public static void main(String[] args) throws Exception { 039 040 final Main6 main = new Main6(); 041 main.start(); 042 // main.openInOtherThread("http://sakura.meijo-u.ac.jp/index.html"); 043 //main.openInOtherThread("http://sakura.meijo-u.ac.jp/~tatsunootoshigo2008/"); 044 } 045 046 public Main6() { 047 048 } 049 050 public void start() throws Exception { 051 //org.gui.GUITool.tryToSetSystemLookAndFeel(); 052 053 SwingUtilities.invokeAndWait(new Runnable(){public void run() { 054 text_ = new JTextField(); 055 text_.addActionListener(new ActionListener(){ 056 public void actionPerformed(ActionEvent e) { 057 String url_text = text_.getText(); 058 openInOtherThread(url_text); 059 } 060 }); 061 062 JPanel menu = new JPanel(); 063 menu.setLayout(new BoxLayout(menu, BoxLayout.X_AXIS)); 064 menu.setPreferredSize(new Dimension(500, 30)); 065 menu.add(text_); 066 067 JPanel contentpane = new JPanel(new BorderLayout()); 068 contentpane.setPreferredSize(new Dimension(500, 400)); 069 //text_area_ = new JTextArea(); 070 //contentpane.add(new JScrollPane(text_area_), BorderLayout.CENTER); 071 panel_ = new JPanel(); 072 panel_.setLayout(new BoxLayout(panel_, BoxLayout.Y_AXIS)); 073 //panel_.setPreferredSize(new Dimension(500, 400)); 074 contentpane.add(menu, BorderLayout.NORTH); 075 contentpane.add(new JScrollPane(panel_), BorderLayout.CENTER); 076 showFrame(contentpane, JFrame.EXIT_ON_CLOSE); 077 }}); 078 079 080 081 keep_all_parser_ = new HTMLParserPolicy() { 082 @Override 083 public boolean throwExceptionIfDocumentHasError() { 084 return false; 085 } 086 public ParserPolicy getInnerPolicy(Element element) { 087 return this; 088 } 089 public Element allowElement(Element element) { 090 return element; 091 } 092 }; 093 094 095 body_tag_parser_ = new HTMLParserPolicy() { 096 @Override 097 public boolean throwExceptionIfDocumentHasError() { 098 return false; 099 } 100 public ParserPolicy getInnerPolicy(Element element) { 101 TagElement tag = (TagElement)element; 102 /* 103 if(tag.getKey().toLowerCase().equals("html")) 104 return html_tag_parser; 105 */ 106 return this; 107 } 108 public Element allowElement(Element element) { 109 //panel_.add(new JButton(element.toString())); 110 if(!element.isTagElement()) { 111 HTMLText text = new HTMLText(root_); 112 text.setText(((TextElement)element).getValue()); 113 panel_.add(text.getPanel()); 114 }else{ 115 TagElement tag = (TagElement)element; 116 String key = tag.getKey().toLowerCase(); 117 if(key.equals("a")) { 118 119 }else if(key.equals("img")) { 120 try{ 121 HTMLImg img = new HTMLImg(root_); 122 img.setURL(root_.getDocumentBase().toURI().resolve(tag.getAttributeValue("src", "")).toURL()); 123 panel_.add(img.getPanel()); 124 }catch(Exception e) {e.printStackTrace();} 125 }else{ 126 JLabel label = new JLabel("<html>"+tag.toString()+"</html>"); 127 label.setBorder(BorderFactory.createLineBorder(Color.blue)); 128 label.setToolTipText(tag.toString()); 129 panel_.add(label); 130 } 131 } 132 panel_.revalidate(); 133 return null; 134 } 135 }; 136 137 138 139 html_tag_parser_ = new HTMLParserPolicy() { 140 @Override 141 public boolean throwExceptionIfDocumentHasError() { 142 return false; 143 } 144 public ParserPolicy getInnerPolicy(Element element) { 145 if(!element.isTagElement()) return keep_all_parser_; 146 TagElement tag = ((TagElement)element); 147 if(tag.getKey().toLowerCase().equals("body")) 148 return body_tag_parser_; 149 return keep_all_parser_; 150 } 151 public Element allowElement(Element element) { 152 //panel_.add(new JButton(element.toString())); 153 return element; 154 } 155 }; 156 157 html_document_parser_ = new HTMLParserPolicy() { 158 @Override 159 public boolean throwExceptionIfDocumentHasError() { 160 return false; 161 } 162 public String selectEncoding(String last_tag_key) { 163 return "utf-8"; 164 } 165 public ParserPolicy getInnerPolicy(Element element) { 166 TagElement tag = (TagElement)element; 167 if(tag.getKey().toLowerCase().equals("html")) 168 return html_tag_parser_; 169 return keep_all_parser_; 170 } 171 public Element allowElement(Element element) { 172 if(element.isTextElement()) { 173 TextElement text_tag = (TextElement)element; 174 String text = text_tag.getValue(); 175 if(text.toLowerCase().startsWith("doctype")) { 176 doctype_ = text; 177 return null; 178 } 179 } 180 return null; 181 } 182 }; 183 184 185 } 186 187 public void openInOtherThread(final String url_text) { 188 new Thread(new Runnable(){public void run(){ 189 try{ 190 open(url_text); 191 }catch(Exception e){e.printStackTrace();} 192 }}, "open url").start(); 193 } 194 195 HTMLDocument root_ = new HTMLDocument(); 196 197 public void open(String url_text) throws Exception { 198 panel_.removeAll(); 199 200 URL url = new URL(url_text); 201 root_.setDocumentBase(url); 202 203 ElementParser parser; 204 /* 205 parser= new ElementParser(url.openStream()); 206 Element[] all = parser.parse(); 207 for(Element a : all) 208 panel_.add(new JLabel(a.toString())); 209 panel_.revalidate(); 210 211 alert("now starting parse"); 212 */ 213 parser = new ElementParser(url.openStream()); 214 parser.setDocumentBase(url.toURI()); 215 216 parser.setPolicy(html_document_parser_); 217 parser.parse(); 218 219 panel_.revalidate(); 220 } 221 222 223 224 225 226 227 228 229 }