
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;

/**
 * 
 * <p>
 * Überschrift: IDS-Such-Applet
 * </p>
 * <p>
 * Beschreibung: GUI zum Such-Applet f&uuml;r XML-Dateien des IDS-Mannheim.
 * </br>- Darstellung von Auswahlliste (= &Uuml;bergabeparameter aus
 * html-Seite), Eingabefeld f&uuml;r Suchwort und Startbutton in verschachteltem
 * Swing-Layout - ActionListener ruft MySaxParser entweder mit drei oder vier
 * Parametern auf - Es wird eine html-Seite erstellt, welche die Suchergebnisse
 * enth&auml;lt - Ergebnis-html-Seite wird vom Applet aufgerufen
 * </p>
 * <p>
 * Copyright: (c) 2004
 * </p>
 * <p>
 * Studienprojekt von Rossen Kowatchew und Henriette Engelken
 * </p>
 * <p>
 * Author: HE (h.engelken@gmx.de)
 * </p>
 * <p>
 * Version 1.0
 * </p>
 * 
 * <p>
 * Auf html-Seite geforderte Argumente: <br>
 * {"FileName", "String", "Name der zu durchsuchenden Datei"}, <br>
 * {"Ausgabe", "String", "gewünschter Ausgabeknoten"}, <br>
 * {"Element1", "String", "möglicher Knoten, in dem gesucht werden kann"},
 * {"Element2", "String", "möglicher Knoten, in dem gesucht werden kann"},
 * {"Element3", "String", "möglicher Knoten, in dem gesucht werden kann"}, usw.
 * beliebig viele Elemente bis zu 25 Stück
 * </p>
 */

public class SearchApplet extends JApplet {

	private boolean isStandalone = false;

	int arrayLength = 0;

	int i = 0;

	static String parsedFile;

	static String outputElement;

	static String searchedIn;

	static String searchString;

	String[] tempArray = new String[30];

	String[] elemente;

	JButton startButton = new JButton("Suche starten!");

	JLabel gruss = new JLabel(
			"<html><font size=+1 color=navy>Willkommen zur XML-Suche am IDS</font>",
			SwingConstants.CENTER);

	JLabel textElement = new JLabel(
			"<html>W&auml;hlen Sie hier ein Element, in dem gesucht werden soll");

	JLabel textSuchwort = new JLabel(
			"<html><p>Hier k&ouml;nnen Sie ein Suchwort eingeben.</p>"
					+ "<p>Tippen Sie f&uuml;r jedes Sonderzeichen einen Stern <font color=blue>*</font></p>");

	JLabel t4 = new JLabel("", SwingConstants.CENTER);

	JTextField suchwortFeld = new JTextField(13);

	JPanel panel1 = new JPanel();

	JPanel panel1b = new JPanel();

	JPanel panel2 = new JPanel();

	JPanel panel2b = new JPanel();

	JPanel panel3 = new JPanel();

	JComboBox myCombo;

	Container contentPane = getContentPane();

	//Action Listener, der auf Klick von startButton reagiert:

	ActionListener myListener = new ActionListener() {
		public void actionPerformed(ActionEvent a) {
			searchedIn = (String) myCombo.getSelectedItem();
			searchString = suchwortFeld.getText();
			//MySAXParser aufrufen (mit 3 o. 4 Argumenten):
			if (searchString == "") {
				try {
					MySAXParser ergebnis = new MySAXParser(parsedFile,
							searchedIn, outputElement);
				} catch (Exception e) {
					System.out.println("Undef Exception");
				}
			} else {
				try {
					MySAXParser ergebnis = new MySAXParser(parsedFile,
							searchedIn, outputElement, searchString);
				} catch (Exception e) {
					System.out.println("Undef Exception");
				}
			}
			// die Methode aufrufen, die die html-Seite mit den Ergebnissen
			// erzeugt:
			i = writeHtml(outputElement, parsedFile, MySAXParser.outputString);
			if (i == 1) {
				// Erfolg, also jetzt das html-Dokument anzeigen, in dem die
				// Suchergebnisse stehen:
				try {
					// Pfad der html-Seite ist relativ zum Applet-Verzeichnis
					// (DocumentBase)
					URL url = new URL(getDocumentBase(), "searchResult.html");
					getAppletContext().showDocument(url);
				} catch (MalformedURLException e) {
					System.out.println(e.toString());
				}
			} else if (i == 0) {
				// Fehlermeldung ausgeben, weil html-Datei nicht geschrieben
				// werden konnte
				contentPane.add(t4);
				t4
						.setText("<html><p><font color=red>Fehler!</font> Ergebnisdatei konnte nicht erstellt werden.</p>"
								+ "<p>Überprüfen Sie Ihre Sicherheitseinstellungen.</p>");
			}
		}
	};

	//Parameterwert holen
	public String getParameter(String key, String def) {
		return isStandalone ? System.getProperty(key, def)
				: (getParameter(key) != null ? getParameter(key) : def);
	}

	//Das Applet initialisieren
	public void init() {

		startButton.addActionListener(myListener);

		//Übergabeparameter holen
		try {
			parsedFile = this.getParameter("FileName", "");
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			outputElement = this.getParameter("Ausgabe", "");
		} catch (Exception e) {
			e.printStackTrace();
		}

		//bis zu 25 übergebene Element-Namen holen u. mitzählen
		for (int i = 0; i < tempArray.length; i++) {
			try {
				tempArray[i] = this.getParameter("Element" + (i + 1), "");
			} catch (Exception e) {
				e.printStackTrace();
			}
			if (tempArray[i] != "") {
				arrayLength++;
			}
		}

		//die Element-Namen in Array mit korrekter Größe stecken

		elemente = new String[arrayLength];
		for (int i = 0; i < arrayLength; i++) {
			elemente[i] = tempArray[i];
		}

		//ab hier: Layout-Management (verschachtelt)

		//Panel 1 für zweite Zeile (Element...) erzeugen
		panel1.setLayout(new GridLayout(1, 3, 10, 10));
		panel1.setBackground(new Color(228, 243, 255));
		panel1.add(new JLabel("Element:", SwingConstants.CENTER));
		panel1b.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 30));
		panel1b.setBackground(new Color(228, 243, 255));
		myCombo = new JComboBox(elemente);
		myCombo.setBackground(Color.white);
		panel1b.add(myCombo);
		panel1.add(panel1b);
		panel1.add(textElement);

		//Panel 2 für dritte Zeile (Suchwort...) erzeugen
		panel2.setLayout(new GridLayout(1, 3, 10, 10));
		panel2.setBackground(new Color(228, 243, 255));
		panel2.add(new JLabel("<html><p>Suchwort:</p><p>(optional)</p>",
				SwingConstants.CENTER));
		panel2b.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 30));
		panel2b.setBackground(new Color(228, 243, 255));
		panel2b.add(suchwortFeld);
		panel2.add(panel2b);
		panel2.add(textSuchwort);

		//Panel 3 für vierte Zeile (Startbutton in grün) erzeugen
		panel3.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 20));
		panel3.setBackground(new Color(208, 233, 245));
		startButton.setBackground(new Color(110, 235, 125));
		startButton.setMnemonic(KeyEvent.VK_S);
		panel3.add(startButton);

		//Hauptlayout mit GridLayout festlegen
		contentPane.setLayout(new GridLayout(5, 1, 10, 10));
		contentPane.setBackground(new Color(208, 233, 245));
		contentPane.add(gruss);
		contentPane.add(panel1);
		contentPane.add(panel2);
		contentPane.add(panel3);

	}

	//Applet-Information holen
	public String getAppletInfo() {
		return "Applet-Information";
	}

	//Parameter-Infos holen
	public String[][] getParameterInfo() {
		String[][] pinfo = {
				{ "FileName", "String", "Name der zu durchsuchenden Datei" },
				{ "Element1", "String",
						"möglicher Knoten, in dem gesucht werden kann" },
				{ "Element2", "String",
						"möglicher Knoten, in dem gesucht werden kann" },
				{ "Element3", "String",
						"möglicher Knoten, in dem gesucht werden kann" },
				{ "Ausgabe", "String", "gewünschter Ausgabeknoten" }, };
		return pinfo;
	}

	// Methode zum Erstellen der html-Datei mit den Suchergebnissen:
	// Argumente: a) ausgegebenes Element b) durchsuchte XML-Datei c)
	// Suchergebnisse vom Parser
	// Es werden HTML-Header und der Link zur XML-Datei hinzugefügt
	// html-Datei wird angelegt und bei Erfolg 1 zurückgegeben, sonst 0.
	protected int writeHtml(String outputElement, String parsedFile,
			String outputString) {
		FileWriter outFile;
		int i;
		String header = "<html>\n<head>\n <title>XML-Suchergebnisse</title>\n"
				+ "<meta http-equiv=\"Content-Type\""
				+ " content=\"text/html; charset=iso-8859-1\">\n"
				+ "</head>\n<body bgcolor=\"lightblue\"text=\"navy\">\n"
				+ "<h2><center>Suchergebnisse</center></h2>\n<center>(es wird der Inhalt des Elements &lt;"
				+ outputElement + "&gt; ausgegeben)</center>";
		String hyperlink = new String();
		String newSearch = "<br><a href=\"XML-Suchapplet.html\">Neue Suche starten</a>";
		String end = "\n</body>\n</html>";
		String http = "http";

		// evtl. Pfad erweitern:
		if (!parsedFile.substring(0, 4).equals(http)) {
			if (!parsedFile.substring(0, 4).equalsIgnoreCase("file")) {
				parsedFile = "file:\\\\" + parsedFile;
			}
		}

		hyperlink = "<br>Hier geht es zur durchsuchten XML-Datei: <a href=\""
				+ parsedFile + "\">" + parsedFile + "</a><br>\n";

		// html-Datei erzeugen und beschreiben:
		try {
			outFile = new FileWriter("./searchResult.html");
			outFile.write(header);
			outFile.write("<hr>" + outputString + "<hr>");
			outFile.write(hyperlink + newSearch + end);
			outFile.close();
			return i = 1; // bei Erfolg
		} catch (Exception e) {
			// bei Misserfolg (Ausgabe einer Fehlermeldung in GUI):
			return i = 0;
		}
	}
}