import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;

/**
 * Title:        Buecherturmverwaltung entwickelt im Javakurs
 * Copyright:    Copyright (c) 2001
 * @author
 * @version 1.0
 */

public class Verwaltungsapplet extends Applet {

	/* Der Vektor der die zur Verfügung stehenden Klassen hält */
	java.util.Vector vMediaClasses = new java.util.Vector();

	/* Der Vektor der die einzelnen Instanzen hält */
	java.util.Vector vMedien = new java.util.Vector();

	/** Einige Eigenschaften der Appletklasse, die für den Aufbau der grafischen
	Oberfläche nötig sind */
        boolean isStandalone = false;
        String var0;
        String var1;
        Panel panelTopAuthorName = new Panel();
        Panel panelBottomStatusBar = new Panel();
        BorderLayout borderLayout1 = new BorderLayout();
        BorderLayout borderLayout2 = new BorderLayout();
        Panel panelContent = new Panel();
        Panel panelList = new Panel();
        GridLayout gridLayout1 = new GridLayout();
        Panel panelEditControls = new Panel();
        Label labelMediumsChoice = new Label();
        TextField textFieldMediumName = new TextField();
        Button buttonSetMedium = new Button();
        List listMediums = new List(10, false);
        Label labelAuthorName = new Label();
        Label labelStatusBar = new Label();
        BorderLayout borderLayout3 = new BorderLayout();
        GridLayout gridLayout2 = new GridLayout();
        Panel panelControls = new Panel();
        BorderLayout borderLayout4 = new BorderLayout();
        Choice choiceMediums = new Choice();
        Label labelMediumName = new Label();
        Label labelButtonSpacer = new Label();
        Button buttonDelete = new Button();
        BorderLayout borderLayout5 = new BorderLayout();
	Button buttonLoanMedium = new Button();
        Label labelDate = new Label();
        TextField textFieldDate = new TextField ();
        Label labelLanguage = new Label();
        TextField textFieldLanguage = new TextField ();
        Label labelEditor = new Label();
        TextField textFieldEditor = new TextField ();
        Label labelAvailable = new Label();
        Label labelAvailableData = new Label();
        Label labelWeight = new Label();
        Label labelWeightData = new Label();
        Label labelLocation = new Label();
        Label labelLocationData = new Label();
        // Button buttonLoanMedium = new Button();
        Label labelLoanSpacer = new Label();

        /**Construct the applet*/
        public Verwaltungsapplet() {
        }

        /**Initialize the applet*/
        public void init() {

                try {
                        var0 = this.getParameter("param0", "");
                } catch(Exception e) {
                        e.printStackTrace();
                }

                try {
                        var1 = this.getParameter("param1", "");
                } catch(Exception e) {
                        e.printStackTrace();
                }

                try {
                        jbInit();
                } catch(Exception e) {
                        e.printStackTrace();
                }

        }

	/**
	 * Fügt einen Medientyp mit dem übergebenen Namen und der übergebenen Klasse hinzu
	 */
	private void addMedium( Class sMediumClass ) {
		choiceMediums.add( sMediumClass.getName() );
		vMediaClasses.addElement( sMediumClass );
	}

        /**
	 * GUI-Komponenten initialisieren
	 */
        private void jbInit() throws Exception {

		/* massenhaft Einstellungen zur grafischen Oberfläche vornehmen */
                this.setSize(new Dimension(500,300));
                this.setLayout(borderLayout2);
                panelTopAuthorName.setLayout(borderLayout1);

                panelContent.setLayout(gridLayout1);
                gridLayout1.setColumns(2);
                labelMediumsChoice.setText("  Medium:");
                buttonSetMedium.setLabel("Speichern");
                buttonSetMedium.addActionListener(new java.awt.event.ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                buttonSetMedium_actionPerformed(e);
                        }
                });
                labelAuthorName.setText("Bücherturm Verwaltung");
                labelStatusBar.setText("information ;-)");
		panelList.setLayout(borderLayout3);
                panelEditControls.setLayout(gridLayout2);
                panelControls.setLayout(borderLayout4);
                labelMediumName.setText("  Name:");
                labelButtonSpacer.setText("  ");
                gridLayout2.setRows(10);
                gridLayout2.setColumns(2);
                gridLayout2.setHgap(3);
                gridLayout2.setVgap(3);
                buttonDelete.setLabel("Löschen");
                buttonDelete.addActionListener(new java.awt.event.ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                buttonDelete_actionPerformed(e);
                        }
                });
                panelBottomStatusBar.setLayout(borderLayout5);
                listMediums.addActionListener(new java.awt.event.ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                listMediums_actionPerformed(e);
                        }
                });
                this.add(panelTopAuthorName, BorderLayout.NORTH);
                this.add(panelContent, BorderLayout.CENTER);
                this.add(panelBottomStatusBar, BorderLayout.SOUTH);
                panelContent.add(panelList, null);
                panelTopAuthorName.add(labelAuthorName, BorderLayout.CENTER);
		panelBottomStatusBar.add(labelStatusBar, BorderLayout.CENTER);
                panelList.add(listMediums, BorderLayout.CENTER);
                // panelList.add(buttonDelete, BorderLayout.SOUTH);
                panelContent.add(panelControls, null);
                panelEditControls.add(labelMediumsChoice, null);
                panelEditControls.add(choiceMediums, BorderLayout.NORTH);
                panelEditControls.add(labelMediumName, null);
                panelControls.add(panelEditControls, BorderLayout.NORTH);
                panelEditControls.add(textFieldMediumName, null);
		this.setBackground(new Color(255,255,255));

                labelDate.setText("  Datum:");
                labelLanguage.setText("  Sprachen:");
                labelEditor.setText("  Herausgeber:");
                labelAvailable.setText("  Vorhanden:");
                labelWeight.setText("  Umfang:");
                labelLocation.setText("  Lokation:");
                labelAvailableData.setText("-");
                labelWeightData.setText("-");
                labelLocationData.setText("-");
                // labelMediumName.setText("  AusleigenName:");

                panelEditControls.add(labelDate, null);
                panelEditControls.add(textFieldDate, null);
                panelEditControls.add(labelLanguage, null);
                panelEditControls.add(textFieldLanguage, null);
                panelEditControls.add(labelEditor, null);
                panelEditControls.add(textFieldEditor, null);
                panelEditControls.add(labelAvailable, null);
                panelEditControls.add(labelAvailableData, null);
                panelEditControls.add(labelWeight, null);
                panelEditControls.add(labelWeightData, null);
                panelEditControls.add(labelLocation, null);
                panelEditControls.add(labelLocationData, null);
        	buttonLoanMedium.setLabel ("Ausleihen");
		
        	Label labelLoanSpacer = new Label();

                panelEditControls.add(labelButtonSpacer, null);
                panelEditControls.add(buttonSetMedium, null);

		/* Hier können die verschiedenen Medientypen definiert werden, damit
		sie in der Combobox ausgegeben werden */

		/*
		choiceMediums.add("Buch");
		choiceMediums.add("CD");
		choiceMediums.add("Landratte");
		*/

/* ################################################ 
  Hier sollen weitere Medienklassen eingefügt werden!
*/

		addMedium( (new PhysMedium()).getClass() );
		addMedium( (new VirtuellesMedium()).getClass() );
		addMedium( (new LesbaresPhysMedium()).getClass() );
		addMedium( (new AbspielbaresVirtuellesMedium()).getClass() );
		addMedium( (new AbspielbaresPhysMedium()).getClass() );
		addMedium( (new MP3()).getClass() );
		addMedium( (new AVI()).getClass() );
		addMedium( (new VHSVideo()).getClass() );
		addMedium( (new CD()).getClass() );
		addMedium( (new Buch()).getClass() );
		addMedium( (new Zeitschrift()).getClass() );






/* ################################################ */
        }

        /**
	 * Start the applet
	 */
        public void start() {
        }

        /**
	 * Stop the applet
	 */
        public void stop() {
        }

        /**
	 * Destroy the applet
	 */
        public void destroy() {
        }

        /**
	 * Get Applet information
	 */
        public String getAppletInfo() {
                return "Applet Information";
        }

        /**
	 * Get parameter info (holt die Parameter, die im html-file angegeben wurden)
	 */
        public String[][] getParameterInfo() {
                String[][] pinfo =
                        {
                        {"param0", "String", ""},
                        {"param1", "String", ""},
                        };
                return pinfo;
        }

        /** Get a parameter value */
        public String getParameter(String key, String def) {
                return isStandalone ? System.getProperty(key, def) :
                        (getParameter(key) != null ? getParameter(key) : def);
        }

	/**
	 * Actionhandler für das Drücken des "Speichern"-Buttons
	 */
        void buttonSetMedium_actionPerformed(ActionEvent e) {

		/* Wenn Texteingabefeld Medienname Tetx enthält, dann Eintrag in Liste erzeugen */
		if (!textFieldMediumName.getText().equals("")) {
			String sMedium = choiceMediums.getSelectedItem();

		        /* Neuen Eintrag für die Medienliste aus Controls zusammensetzen */
		        String sMediumText = sMedium + " \"" + textFieldMediumName.getText() + "\"";
			listMediums.add(sMediumText);

			/* Neues Objekt der entsprechenden Klasse erzeugen */
			for (int i=0; i<vMediaClasses.size(); i++) {
				Object curObject = vMediaClasses.elementAt( i );
				Class curClass = (Class) curObject;
				
				if (curClass.getName().equals( sMedium ) ) {

					try {
						Medium mNewMedium = (Medium) curClass.newInstance();
						mNewMedium.setzeTitel( textFieldMediumName.getText() );
						mNewMedium.setzeDatum( textFieldDate.getText () );
						mNewMedium.setzeSprachen( textFieldLanguage.getText () );
						mNewMedium.setzeHerausgeber( textFieldEditor.getText () );
						
						vMedien.addElement( mNewMedium );

						/* Statusmeldung ausgeben */
						labelStatusBar.setText (sMediumText + " wurde gespeichert.");

					} catch ( Exception curException ) {
						labelStatusBar.setText( "Fehler: " + curException.toString() );
					}
				}
			}

		}

        }

	/**
	 * Actionhandler für das Drücken des "Löschen"-Buttons
	 */
        void buttonDelete_actionPerformed(ActionEvent e) {

		/* Wenn Eintrag in Liste selektiert, dann... */
		if (listMediums.getSelectedIndex() > -1) {

			/* Statusmeldung ausgeben */
			labelStatusBar.setText (listMediums.getSelectedItem() + " wurde gelöscht.");

		        /* ...Eintrag aus Liste entfernen */
		        listMediums.remove(listMediums.getSelectedIndex());
			vMedien.remove(listMediums.getSelectedIndex());

		}

        }

	/**
	 * Actionhandler für das Selektieren eines Listeneintrags (Doppelklick!)
	 */
        void listMediums_actionPerformed(ActionEvent e) {

		/* Wenn Eintrag in Liste selektiert wurde, dann... */
		if (listMediums.getSelectedIndex() > -1) {

		        /* Eintrag von Liste in Felder übernehmen */
		        String sThisItemText = listMediums.getSelectedItem();
		        int iQuotePosFirst = sThisItemText.indexOf("\"");
		        int iQuotePosLast = sThisItemText.indexOf("\"", iQuotePosFirst +1);
		        String sName = "";
		        String sMediumType = "";
		        if ((iQuotePosFirst > 0) && (iQuotePosLast > 0)) {
				// sName = sThisItemText.substring(iQuotePosFirst+1, iQuotePosLast-1);
				sMediumType = sThisItemText.substring(0, iQuotePosFirst-1);
		        }

			/* Das verbundene Objekt holen */
			Object curObject = vMedien.elementAt( listMediums.getSelectedIndex() );
			Medium mMedium = (Medium) curObject;
			sName = mMedium.titel();

			sName = mMedium.titel();
			String sDate = mMedium.datum();
			String sLanguage = mMedium.sprachen();
			String sEditor = mMedium.herausgeber();
			String sAvailable = mMedium.istvorhanden();
			String sWeight = mMedium.umfang();
			String sLocation = mMedium.lokation();

		        //if (!sName.equals("")) {

				/* Statusmeldung ausgeben */
				labelStatusBar.setText (sThisItemText + " wird bearbeitet...");

				/* Das Texteingabefeld für den Namen sowie die Combobox auf die
				Werte des selektierten Eintrags setzen */
			        textFieldMediumName.setText(sName);
				choiceMediums.select(sMediumType);
				textFieldDate.setText (sDate);
				textFieldLanguage.setText (sLanguage);
				textFieldEditor.setText (sEditor);
                		labelAvailableData.setText(sAvailable);
                		labelWeightData.setText(sWeight);
                		labelLocationData.setText(sLocation);

	        	        /* ...Eintrag aus Liste entfernen */
				listMediums.remove(listMediums.getSelectedIndex());
				vMedien.removeElementAt(listMediums.getSelectedIndex());
		        //}

		}
        }
}