////////////////////////////////////////////////////////////////////////
//
// Projeto Valoriza OnLine
//
// Arquivo: Browser.java
//
// Função : Classe que exibe um texto de acordo com as tags.
//
// Autores: Ary Junior (junior@valoriza.com.br)
//          Edilberto Kelmer (ekelmer@valoriza.com.br)
//
// Última atualização : 29/01/01
//
////////////////////////////////////////////////////////////////////////

// Importando os pacotes utilizados
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.net.*;

public class Browser extends Panel {
// Esta classe simula um browser
String TextoEscreve = "";
Font FonteBold = new Font("Verdana", Font.BOLD, 11);
Font FontePlain = new Font("Verdana", Font.PLAIN, 11);
boolean primeira = true;
FontMetrics TamFonte;
// Variáveis que definem as coordenadas do texto
int Coluna = 3;
int Linha = 15;
Image imgOff;
Graphics offG;
boolean Sublinhado = false;// Indica quando deverá sublinhar uma string
boolean Quebrou = false;// Indica a quebra de linha
boolean JaEscreveu = false;// Indica se uma palavra já foi escrita
boolean Abriu = false;// Indica que uma tag foi aberta
StringBuffer strTag = new StringBuffer("");
StringBuffer Palavra = new StringBuffer("");
Graphics gGeral;
int TipoTexto = 0;

	public Browser() {
	// Construtor desta classe
		setBackground(new Color(255, 255, 224));
		setLayout(null);
	}
	
	public synchronized void update(Graphics g) {
		paint(g);
	}

	public void paint(Graphics g) {
		// Escrevendo a mensagem
		// Zerando a linha e coluna (caso mova-se a barra de rolagem)
		Linha = 15;
		Coluna = 3;
		if (imgOff == null) {
		    imgOff = createImage(size().width, size().height);
    		offG = imgOff.getGraphics();
		}
		offG.setColor(new Color(255, 255, 224));
		offG.fillRect(0,0,size().width, size().height);
		offG.setColor(new Color(0,0,100));
		if (TipoTexto == 0) {
		// Texto com tags
			offG.setFont(FontePlain);
			Escreve(TextoEscreve, offG);
		} else {
		// Texto sem tags
			offG.setFont(FonteBold);
			offG.drawString(TextoEscreve,Coluna,Linha);
		}
		g.drawImage(imgOff,0,0,this);
		imgOff.flush();
	}

	void Escreve(String strVem, Graphics g) {
	// Este método substitui os comandos HTML e coloca novos comandos
		String Caract = "";// Caracter lido
		strTag.setLength(0);
		Palavra.setLength(0);
		boolean Tag = false;
		JaEscreveu = false;
		int LocalEspaco = 0;
		boolean Escreve = false;
		for (int inc = 0; inc < strVem.length(); inc++) {
			Caract = strVem.substring(inc,inc+1);
			if (Caract.equals("<") || Tag || Caract.equals("&")) {
			// Caso tenha sido encontrada uma tag qualquer
			// a tag é montada e passada para o interpretador
				if (!Palavra.toString().equals("") && Abriu) {
				// Aqui são escritas todas as palavras antecedentes
				// da tag encontrada, caso exista alguma
					if ((Coluna + TamFonte.stringWidth(String.valueOf(Palavra+" "))) >= size().width) {
					// Verificando se é necessária a quebra de linha
						Linha += 15;
						Coluna = 3;
					}
					// Caso a palavra esteja apenas com um pedaço em negrito
					g.drawString(String.valueOf(Palavra),Coluna,Linha);
					Coluna += TamFonte.stringWidth(String.valueOf(Palavra));
					LocalEspaco = inc;
					Palavra.setLength(0);
					JaEscreveu = true;
					// Quebrando a linha
					Quebrou = false;
				}
				// Montando a string com o tag
				strTag.append(Caract);
				if (Caract.equals(">") || Caract.equals(";")) {
				// String com o identificador da tag pronta
					Tag = false;
					IdentTag(String.valueOf(strTag),g);
					strTag.setLength(0);
				} else {
					Tag = true;
				}
				if (Quebrou) {
				// A palavra será escrita antes de se verificar a próxima tag
				// caso tenha ocorrido uma quebra de linha "<br>"
					if ((Coluna + TamFonte.stringWidth(String.valueOf(Palavra+" "))) >= size().width) {
						Linha += 15;
						Coluna = 3;
					}
					// Aqui são escritas todas as palavras antecedentes
					// da tag de quebra de linha "<br>"
					g.drawString(String.valueOf(Palavra),Coluna,Linha);
					// Quebrando a linha
					Linha += 15;
					Coluna = 3;
					LocalEspaco = inc;
					Palavra.setLength(0);
					Quebrou = false;
				}
			} else {
			// Caso seja um texto normal
				if (Caract.equals(" ") || inc == strVem.length()-1) {
				// Quando acabar uma palavra eu escrevo e limpo o buffer
					if (inc == strVem.length()-1) {
					// Pegando o último caracter
						Palavra.append(Caract);
					}
					if ((Coluna + TamFonte.stringWidth(String.valueOf(Palavra+" "))) >= size().width) {
					// Quebrando a linha caso a palavra não caiba
						Linha += 15;
						Coluna = 3;
					}
					// Aqui são escritas as demais palavras
					if (!JaEscreveu) {
						g.drawString(String.valueOf(Palavra),Coluna,Linha);
					}
					JaEscreveu = false;
					Coluna += TamFonte.stringWidth(String.valueOf(Palavra+" "));
					LocalEspaco = inc;
					Palavra.setLength(0);
					if (Sublinhado) {
					// Escrevendo um espaço entre palavras sublinhadas
						g.drawLine(Coluna-TamFonte.stringWidth(" "),Linha+2,Coluna,Linha+2);
					}
				} else {
				// Caso contrário eu continuo formando a palavra
				// OBS: aqui, ele já interpretou a tag de quebra de linha
					Palavra.append(Caract);
					JaEscreveu = false;
				}
				TamFonte = g.getFontMetrics();
				if (Sublinhado) {
				// Escrevendo uma palavra sublinhada
					g.drawLine(Coluna,Linha+2,Coluna+TamFonte.stringWidth(String.valueOf(Palavra)),Linha+2);
				}
			}
		}
	}
	
	void IdentTag(String idTag, Graphics g) {
	// Método que identifica uma tag e executa o seu comando
		if (idTag.equals("<b>")) {
		// Começa a escrever em negrito
			Abriu = true;
			g.setFont(FonteBold);
		} else if (idTag.equals("</b>")) {
		// Para de escrever em negrito
			Abriu = false;
			g.setFont(FontePlain);
		} else if (idTag.equals("<vermelho>")) {
		// Começa a escrever em vermelho
			Abriu = true;
			g.setColor(new Color(255,0,0));
		} else if (idTag.equals("</vermelho>")) {
		// Para de escrever em vermelho
			Abriu = false;
			g.setColor(new Color(0,0,100));
		} else if (idTag.equals("<br>")) {
		// Quebra a linha
			Quebrou = true;
		} else if (idTag.equals("<subl>")) {
		// Começa a escrever sublinhado
			Abriu = true;
			Sublinhado = true;
		} else if (idTag.equals("</subl>")) {
		// Para de escrever sublinhado
			Abriu = false;
			Sublinhado = false;
		} else if (idTag.equals("<u>")) {
		// Começa a escrever sublinhado
			Abriu = true;
			Sublinhado = true;
		} else if (idTag.equals("</u>")) {
		// Para de escrever sublinhado
			Abriu = false;
			Sublinhado = false;
		} else if (idTag.substring(1,6).equals("fonte")) {
		// Começa a escrever com um novo tamanho de fonte
			Abriu = true;
			if (g.getFont().isBold()) {
				g.setFont(new Font("Verdana", Font.BOLD, Integer.valueOf(idTag.substring(idTag.indexOf("=")+1,idTag.indexOf(">"))).intValue()));
			} else {
				g.setFont(new Font("Verdana", Font.PLAIN, Integer.valueOf(idTag.substring(idTag.indexOf("=")+1,idTag.indexOf(">"))).intValue()));
			}
		} else if (idTag.equals("</fonte>")) {
		// Volta a escrever com o tamanho padrão de fonte
			Abriu = false;
			if (g.getFont().isBold()) {
				g.setFont(FonteBold);
			} else {
				g.setFont(FontePlain);
			}
		} else if (idTag.equals("&nbsp;")) {
		// Para de escrever um espaço em branco
			Coluna += TamFonte.stringWidth("  ");
		} else if (idTag.substring(1,5).equals("font")) {
		// Começa a escrever com a cor vermelha
			Abriu = true;
			g.setColor(new Color(255,0,0));
		} else if (idTag.equals("</font>")) {
		// Para de escrever com a cor vermelha
			Abriu = false;
			g.setColor(new Color(0,0,100));
		}
	}
		
	void SetaTexto(String Texto, int Tipo) {
	// Atualiza o texto exibido no browser
		// Zerando as coordenadas para escrever um novo texto
		Linha = 15;
		Coluna = 3;
		// Definindo se o texto contém ou não as tags
		TipoTexto = Tipo;
		TextoEscreve = Texto;
		repaint();
	}
}
