package tirateima.gui.console; import java.awt.Color; import java.util.ArrayList; import java.util.ListIterator; import javax.swing.JTextArea; import tirateima.IEstado; @SuppressWarnings("serial") public class Console extends JTextArea implements IEstado{ /*Total de linhas no texto.*/ private int linhas_max = 100; /*Largura máxima das linhas em caracteres.*/ private int larg_max = 80; /*Linhas de texto.*/ private ArrayList<String> linhas; /** * Seta valores ao construtor da superclasse */ public Console(){ super(); linhas = new ArrayList<String>(); setBackground(Color.black); setForeground(Color.white); setEditable(false); } /** * Recebe a string a ser mostrada no console e seta ela * * @param s */ public Console(String s){ this(); setText(s); } public int getLinhasMax(){ return linhas_max; } /** * Restringe o intervalo no qual irá variar a quantidade de linhas * * @param linhas: quantidade de linhas do console */ public void setLinhasMax(int linhas){ if((linhas < 10) || (linhas > 500)){ throw new IllegalArgumentException( "Número máximo de linhas deve estar entre 10 e 500."); } linhas_max = linhas; } public int getLargMax(){ return larg_max; } /** * Restringe o intervalo no qual irá variar a largura do console * * @param caracteres: quantidade de caracteres mostrados em uma linha */ public void setLargMax(int caracteres){ if((caracteres < 10) || (caracteres > 200)){ throw new IllegalArgumentException( "Largura máxima em caracteres deve estar entre 10 e 200."); } larg_max = caracteres; } /** * Garante o funcionamento correto das linhas do console * * @param s */ public void print(String s){ /** * pega a última linha e adiciona o texto */ String temp = linhas.size() > 0 ? linhas.get(linhas.size() - 1) + s: s; /** * garante não repetir a última linha */ if(linhas.size() > 0){ linhas.remove(linhas.size() - 1); } /** * gera e adiciona as linhas, se necessário */ linhas.addAll(encontrarLinhas(temp)); /** * garante que o total de linhas não ultrapasse o máximo definido */ if(linhas.size() > linhas_max){ ArrayList<String> temp_list = new ArrayList<String>(); temp_list.addAll(linhas.subList( linhas.size() - larg_max, linhas.size() - 1)); } /** * mostra o novo texto */ organizarTexto(); } public void print(char[] ca){ print(new String(ca)); } public void print(char c){ print("" + c); } public void print(int i){ print(Integer.toString(i)); } public void print(byte b){ print(Byte.toString(b)); } public void print(float f){ print(Float.toString(f)); } public void print(double d){ print(Double.toString(d)); } public void print(Object o){ print(o.toString()); } public void println(String s){ print(s + '\n'); } public void println(){ println(""); } public void println(char[] ca){ println(new String(ca)); } public void println(char c){ println("" + c); } public void println(int i){ println(Integer.toString(i)); } public void println(byte b){ println(Byte.toString(b)); } public void println(float f){ println(Float.toString(f)); } public void println(double d){ println(Double.toString(d)); } public void println(Object o){ println(o.toString()); } public void clear(){ setText(""); } public void setText(String s){ linhas = encontrarLinhas(s); organizarTexto(); } /** * Recebe um objeto e tenta transforma-lo em string, caso ele seja diferente de NULL * Se o parametro for NULL ele atribui uma string vazia ao setText utilizando o Clear() * * @param Objetc o */ public void setEstado(Object o){ if(o != null){ try{ String s = (String) o; setText(s); }catch(Exception e){ e.printStackTrace(); clear(); } }else{ clear(); } } public Object getEstado(){ return getText(); } /** * Esse metodo recebe uma string, separa ela em um array de char e concatena esses chars * utilizando a classe StringBuffer e transformando-a em string novamente * * Feito isso, o metodo grava essa string em uma lista de strings, retornando-as * * @param s * @return ArrayList<String> lista */ private ArrayList<String> encontrarLinhas(String s){ ArrayList<String> lista = new ArrayList<String>(); char array[] = s.toCharArray(); for(int i = 0; i < s.length(); i++){ StringBuffer temp = new StringBuffer(); for(int j = 0; (j < larg_max)&&(i < s.length()); j++, i++){ char a = array[i]; temp.append(a); if(a == '\n') break; } lista.add(temp.toString()); } return lista; } private void organizarTexto(){ StringBuffer temp = new StringBuffer(); ListIterator<String> i = linhas.listIterator(); while(i.hasNext()){ temp.append(i.next()); } super.setText(temp.toString()); setCaretPosition(getText().length()); } }