package tirateima.gui.arquivos; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import javax.swing.JComponent; import javax.swing.JTabbedPane; import tirateima.IEstado; public class GerenciadorArquivos extends JComponent implements IEstado{ private static final long serialVersionUID = 7976910393135080383L; private ArrayList<AbstractArquivo> arquivos = new ArrayList<AbstractArquivo>(); private int arq_atual = -1; private JTabbedPane pPrincipal = null; private class EstadoGA{ /* Arquivo sendo visualizado atualmente. */ public int arq_atual; /* Lista dos arquivos neste GA. */ public ArrayList<AbstractArquivo> arquivos; /* Lista dos estados de cada arquivo, na ordem. */ public ArrayList<Object> estados; public EstadoGA(ArrayList<AbstractArquivo> arquivos, int arq_atual){ assert arquivos != null; this.arq_atual = arq_atual; this.arquivos = arquivos; estados = new ArrayList<Object>(); ListIterator<AbstractArquivo> i = arquivos.listIterator(); while(i.hasNext()){ estados.add(i.next().getEstado()); } } } public GerenciadorArquivos(){ super(); inicializar(); } /** * Adiciona um novo arquivo ao GA. * * @param f Arquivo a ser adicionado. */ public void adicionarArquivo(AbstractArquivo f){ assert(f != null); if(arquivos.size() == 0){ arq_atual = 0; }else{ if(buscarArquivo(f.getName()) >= 0){ throw new IllegalArgumentException("Arquivo já existente!"); } } arquivos.add(f); //atualizarVisualizacao(); } /** * Remove um arquivo do GA. * * @param nome Nome do arquivo a ser removido. */ public void removerArquivo(String nome){ assert(nome != null); int indice; if((indice = buscarArquivo(nome)) >= 0){ arquivos.remove(indice); //atualizarVisualizacao(); }else{ throw new IllegalArgumentException("Arquivo não encontrado!"); } } /** * Retorna um arquivo deste GA. * * @param nome Nome do arquivo. * * @return Arquivo, se achar. * @return null Se não achar. */ public AbstractArquivo getArquivo(String nome){ assert(nome != null); int indice; if((indice = buscarArquivo(nome)) >= 0){ setSelecionado(indice); return arquivos.get(indice); } return null; } public void setSelecionado(int indice) { //TODO testar indice arq_atual = indice; } //IEstado public Object getEstado(){ if(arquivos.size() == 0){ return null; } ArrayList<AbstractArquivo> temp = new ArrayList<AbstractArquivo>(); temp.addAll(arquivos); return new EstadoGA(arquivos, arq_atual); } public void setEstado(Object estado){ arquivos = new ArrayList<AbstractArquivo>(); arq_atual = -1; if(estado != null){ EstadoGA e = (EstadoGA) estado; arq_atual = e.arq_atual; arquivos = e.arquivos; ListIterator<AbstractArquivo> i = arquivos.listIterator(); ListIterator<Object> j = e.estados.listIterator(); while(i.hasNext()){ i.next().setEstado(j.next()); } } atualizarVisualizacao(); } /** * Retorna o índice de um arquivo na lista de arquivos. * * @param nome Nome do arquivo a ser buscado. * @return Indice do arquivo. */ protected int buscarArquivo(String nome){ int indice = 0; boolean achou = false; ListIterator<AbstractArquivo> i = arquivos.listIterator(); while(i.hasNext() && !achou){ if(i.next().getName().equalsIgnoreCase(nome)){ achou = true; }else{ indice++; } } return achou ? indice : -1; } /** * Inicializa a interface do GA. */ private void inicializar(){ setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.CENTER; gbc.fill = GridBagConstraints.BOTH; gbc.weightx = gbc.weighty = 1.0; add(getPPrincipal(), gbc); setVisible(false); } private JTabbedPane getPPrincipal(){ if(pPrincipal == null){ pPrincipal = new JTabbedPane(); } return pPrincipal; } /** * Arruma a interface do GA. */ private void atualizarVisualizacao(){ pPrincipal.removeAll(); ListIterator<AbstractArquivo> i = arquivos.listIterator(); while(i.hasNext()){ pPrincipal.add(i.next()); } if(arquivos.size() > 0){ setVisible(true); pPrincipal.setSelectedIndex(arq_atual); }else{ setVisible(false); } } public void setVisible(boolean visivel) { if (this.visivel != visivel) { this.visivel = visivel; super.setVisible(visivel); ListIterator<ArquivoVisivelEventListener> i = eventos.listIterator(); if (visivel) { while(i.hasNext()) { i.next().ficouVisivel(); } } else { while(i.hasNext()) { i.next().ficouInvisivel(); } } } } public void addArquivoVisivelListener(ArquivoVisivelEventListener e) { eventos.add(e); } private boolean visivel; List<ArquivoVisivelEventListener> eventos = new ArrayList<ArquivoVisivelEventListener>(); public Dimension getPreferredSize() { if (arquivos.size() > 0) { return arquivos.get(arq_atual).getPreferredSize(); } else { return new Dimension(0, 300); } } }