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
016 import static org.gui.GUITool.alert;
017 import static org.gui.GUITool.showFrame;
018
019 /**
020 *
021 * @author masaru
022 */
023 public class Main5 {
024
025 private JPanel panel_;
026 private JTextArea text_area_;
027 private String doctype_;
028 private JTextField text_;
029
030 private ParserPolicy keep_all_parser_;
031 private ParserPolicy body_tag_parser_;
032 private ParserPolicy html_tag_parser_;
033 private ParserPolicy html_document_parser_;
034
035
036
037 public static void main(String[] args) throws Exception {
038
039 final Main5 main = new Main5();
040 main.start();
041 main.openInOtherThread("http://sakura.meijo-u.ac.jp/index.html");
042 }
043
044 public Main5() {
045
046 }
047
048 public void start() throws Exception {
049 //org.gui.GUITool.tryToSetSystemLookAndFeel();
050
051 SwingUtilities.invokeAndWait(new Runnable(){public void run() {
052 text_ = new JTextField();
053 text_.addActionListener(new ActionListener(){
054 public void actionPerformed(ActionEvent e) {
055 String url_text = text_.getText();
056 openInOtherThread(url_text);
057 }
058 });
059
060 JPanel menu = new JPanel();
061 menu.setLayout(new BoxLayout(menu, BoxLayout.X_AXIS));
062 menu.setPreferredSize(new Dimension(500, 30));
063 menu.add(text_);
064
065 JPanel contentpane = new JPanel(new BorderLayout());
066 contentpane.setPreferredSize(new Dimension(500, 400));
067 //text_area_ = new JTextArea();
068 //contentpane.add(new JScrollPane(text_area_), BorderLayout.CENTER);
069 panel_ = new JPanel();
070 panel_.setLayout(new BoxLayout(panel_, BoxLayout.Y_AXIS));
071 //panel_.setPreferredSize(new Dimension(500, 400));
072 contentpane.add(menu, BorderLayout.NORTH);
073 contentpane.add(new JScrollPane(panel_), BorderLayout.CENTER);
074 showFrame(contentpane, JFrame.EXIT_ON_CLOSE);
075 }});
076
077
078
079 keep_all_parser_ = new HTMLParserPolicy() {
080 public ParserPolicy getInnerPolicy(Element element) {
081 return this;
082 }
083 public Element allowElement(Element element) {
084 return element;
085 }
086 };
087
088
089 body_tag_parser_ = new HTMLParserPolicy() {
090 public ParserPolicy getInnerPolicy(Element element) {
091 TagElement tag = (TagElement)element;
092 /*
093 if(tag.getKey().toLowerCase().equals("html"))
094 return html_tag_parser;
095 */
096 return this;
097 }
098 public Element allowElement(Element element) {
099 //panel_.add(new JButton(element.toString()));
100 if(!element.isTagElement()) {
101 JLabel label = new JLabel(((TextElement)element).getValue());
102 label.setBackground(Color.green);
103 panel_.add(label);
104 }else{
105 TagElement tag = (TagElement)element;
106 String key = tag.getKey().toLowerCase();
107 if(key.equals("a")) {
108
109 }else{
110 JLabel label = new JLabel("<html>"+tag.toString()+"</html>");
111 label.setBorder(BorderFactory.createLineBorder(Color.blue));
112 label.setToolTipText(tag.toString());
113 panel_.add(label);
114 }
115 }
116 panel_.revalidate();
117 return null;
118 }
119 };
120
121
122
123 html_tag_parser_ = new HTMLParserPolicy() {
124 public ParserPolicy getInnerPolicy(Element element) {
125 if(!element.isTagElement()) return keep_all_parser_;
126 TagElement tag = ((TagElement)element);
127 if(tag.getKey().toLowerCase().equals("body"))
128 return body_tag_parser_;
129 return keep_all_parser_;
130 }
131 public Element allowElement(Element element) {
132 //panel_.add(new JButton(element.toString()));
133 return element;
134 }
135 };
136
137 html_document_parser_ = new HTMLParserPolicy() {
138 public ParserPolicy getInnerPolicy(Element element) {
139 TagElement tag = (TagElement)element;
140 if(tag.getKey().toLowerCase().equals("html"))
141 return html_tag_parser_;
142 return keep_all_parser_;
143 }
144 public Element allowElement(Element element) {
145 if(element.isTextElement()) {
146 TextElement text_tag = (TextElement)element;
147 String text = text_tag.getValue();
148 if(text.toLowerCase().startsWith("doctype")) {
149 doctype_ = text;
150 return null;
151 }
152 }
153 return null;
154 }
155 };
156
157
158 }
159
160 public void openInOtherThread(final String url_text) {
161 new Thread(new Runnable(){public void run(){
162 try{
163 open(url_text);
164 }catch(Exception e){e.printStackTrace();}
165 }}, "open url").start();
166 }
167
168 public void open(String url_text) throws Exception {
169 panel_.removeAll();
170
171 URL url = new URL(url_text);
172 ElementParser parser = new ElementParser(url.openStream());
173 parser.setDocumentBase(url.toURI());
174
175 alert("now starting parse");
176
177 parser.setPolicy(html_document_parser_);
178 parser.parse();
179
180 panel_.revalidate();
181 }
182
183
184
185
186
187
188
189
190
191
192
193 public void oldMain5() throws Exception {
194 String text = "<img src=\"http://www.google.com/intl/en_ALL/images/logo.gif\"/><div>aaabbbccc</div>";
195 // ElementParser parser = new ElementParser(new StringReader(text));
196 // ElementParser parser = new ElementParser(new URL("http://sakura.meijo-u.ac.jp/index.html").openStream());
197 URL url = new URL("http://www.google.com/index.html");
198 // URL url = new URL("http://video.google.com/?hl=ja&tab=wv");
199 ElementParser parser = new ElementParser(url.openStream());
200 parser.setDocumentBase(url.toURI());
201
202 final HTMLObject htmlo = new HTMLObject();
203 parser.setPolicy(htmlo);
204 parser.parse();
205
206 final JComponent comp = new JComponent() {
207 public void paint(Graphics g) {
208 htmlo.paint(g);
209 }
210 };
211 comp.addMouseListener(new MouseListener(){
212 public void mousePressed(MouseEvent e) {
213 if(htmlo.hit(e.getX(), e.getY()))
214 htmlo.mousePressed(e);
215 }
216 public void mouseReleased(MouseEvent e) {
217 if(htmlo.hit(e.getX(), e.getY()))
218 htmlo.mouseReleased(e);
219 }
220 public void mouseClicked(MouseEvent e) {
221 if(htmlo.hit(e.getX(), e.getY()))
222 htmlo.mouseClicked(e);
223 }
224 public void mouseEntered(MouseEvent e) {
225 if(htmlo.hit(e.getX(), e.getY()))
226 htmlo.mouseEntered(e);
227 }
228 public void mouseExited(MouseEvent e) {
229 if(htmlo.hit(e.getX(), e.getY()))
230 htmlo.mouseExited(e);
231 }
232 });
233 comp.addMouseMotionListener(new MouseMotionListener(){
234 public void mouseMoved(MouseEvent e) {
235 if(htmlo.hit(e.getX(), e.getY())) {
236 htmlo.mouseMoved(e);
237 if(!htmlo.is_mouse_over_) {
238 htmlo.is_mouse_over_ = true;
239 htmlo.mouseEntered(e);
240 }
241 } else {
242 if(htmlo.is_mouse_over_) {
243 htmlo.is_mouse_over_ = false;
244 htmlo.mouseExited(e);
245 }
246 }
247 }
248 public void mouseDragged(MouseEvent e) {
249 if(htmlo.hit(e.getX(), e.getY()))
250 htmlo.mouseDragged(e);
251 }
252 });
253 comp.addMouseWheelListener(new MouseWheelListener(){
254 public void mouseWheelMoved(MouseWheelEvent e) {
255 htmlo.mouseWheelMoved(e);
256 }
257 });
258
259 htmlo.addChangeListener(new ChangeListener(){
260 public void stateChanged(ChangeEvent e) {
261 comp.repaint();
262 }
263 });
264
265 JPanel panel = new JPanel(new BorderLayout());
266 panel.add(comp, BorderLayout.CENTER);
267
268 JFrame frame = new JFrame();
269 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
270 frame.setContentPane(panel);
271 frame.pack();
272 frame.setBounds(100,100, 500, 500);
273 frame.setVisible(true);
274
275 }
276 }