/* ** This file is part of Filius, a network construction and simulation software. ** ** Originally created at the University of Siegen, Institute "Didactics of ** Informatics and E-Learning" by a students' project group: ** members (2006-2007): ** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding, ** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer ** supervisors: ** Stefan Freischlad (maintainer until 2009), Peer Stechert ** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de> ** and Stefan Freischlad ** Filius is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 2 of the License, or ** (at your option) version 3. ** ** Filius is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ** PURPOSE. See the GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with Filius. If not, see <http://www.gnu.org/licenses/>. */ package filius.gui.anwendungssicht; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.net.MalformedURLException; import java.net.URL; import java.util.Observable; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JEditorPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import javax.swing.text.html.FormSubmitEvent; import javax.swing.text.html.HTMLDocument; import javax.swing.text.html.HTMLEditorKit; import org.htmlparser.Parser; import org.htmlparser.Tag; import org.htmlparser.filters.TagNameFilter; import org.htmlparser.util.NodeList; import filius.Main; import filius.rahmenprogramm.EingabenUeberpruefung; import filius.rahmenprogramm.Information; import filius.software.www.HTTPNachricht; import filius.software.www.WebBrowser; public class GUIApplicationWebBrowserWindow extends GUIApplicationWindow { private static final long serialVersionUID = 1L; private JPanel browserPanel; private JTextField urlFeld; private JEditorPane anzeigeFeld; private JButton goButton; public GUIApplicationWebBrowserWindow(final GUIDesktopPanel desktop, String appName) { super(desktop, appName); HTMLEditorKit ek; browserPanel = new JPanel(new BorderLayout()); getContentPane().add(browserPanel); Box topBox = Box.createHorizontalBox(); urlFeld = new JTextField("http://"); urlFeld.setVisible(true); topBox.add(urlFeld); topBox.add(Box.createHorizontalStrut(5)); // Platz zw. urlFeld und // senden goButton = new JButton(messages.getString("webbrowser_msg2")); topBox.add(goButton); topBox.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); browserPanel.add(topBox, BorderLayout.NORTH); Box middleBox = Box.createHorizontalBox(); middleBox.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); /* ActionListener */ ActionListener al = new ActionListener() { public void actionPerformed(ActionEvent arg0) { URL url; url = erzeugeURL(urlFeld.getText()); abrufenWebseite(url, null); } }; goButton.addActionListener(al); /* KeyListener */ urlFeld.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { URL url; if (e.getKeyCode() == KeyEvent.VK_ENTER) { //Main.debug.println("\t"+getClass()+": enter pressed"); url = erzeugeURL(urlFeld.getText()); abrufenWebseite(url, null); } } public void keyReleased(KeyEvent arg0) { } public void keyTyped(KeyEvent arg0) { } }); ek = new HTMLEditorKit(); // Braucht er für SubmitEvent! ek.setAutoFormSubmission(false); // muss! anzeigeFeld = new JEditorPane(); anzeigeFeld.setEditorKit(ek); anzeigeFeld.setContentType("text/html"); // text/html muss bleiben // wegen folgendem Quelltext: anzeigeFeld .setText("<html><head><base href=\"file:bilder\"></head><body margin=\"0\">" + "<center><img src=\"browser_waterwolf_logo.png\" align=\"top\"></center>" + "</font>" + "</body></html>"); // filius.rahmenprogramm.SzenarioVerwaltung.kopiereDatei(Information // .getInformation().getProgrammPfad() // + "gfx/desktop/browser_waterwolf_logo.png", Information // .getInformation().getTempPfad() // + "browser_waterwolf_logo.png"); filius.rahmenprogramm.SzenarioVerwaltung.saveStream(getClass().getResourceAsStream("/gfx/desktop/browser_waterwolf_logo.png"), Information.getInformation().getTempPfad() + "browser_waterwolf_logo.png"); try { ((HTMLDocument) anzeigeFeld.getDocument()).setBase(new URL("file:" + Information.getInformation().getTempPfad())); } catch (MalformedURLException e1) { e1.printStackTrace(Main.debug); } anzeigeFeld.setEditable(false); anzeigeFeld.setBorder(null); hyperLinkListener(anzeigeFeld); anzeigeFeld.setVisible(true); JScrollPane spAnzeige = new JScrollPane(anzeigeFeld); middleBox.add(spAnzeige); browserPanel.add(middleBox, BorderLayout.CENTER); this.pack(); } private URL erzeugeURL(String ressource) { URL url = null; String[] teilstrings; String host = null, pfad = ""; teilstrings = ressource.split("/"); // Fuer den Fall, dass URL-Eingabe mit Hostadresse beginnt if (teilstrings.length > 0 && !teilstrings[0].equalsIgnoreCase("http:")) { if (EingabenUeberpruefung.isGueltig(teilstrings[0], EingabenUeberpruefung.musterDomain) || EingabenUeberpruefung.isGueltig(teilstrings[0], EingabenUeberpruefung.musterIpAdresse)) { host = teilstrings[0]; for (int i = 1; i < teilstrings.length; i++) { pfad = pfad + "/" + teilstrings[i]; } } } // Fuer den Fall, dass URL-Eingabe mit http:// beginnt if (teilstrings.length > 2 && teilstrings[0].equalsIgnoreCase("http:")) { if (EingabenUeberpruefung.isGueltig(teilstrings[2], EingabenUeberpruefung.musterDomain) || EingabenUeberpruefung.isGueltig(teilstrings[2], EingabenUeberpruefung.musterIpAdresse)) { host = teilstrings[2]; } for (int i = 3; i < teilstrings.length; i++) { pfad = pfad + "/" + teilstrings[i]; } } if (host != null) { if (pfad.equals("")) pfad = "/"; try { url = new URL("http", host, pfad); } catch (MalformedURLException e) { e.printStackTrace(Main.debug); } } return url; } private void abrufenWebseite(URL url, String postDaten) { String host; if (url != null) { if (postDaten == null) ((WebBrowser) holeAnwendung()).holeWebseite(url); else ((WebBrowser) holeAnwendung()).holeWebseite(url, postDaten); if (url.getHost() == null || url.getHost().equals("")) { host = ((WebBrowser) holeAnwendung()).holeHost(); } else { host = url.getHost(); } urlFeld.setText(url.getProtocol() + "://" + host + url.getPath()); setTitle(url.getProtocol() + "://" + host + url.getPath()); } else { urlFeld.setText("http://"); } } private void initialisiereWebseite(String quelltext) { Parser parser; NodeList liste; Tag tag; anzeigeFeld.setContentType("text/html"); anzeigeFeld.setText(quelltext); parser = Parser.createParser(quelltext, null); try { liste = parser.parse(new TagNameFilter("title")); if (liste.size() > 0) { tag = (Tag) liste.elementAt(0); if (tag.getChildren() != null && tag.getChildren().size() > 0) setTitle(tag.getChildren().elementAt(0).toHtml()); } } catch (Exception e) { e.printStackTrace(Main.debug); } } private void hyperLinkListener(JEditorPane editorPane) { editorPane.addHyperlinkListener(new HyperlinkListener() { public void hyperlinkUpdate(HyperlinkEvent e) { URL url = null, tmp; String pfad; // Hier wird auf einen Klick reagiert if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { tmp = ((HTMLDocument) anzeigeFeld.getDocument()).getBase(); if (e.getURL().getProtocol().equals(tmp.getProtocol())) { try { pfad = e.getURL().getFile().replace(tmp.getFile(), "/"); url = new URL("http", "", pfad); } catch (MalformedURLException e1) { e1.printStackTrace(Main.debug); } } else { url = e.getURL(); } // in diesem Fall kam das Event vom Submit-Button: if (e instanceof FormSubmitEvent) { FormSubmitEvent evt = (FormSubmitEvent) e; // Zerlegen erfolgt erst im Server String postDatenteil = evt.getData(); abrufenWebseite(url, postDatenteil); } else { abrufenWebseite(url, null); } } } }); } public void update(Observable arg0, Object arg1) { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (GUIApplicationWebBrowserWindow), update("+arg0+","+arg1+")"); if (arg1 == null) { anzeigeFeld.updateUI(); } else if (arg1 instanceof HTTPNachricht) { if (((HTTPNachricht) arg1).getDaten() == null) { anzeigeFeld.updateUI(); } else { initialisiereWebseite(((HTTPNachricht) arg1).getDaten()); } } else { //Main.debug.println(arg1); } } }