/* Consultas de Libros por TITULO.
   el programa lee el fichero Libros.dat, (he tenido que llamarlo libros.txt, 
   por que el servidor no permite el .DAT)que contiene los libros y sus datos,y
   separa la información de manera que la busqueda de libros disponibles
   pueda realizarse por palabras de titulo o por temas.
*/

// Realizado en Diciembre de 1996 por:
//	Jose Carreres
//	Javier Magdalena
//  enrique Minguet

import java.awt.*;
import java.applet.*;
import java.io.StreamTokenizer;
import java.io.InputStream;
import java.io.BufferedInputStream;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.*;

//Cargamos las clases justas que vamos a utilizar.

public class ConsultasLibros extends Applet {
// Consultas de Libros, applet.

	public CardLayout layoutManager;
	public CLASSPprincipal Pprincipal;
	public CLASSListalibros Listalibros;
	public static Hashtable htconsultas;
	
	public void init()
	{
		layoutManager = new CardLayout();
		setLayout(layoutManager);
		htconsultas = new Hashtable();
		Llenarhtconsultas();

		// Crea una instancia de nuestra clase panel
		Pprincipal = new CLASSPprincipal(this, this);  
		add("Pprincipal", Pprincipal);
	}
	public String getAppletInfo()
	{
		return "Consulta de libros remota.";
	} 
	public boolean handleEvent(Event e)
	{
		if (e.id == Event.WINDOW_DESTROY)
		{
			System.exit(0);
		}
		return false;
	}
	
	void Llenarhtconsultas()
	/* ***************************************************************
	procedimiento que lee el fichero y rellena la tabla Hash con todos los 
	datos de los libros que aparecen en él.
	**************************************************************** */
	
	/*	Obiene el documento Libros.dat de la red y lo vuelca en una tabla Hash
		"htconsultas", para agilizar las operaciones de busqueda.
	*/
	{
		InputStream is = null;
		URL urlPhtitulo;
		
		try 
		{
			urlPhtitulo = new URL(getDocumentBase(), "Libros.dat");
			//obtiene la direccion base, donde estará el documento.
			try
			{
				is =  urlPhtitulo.openStream();

				StreamTokenizer st = new StreamTokenizer(new BufferedInputStream(is, 4000));
				//caracteres que reconocerá el StreamToke.
				st.eolIsSignificant(true);
				st.commentChar('#');
				st.slashSlashComments(true);
				st.whitespaceChars('%', '%'); 
				st.wordChars('(', ')');
				st.wordChars(',', ',');
				st.wordChars('-', '-');
				st.wordChars('.', '.');
				st.wordChars(':', ':');
				st.wordChars('$', '$');
				st.wordChars('-', 'z');
				st.wordChars(' ', ' ');
				st.wordChars('0', '9');		

				htconsultas.clear();
 scan:
				while (true)
				    switch (st.nextToken()) 
				    {
					case StreamTokenizer.TT_EOF:
					    break scan;
					default:
					    break;
					case StreamTokenizer.TT_WORD:
					    String strRecord = st.sval;
					    String strValue = "";

					    st.nextToken();
					    while (st.ttype != StreamTokenizer.TT_EOL &&
						st.ttype != StreamTokenizer.TT_EOF)
						{  
						if (st.ttype == StreamTokenizer.TT_WORD) 
						{
						    strValue = strValue + st.sval;
						}
						//aunque no se dará el caso en que el token
						//sea numerico, esta es una clase que podriamos
						//reutilizar.
						else 
						    if (st.ttype == StreamTokenizer.TT_NUMBER)
						    {
							strValue = strValue + String.valueOf(st.nval).toString();
						    } 
						st.nextToken();
					    }
					    /*el primer campo, titulo,será la clave.
						los siguientes campos, los coloca en un string, separandolos por el signo $
						de forma que el la tabla Hass, inserta la clave, y el string.*/									
						htconsultas.put(strRecord, strValue);
						break;
				    }						
				is.close();
			}
			catch(Exception e)
			{
				String mensage = e.toString();
				showStatus("Excepción ..." + mensage);
			}
		}
		catch (MalformedURLException e) 
		{
			String mensage = e.toString();	
			showStatus("Excepción ..." + mensage);
		}		
	}

	public static void main(String args[]) 
	{
		ConsultasLibros consultaslibros = new ConsultasLibros();
		consultaslibros.init();
		consultaslibros.start();
	}
}
    
/**************************************************************************
	Definición del contenedor de la interfaz grafica.
  	(pantalla principal (panel))
**************************************************************************/
class CLASSPprincipal extends CLASSPanel
{
	public CLASSCEtemas CEtemas;
	public CLASSEdatos Edatos;
	public CLASSETitulo ETitulo;
	public CLASSCTtitulo CTtitulo;
	public CLASSEisbn Eisbn;
	public CLASSCTisbn CTisbn;
	public CLASSEautor Eautor;
	public CLASSCTautor CTautor;
	public CLASSEeditorial Eeditorial;
	public CLASSEtema Etema;
	public CLASSCTeditorial CTeditorial;
	public CLASSCTtema CTtema;
	public CLASSBpalabratitulo Bpalabratitulo;
	public CLASSBnuevabusqueda Bnuevabusqueda;
	public CLASSBtema Btema;
	public CLASSCTpalabratitulo CTpalabratitulo;
	public CLASSListalibros Listalibros;
	
	public ConsultasLibros applet;
	public ConsultasLibros parent;

	CLASSPprincipal(ConsultasLibros app, ConsultasLibros aParent)
	{
		applet = app;
		parent = aParent;
		
		Edatos = new CLASSEdatos(applet, this);
		ETitulo = new CLASSETitulo(applet, this);
		CTtitulo = new CLASSCTtitulo(applet, this);
		Eisbn = new CLASSEisbn(applet, this);
		CTisbn = new CLASSCTisbn(applet, this);
		Eautor = new CLASSEautor(applet, this);
		CTautor = new CLASSCTautor(applet, this);
		Eeditorial = new CLASSEeditorial(applet, this);
		CTeditorial = new CLASSCTeditorial(applet, this);
		Etema = new CLASSEtema(applet, this);
		CTtema = new CLASSCTtema(applet, this);
		Bpalabratitulo = new CLASSBpalabratitulo(applet, this);
		Bnuevabusqueda = new CLASSBnuevabusqueda(applet, this);
		Btema = new CLASSBtema(applet, this);
		CEtemas = new CLASSCEtemas(applet, this);
		CTpalabratitulo = new CLASSCTpalabratitulo(applet, this);
		Listalibros = new CLASSListalibros(applet, this);
	
		// Crea el rotulo movil y lo añade al panel principal
		CLASSCartelMovil cartelmovil = new CLASSCartelMovil(applet, this);
		add(cartelmovil);

		setLayout(null);
		add(Eeditorial);
		add(CTeditorial);
		add(CTautor);
		add(Eautor);
		add(CTisbn);
		add(Eisbn);
		add(CTtitulo);
		add(ETitulo);
		add(Edatos);
		add(Etema);
		add(CTtema);
		add(Listalibros);
		add(CTpalabratitulo);
		add(CEtemas);
		add(Btema);
		add(Bpalabratitulo);
		add(Bnuevabusqueda);

		setTop(0);
		setLeft(0);
		resize(800, 500);
		setBackground(Color.white);

		// inhabilitando los campos de texto.
		CTisbn.setEditable(false);
		CTtitulo.setEditable(false);
		CTeditorial.setEditable(false);
		CTtema.setEditable(false);
		CTautor.setEditable(false);
		LlenarCEtemas(CEtemas.choice);
	}
	public void LlenarCEtemas(Choice celeccion)
	//Recorre toda la tabla Hash y muestra en la caja de eleccion "choice"
	//de "CElecciontemas", todos los temas disponibles en el fichero,
	//sin repetir ninguno.
	{	
		String tema=new String();
		String palabra=new String();
		int numero=0;
		int i=0;
		boolean yaexiste=false;

		for  (Enumeration  e  =  applet.htconsultas.elements();e.hasMoreElements();) 
		//recorro toda la tabla hash, e inserto el tema de cada uno de los 
		//libros en el "choice",sin repetir ninguno.		
		{	
			//en la talba hash, hay un solo string con todos los campos separados
			//por un $,por lo tanto tengo que obtener el tema mediante un filtro.
			palabra=e.nextElement().toString();
			StringTokenizer filtro=new StringTokenizer(palabra,"$");		
			tema=filtro.nextToken();		
			
			//miro que no esté ya.
			yaexiste=false;
			numero=celeccion.countItems();			
			i=0;
			if (numero>=1){
				while ((i 5)
					parent.counter = 0;
			}
			parent.repaint();
			try
			{
				this.sleep(60);
			} catch (InterruptedException e) {
			};
		}
	}
	CartelMovil_Kicker()
	{
	}
}

class CLASSCartelMovil extends CLASSPanel
{
	public CartelMovil_Kicker Kicker;
	public ConsultasLibros applet;
	public Object parent;

	int ANCHO_APPLET = 600;
	
	int leftbanner = 0;
	int bottombanner = 60;
	int x1 = ANCHO_APPLET;
	int counter = 0;
	int[] stringwidths;
	String[] wordarray = {"Consulta ", "de un archivo remoto", "via internet",
		"Realizado en ", "Java ",
		"Elija opción de busqueda"};
	Color[] stringcolors = {Color.red, Color.yellow, Color.white, Color.cyan, Color.green, Color.orange};
	FontMetrics fm = null;

	CLASSCartelMovil(ConsultasLibros app, Object aParent)
	{
		applet = app;
		parent = aParent;
		Kicker = new CartelMovil_Kicker(applet, this);

		setLayout(null);
		setFont(new Font("Courier",0,8));
		setTop(10);
		setLeft(0);
		setHeight(61); 
		setWidth(ANCHO_APPLET);
		setForeground(Color.white);
		setBackground(Color.black);
		setFontName("TimesRoman");
		setFontStyle(Font.BOLD);
		setFontSize(22);

		initialize();
	}
	public void paint(Graphics g)
	{
		//dibuja unas líneas a modo de marco para al banner
		g.setColor(Color.white);
		g.drawLine(leftbanner, 0, ANCHO_APPLET, 0);
		g.drawLine(ANCHO_APPLET, bottombanner, leftbanner, bottombanner);
		g.setColor(Color.lightGray);
		g.drawLine(leftbanner, 2, ANCHO_APPLET, 2);
		g.drawLine(ANCHO_APPLET, bottombanner-2, leftbanner, bottombanner-2);

		// se encarga de desplazar el texto por el marco banner
		g.clearRect(leftbanner+1, 4, 600, bottombanner-8);//140
		g.clipRect(leftbanner+1, 4, 600, bottombanner-8);
		g.setColor(stringcolors[counter]);
		g.drawString(wordarray[counter], x1, 40);
	}
	public void initialize()
	{
		Kicker.start();
	}
	public void update(Graphics g)
	{
		paint(g);
	}
	CLASSCartelMovil()
	{
	}
}
class CLASSBoton extends Button
{
	public ConsultasLibros applet;
	public ConsultasLibros parent;

	public CLASSBoton(Object app, Object aParent)
	{
		setFont(new Font("Courier",0,8));
		setForeground(Color.black);
		setBackground(Color.lightGray);
		setFontName("Courier");
		setFontStyle(Font.PLAIN);
	}
	public void refreshComponent()
	{
		// Refresca el componente despues de hacer alguna camio en el.
	}
	public void setTop(int aParam)
	{
		move(bounds().x, aParam);
	}
	public void setLeft(int aParam)
	{
		move(aParam, bounds().y);
	}
	public void setHeight(int aParam)
	{
		resize(bounds().width, aParam);
	}
	public void setWidth(int aParam)
	{	
		resize(aParam, bounds().height);
	}
	public void setFontName(String aParam)
	{
		setFont(new Font(aParam, getFont().getStyle(), getFont().getSize()));
	}
	public void setFontStyle(int aParam)
	{
		setFont(new Font(getFont().getName(), aParam, getFont().getSize()));
	}
	public void setFontSize(int aParam)
	{
		setFont(new Font(getFont().getName(), getFont().getStyle(), aParam));
	}
	
	public CLASSBoton()
	{
	}	
}
 class CLASSEtiqueta extends Label
{
	public ConsultasLibros applet;
	public ConsultasLibros parent;

	public CLASSEtiqueta(Object app, Object aParent)
	{
		setFont(new Font("Courier",0,8));
		setAlignment(Label.LEFT);
		setForeground(Color.black);
		setBackground(Color.lightGray);
		setFontName("Courier");
		setFontStyle(Font.PLAIN);
		setFontSize(15);
	}
	public void refreshComponent()
	{
	}
	public void setTop(int aParam)
	{
		move(bounds().x, aParam);
	}
	public void setLeft(int aParam)
	{
		move(aParam, bounds().y);
	}
	public void setHeight(int aParam)
	{
		resize(bounds().width, aParam);
	}
	public void setWidth(int aParam)
	{
		resize(aParam, bounds().height);
	}
	public void setFontName(String aParam)
	{
		setFont(new Font(aParam, getFont().getStyle(), getFont().getSize()));
	}
	public void setFontStyle(int aParam)
	{
		setFont(new Font(getFont().getName(), aParam, getFont().getSize()));
	}
	public void setFontSize(int aParam)
	{
		setFont(new Font(getFont().getName(), getFont().getStyle(), aParam));
	}

	public CLASSEtiqueta()
	{
	}
}
class CLASSCTexto extends TextField
{
	public ConsultasLibros applet;
	public ConsultasLibros parent;

	public CLASSCTexto(Object app, Object aParent)
	{
		setFont(new Font("Courier",0,8));
		setForeground(Color.black);
		setBackground(Color.white);
		setFontName("Courier");
		setFontStyle(Font.PLAIN);
		setFontSize(15);
	}
	public void refreshComponent()
	{
	}
	public void setTop(int aParam)
	{
		move(bounds().x, aParam);
	}
	public void setLeft(int aParam)
	{
		move(aParam, bounds().y);
	}
	public void setHeight(int aParam)
	{
		resize(bounds().width, aParam);
	}
	public void setWidth(int aParam)
	{
		resize(aParam, bounds().height);
	}
	public void setFontName(String aParam)
	{
		setFont(new Font(aParam, getFont().getStyle(), getFont().getSize()));
	}
	public void setFontStyle(int aParam)
	{
		setFont(new Font(getFont().getName(), aParam, getFont().getSize()));
	}
	public void setFontSize(int aParam)
	{
		setFont(new Font(getFont().getName(), getFont().getStyle(), aParam));
	}

	public CLASSCTexto()
	{
	}
}

class CLASSPanel extends Panel
{
	public ConsultasLibros applet;
	public ConsultasLibros parent;

	public CLASSPanel(Object app, Object aParent)
	{
		setLayout(null);
		setFont(new Font("Courier",0,8));
		setForeground(Color.black);
		setBackground(Color.lightGray);
		setFontName("Courier");
		setFontStyle(Font.PLAIN);
		setFontSize(15);
	}
	public void refreshComponent()
	{
	}
	public void setTop(int aParam)
	{
		move(bounds().x, aParam);
	}
	public void setLeft(int aParam)
	{
		move(aParam, bounds().y);
	}
	public void setHeight(int aParam)
	{
		resize(bounds().width, aParam);
	}
	public void setWidth(int aParam)
	{
		resize(aParam, bounds().height);
	}
	public void setFontName(String aParam)
	{
		setFont(new Font(aParam, getFont().getStyle(), getFont().getSize()));
	}
	public void setFontStyle(int aParam)
	{
		setFont(new Font(getFont().getName(), aParam, getFont().getSize()));
	}
	public void setFontSize(int aParam)
	{
		setFont(new Font(getFont().getName(), getFont().getStyle(), aParam));
	}

	public CLASSPanel()
	{
	}
}

    Source: geocities.com/collegepark/quad/8901

               ( geocities.com/collegepark/quad)                   ( geocities.com/collegepark)