/* Copyright (C) 2007 Felipe A. Lessa * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ package tirateima.gui.variaveis; import java.awt.Color; import java.awt.Dimension; import java.awt.Point; import java.lang.reflect.Constructor; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Map.Entry; /** * Variável que contém uma coleção homogênea de variáveis indexadas por um * índice inteiro (vetor). * * @author felipe.lessa * */ @SuppressWarnings("serial") public class VarArray extends VarGrade { /** * Constrói um novo array com as variáveis definidas. Cada variável deve * ter um nome que corresponda à posição dela no array, e todas devem * ser do mesmo tipo, porém essas propriedades não são verificadas. * @param nome nome da variável. * @param variaveis variáveis. */ public VarArray(String nome, List<Variavel> variaveis, Color cor, Dimension dimensao, Point posicao, Boolean mostraNome) { super(nome, 1, variaveis.size(), variaveis); super.cor = cor; super.dimensao = dimensao; super.posicao = posicao; super.mostraNome = mostraNome; } /** * Constrói um novo array com as variáveis definidas. Cada variável deve * ter um nome que corresponda à posição dela no array, e todas devem * ser do mesmo tipo, porém essas propriedades não são verificadas. * @param nome nome da variável. * @param variaveis variáveis. */ public VarArray(String nome, List<Variavel> variaveis, Color cor, Color corExterna, Dimension dimensao, Point posicao, Boolean mostraNome) { super(nome, 1, variaveis.size(), variaveis); super.cor = cor; super.corExterna = corExterna; super.dimensao = dimensao; super.posicao = posicao; super.mostraNome = mostraNome; } /** * Constrói um novo array vazio a partir de uma classe. * @param nome nome da variável. * @param tamanho tamanho do array. * @param tipo tipo das variáveis (deve derivar de Variavel). * @throws Exception lança uma exceção caso haja algum erro ao criar * as variáveis. */ public VarArray(String nome, int tamanho, Class<Variavel> tipo, Boolean mostraNome) throws Exception { super(nome, 1, tamanho, criarVariaveis(tamanho, tipo)); super.mostraNome = mostraNome; } /** * Mesmo método anterior, mas recebe a variável pronta em * vez de seu tipo. Útil para instanciar arrays de records. * * @param nome Nome da variável. * @param tamanho Tamanho do array. * @param tipo Instância de variável usada como base para os elementos do array. * * @throws Exception Lança exceção caso haja erro ao criar as variáveis. * * @author Luciano Santos */ public VarArray(String nome, int tamanho, Variavel tipo) throws Exception{ super(nome, 1, tamanho, criarVariaveis(tamanho, tipo)); } /** * Mesmo método anterior, mas recebe a variável pronta em * vez de seu tipo. Útil para instanciar arrays de records com cor e tamanhos customizados * * @param nome Nome da variável. * @param tamanho Tamanho do array. * @param tipo Instância de variável usada como base para os elementos do array. * * @throws Exception Lança exceção caso haja erro ao criar as variáveis. * * @author Luciano Santos */ public VarArray(String nome, int tamanho, Variavel tipo, Color cor, Dimension dimensao, Point posicao) throws Exception{ super(nome, 1, tamanho, criarVariaveis(tamanho, tipo)); super.cor = cor; super.dimensao = dimensao; super.posicao = posicao; } /** * Mesmo método anterior, mas recebe a variável pronta em * vez de seu tipo. Útil para instanciar arrays de records com cor e tamanhos customizados * * @param nome Nome da variável. * @param tamanho Tamanho do array. * @param tipo Instância de variável usada como base para os elementos do array. * * @throws Exception Lança exceção caso haja erro ao criar as variáveis. * * @author Luciano Santos */ public VarArray(String nome, int tamanho, Variavel tipo, Color cor, Color corExterna, Dimension dimensao, Point posicao) throws Exception{ super(nome, 1, tamanho, criarVariaveis(tamanho, tipo)); super.cor = cor; super.corExterna = corExterna; super.dimensao = dimensao; super.posicao = posicao; } /** * Mesmo método anterior, mas com possibilidade de não mostrar nome * * @param nome Nome da variável. * @param tamanho Tamanho do array. * @param tipo Instância de variável usada como base para os elementos do array. * * @throws Exception Lança exceção caso haja erro ao criar as variáveis. * * @author Luciano Santos */ public VarArray(String nome, int tamanho, Variavel tipo, Color cor, Color corExterna, Dimension dimensao, Point posicao, boolean mostraNome) throws Exception{ super(nome, 1, tamanho, criarVariaveis(tamanho, tipo)); super.cor = cor; super.corExterna = corExterna; super.dimensao = dimensao; super.posicao = posicao; super.mostraNome = mostraNome; } private static List<Variavel> criarVariaveis(int tamanho, Class<Variavel> tipo) throws Exception { Variavel[] ret = new Variavel[tamanho]; Constructor<Variavel> constr = tipo.getConstructor(String.class); for (int i = 0; i < tamanho; i++) ret[i] = constr.newInstance(String.valueOf(i+1)); return Arrays.asList(ret); } @Override public String dimensions() { StringBuilder builder = new StringBuilder(); Variavel v = variaveis.get(0); if (v instanceof VarGrade) { builder.append(((VarGrade) v).dimensions()); } builder.append("["); builder.append(Integer.toString(variaveis.size())); builder.append("]"); return builder.toString(); } @Override public VarArray criarCopia() { int tamanho = variaveis.size(); Variavel[] novo = new Variavel[tamanho]; for (int i = 0; i < tamanho; i++) novo[i] = variaveis.get(i).criarCopia(); try { VarArray ret = new VarArray(nome, Arrays.asList(novo), cor, corExterna, dimensao, posicao, mostraNome); ret.modificado = modificado; modificado = false; return ret; } catch (Exception e) { e.printStackTrace(); System.exit(1); return null; } } @Override public Color getCorTitulo() { if(corExterna != null){ return corExterna; } if(cor == null){ return new Color(0.7f, 0.7f, 0.7f, 1.0f); } return cor; } @Override public Dimension getTamanhoMaximo() { return new Dimension(7000, 1500); } @Override public Object[] getValor() { Object[] ret = new Object[variaveis.size()]; int i = 0; for (Variavel v : variaveis) ret[i++] = v.getValor(); return ret; } /** * Define um ou mais valores das variáveis deste array. Se valor for null, * todas as variáveis são limpas como se não tivessem qualquer valor. Caso * contrário, valor deve implementar Map<Integer, Object> onde cada chave * corresponde a um índice a partir de zero (variáveis que não sejam * referenciadas não serão modificadas). */ @SuppressWarnings("unchecked") @Override public void setValor(Object valor) { if (valor == null) { for (Variavel v : variaveis) v.setValor(null); } else { Map<Integer, Object> map = (Map<Integer, Object>) valor; for (Entry<Integer, Object> entry : map.entrySet()) variaveis.get(entry.getKey()).setValor(entry.getValue()); } } }