/*
* Copyright (C) 2010, Emergya (http://www.emergya.es)
*
* @author <a href="mailto:jlrodriguez@emergya.es">Juan Luís Rodríguez</a>
* @author <a href="mailto:marias@emergya.es">María Arias</a>
* @author <a href="mailto:fario@emergya.es">Félix del Río Beningno</a>
*
* This file is part of GoFleet
*
* This software 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 software 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 library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* As a special exception, if you link this library with other files to
* produce an executable, this library does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* This exception does not however invalidate any other reasons why the
* executable file might be covered by the GNU General Public License.
*/
package es.emergya.ui.plugins.admin.aux1;
import static es.emergya.cliente.constants.LogicConstants.getIcon;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.SwingWorker;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.gofleet.context.GoWired;
import org.gofleet.internacionalization.I18n;
import es.emergya.cliente.constants.LogicConstants;
import es.emergya.consultas.FlotaConsultas;
import es.emergya.consultas.RolConsultas;
import es.emergya.ui.base.BasicWindow;
import es.emergya.ui.plugins.AdminPanel.SaveOrUpdateAction;
/**
*
* @author fario
* @author marias
*
*/
public abstract class SummaryAction extends AbstractAction {
private static final Dimension DIMENSION_COMBO = new Dimension(250, 22);
static final Log log = LogFactory.getLog(SummaryAction.class);
private static final int FILTER_HEIGHT = 70;
private static final int HEIGHT = 250;
private static final int BUTTON_WIDTH = 45;
private static final int PANEL_WIDTH = 240;
private final int textfieldSize = 40;
private static final long serialVersionUID = -2871120480603090949L;
protected boolean cambios = false;
protected List<Object> leftItems = new ArrayList<Object>();
protected List<Object> rightItems = new ArrayList<Object>();
private DocumentListener changeListener = new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent arg0) {
}
@Override
public void insertUpdate(DocumentEvent arg0) {
cambios = true;
}
@Override
public void removeUpdate(DocumentEvent arg0) {
cambios = true;
}
};
final ActionListener changeSelectionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
cambios = true;
}
};
final protected JTextField textfieldCabecera = new JTextField();
final protected JTextField textfieldPie = new JTextField();
final protected JList left = new JList();
final protected JList right = new JList();
final protected JComboBox iconos = new JComboBox(new DefaultComboBoxModel());
protected boolean isNew = false;
private JLabel i = new JLabel();
protected final JCheckBox habilitado = new JCheckBox();
protected final JCheckBox administrador = new JCheckBox();
protected final JComboBox rol = new JComboBox(new DefaultComboBoxModel());
protected final JTextField apellidos = new JTextField(textfieldSize);
protected final JTextField nombre = new JTextField(textfieldSize);
protected final JPasswordField contrasenya = new JPasswordField(
textfieldSize / 3);
protected final JPasswordField repetir = new JPasswordField(
textfieldSize / 3);
protected final JComboBox comboTipoCapa = new JComboBox(
new DefaultComboBoxModel());
protected final JButton izquierda = new JButton(LogicConstants
.getIcon("button_left"));
protected boolean abriendo = false;
@GoWired
public BasicWindow window;
public void setWindow(BasicWindow window) {
this.window = window;
}
/**
*
* @param o
* objeto a borrar
*/
public SummaryAction(Object o) {
super(null, getIcon("Admin.summary"));
iconos.setPreferredSize(DIMENSION_COMBO);
rol.setPreferredSize(DIMENSION_COMBO);
comboTipoCapa.setPreferredSize(DIMENSION_COMBO);
isNew = (o == null);
textfieldPie.getDocument().addDocumentListener(changeListener);
textfieldCabecera.getDocument().addDocumentListener(changeListener);
nombre.getDocument().addDocumentListener(changeListener);
apellidos.getDocument().addDocumentListener(changeListener);
contrasenya.getDocument().addDocumentListener(changeListener);
administrador.addActionListener(changeSelectionListener);
habilitado.addActionListener(changeSelectionListener);
rol.addActionListener(changeSelectionListener);
habilitado.setOpaque(false);
administrador.setOpaque(false);
comboTipoCapa.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cambios = true;
}
});
}
protected JFrame d = null;
@Override
public void actionPerformed(ActionEvent e) {
// Utilizamos un lock sobre el objeto para evitar abrir varias fichas
// del mismo objeto ya que las acciones a realizar se lanzan en un
// SwingWorker
// sobre el que no tenemos garantizado el instante de ejecución, lo que
// puede hacer que se llame varias veces a getSummaryDialog().
synchronized (this) {
if (abriendo) {
if (log.isTraceEnabled()) {
log.trace("Ya hay otra ventana "
+ this.getClass().getName() + " abriéndose...");
}
return;
}
abriendo = true;
}
SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
try {
if (d == null || !d.isShowing()) {
d = getSummaryDialog();
}
if (d != null) {
d.pack();
int x;
int y;
Container myParent = window.getPluginContainer()
.getDetachedTab(0);
Point topLeft = myParent.getLocationOnScreen();
Dimension parentSize = myParent.getSize();
Dimension mySize = d.getSize();
if (parentSize.width > mySize.width) {
x = ((parentSize.width - mySize.width) / 2)
+ topLeft.x;
} else {
x = topLeft.x;
}
if (parentSize.height > mySize.height) {
y = ((parentSize.height - mySize.height) / 2)
+ topLeft.y;
} else {
y = topLeft.y;
}
d.setLocation(x, y);
} else {
log
.error("No pude abrir la ficha por un motivo desconocido");
}
return null;
} catch (Throwable t) {
log.error("Error al abrir la ficha", t);
return null;
}
}
@Override
protected void done() {
if (d != null) {
d.setVisible(true);
d.setExtendedState(JFrame.NORMAL);
d.setAlwaysOnTop(true);
d.requestFocus();
}
abriendo = false;
if (log.isTraceEnabled()) {
log.info("Swingworker " + this.getClass().getName()
+ " finalizado. Abriendo = false");
}
}
};
sw.execute();
}
protected abstract JFrame getSummaryDialog();
@SuppressWarnings("unchecked")
protected JFrame generateSimpleDialog(final String label_cabecera,
final String label_pie, final String titulo,
final SaveOrUpdateAction guardar, final Icon icono,
final String title) {
try {
final JFrame d = createJDialog(titulo);
JPanel cabecera = buildCabecera(label_cabecera, textfieldSize,
icono, title, null);
d.add(cabecera, BorderLayout.NORTH);
JPanel central = buildSimpleCentral(label_pie, guardar, d);
d.add(central, BorderLayout.CENTER);
guardar.setFrame(d);
return d;
} catch (Throwable t) {
log.error("Error al cargar el summary dialog", t);
return null;
}
}
@SuppressWarnings("unchecked")
private JPanel buildSimpleCentral(final String labelPie,
final SaveOrUpdateAction guardar, final JFrame d) {
JPanel central = new JPanel(new GridBagLayout());
central.setOpaque(false);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(2, 1, 2, 1);
gbc.gridwidth = 1;
central.add(Box.createVerticalStrut(10), gbc);
gbc.gridy++;
gbc.gridx = 0;
gbc.anchor = GridBagConstraints.LINE_END;
JLabel nombreLbl = new JLabel("Nombre:", SwingConstants.RIGHT);
central.add(nombreLbl, gbc);
gbc.gridx++;
gbc.gridwidth = 3;
gbc.anchor = GridBagConstraints.LINE_START;
central.add(nombre, gbc);
gbc.gridy++;
gbc.gridx = 0;
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.LINE_END;
JLabel apellidosLbl = new JLabel("Apellidos: ", SwingConstants.RIGHT);
central.add(apellidosLbl, gbc);
gbc.gridx++;
gbc.gridwidth = 3;
gbc.anchor = GridBagConstraints.LINE_START;
central.add(apellidos, gbc);
gbc.anchor = GridBagConstraints.LINE_END;
JLabel rolLbl = new JLabel("Rol:", SwingConstants.RIGHT);
gbc.gridy++;
gbc.gridx = 0;
gbc.gridwidth = 1;
central.add(rolLbl, gbc);
gbc.gridx++;
gbc.gridwidth = 3;
gbc.anchor = GridBagConstraints.LINE_START;
central.add(rol, gbc);
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.LINE_END;
JLabel contrasenyaLbl = new JLabel("Contraseña:", SwingConstants.RIGHT);
gbc.gridy++;
gbc.gridx = 0;
central.add(contrasenyaLbl, gbc);
gbc.gridx++;
gbc.anchor = GridBagConstraints.LINE_START;
central.add(contrasenya, gbc);
gbc.anchor = GridBagConstraints.LINE_END;
JLabel contrasenya2Lbl = new JLabel("Repetir Contraseña:",
SwingConstants.RIGHT);
gbc.gridx++;
central.add(contrasenya2Lbl, gbc);
gbc.gridx++;
gbc.anchor = GridBagConstraints.LINE_START;
central.add(repetir, gbc);
gbc.anchor = GridBagConstraints.LINE_END;
JLabel administradorLbl = new JLabel("Administrador:",
SwingConstants.RIGHT);
gbc.gridy++;
gbc.gridx = 0;
central.add(administradorLbl, gbc);
gbc.gridx++;
gbc.anchor = GridBagConstraints.LINE_START;
central.add(administrador, gbc);
administrador.setOpaque(false);
gbc.anchor = GridBagConstraints.LINE_END;
JLabel habilitadoLbl = new JLabel("Habilitado", SwingConstants.RIGHT);
gbc.gridx++;
central.add(habilitadoLbl, gbc);
gbc.gridx++;
gbc.anchor = GridBagConstraints.LINE_START;
central.add(habilitado, gbc);
habilitado.setOpaque(false);
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor = GridBagConstraints.LINE_END;
JLabel labl_pie = new JLabel(labelPie, JLabel.LEFT);
central.add(labl_pie, gbc);
textfieldPie.setColumns(textfieldSize);
labl_pie.setLabelFor(textfieldPie);
gbc.gridx++;
gbc.gridwidth = 4;
gbc.anchor = GridBagConstraints.LINE_START;
central.add(textfieldPie, gbc);
gbc.gridy++;
gbc.gridx = 0;
central.add(Box.createVerticalStrut(10), gbc);
gbc.gridwidth = 2;
gbc.gridy++;
gbc.gridx = 1;
JPanel botones = getBotonesSalir(guardar, d, 250);
central.add(botones, gbc);
((DefaultComboBoxModel) rol.getModel()).removeAllElements();
for (String r : RolConsultas.getAllNames()) {
((DefaultComboBoxModel) rol.getModel()).addElement(r);
}
return central;
}
private JPanel getBotonesSalir(final SaveOrUpdateAction guardar,
final JFrame d, int width) {
JPanel botones = new JPanel(new FlowLayout(FlowLayout.TRAILING));
botones.setPreferredSize(new Dimension(width, 40));
botones.setOpaque(false);
botones.add(getGuardarBtn(guardar));
botones.add(getCancelBtn(d));
return botones;
}
private JButton getCancelBtn(final JFrame d) {
JButton cancelar = new JButton("Cancelar", LogicConstants
.getIcon("button_cancel"));
cancelar.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (cambios) {
int res = JOptionPane
.showConfirmDialog(
d,
"Existen cambios sin guardar. ¿Seguro que desea cerrar la ventana?",
"Cambios sin guardar",
JOptionPane.OK_CANCEL_OPTION);
if (res != JOptionPane.CANCEL_OPTION) {
d.dispose();
}
} else {
d.dispose();
}
}
});
return cancelar;
}
@SuppressWarnings("unchecked")
protected JFrame generateUrlDialog(final String label_cabecera,
final String label_pie, final String centered_label,
final String titulo, final Object[] left_items,
final Object[] right_items, final String left_label,
final String right_label, final SaveOrUpdateAction guardar,
final Icon icono, final String title, final Boolean habilitada,
final Boolean tipoCapa, final String url) {
int width_listas = SummaryAction.PANEL_WIDTH;
if (left_items == null)
width_listas = width_listas * 3 / 2;
final Dimension dimensionList = new Dimension(width_listas,
SummaryAction.HEIGHT);
final Dimension dimensionPanel = new Dimension(
SummaryAction.PANEL_WIDTH + 15, SummaryAction.HEIGHT
+ SummaryAction.FILTER_HEIGHT + 15);
final Dimension dimensionButtonPanel = new Dimension(
SummaryAction.BUTTON_WIDTH, SummaryAction.HEIGHT);
final Dimension dimensionFilterLateral = new Dimension(
SummaryAction.PANEL_WIDTH, SummaryAction.FILTER_HEIGHT);
if (d != null) {
d.setVisible(true);
return d;
}
d = createJDialog(titulo);
JPanel cabecera = buildCabecera(label_cabecera, textfieldSize, icono,
title, null);
JPanel caracteristicas = new JPanel(new FlowLayout());
caracteristicas.setOpaque(false);
caracteristicas.add(new JLabel("Tipo de Capa: "));
((DefaultComboBoxModel) comboTipoCapa.getModel()).removeAllElements();
((DefaultComboBoxModel) comboTipoCapa.getModel()).addElement("Base");
((DefaultComboBoxModel) comboTipoCapa.getModel())
.addElement("Opcional");
caracteristicas.add(comboTipoCapa);
caracteristicas.add(new JLabel("Habilitada:"));
caracteristicas.add(habilitado);
cabecera.add(caracteristicas, BorderLayout.SOUTH);
d.add(cabecera, BorderLayout.NORTH);
JPanel urlPanel = new JPanel(new FlowLayout());
urlPanel.setOpaque(false);
urlPanel.add(new JLabel("URL:"));
urlPanel.add(nombre);
JPanel central = buildCentralUrl(centered_label, left_items,
right_items, left_label, right_label, textfieldSize,
dimensionList, dimensionPanel, dimensionButtonPanel,
dimensionFilterLateral, urlPanel);
d.add(central, BorderLayout.CENTER);
JPanel pie = buildPie(label_pie, guardar, textfieldSize, d);
d.add(pie, BorderLayout.SOUTH);
if (guardar != null) {
guardar.setFrame(d);
}
return d;
}
@SuppressWarnings("unchecked")
protected JFrame generateIconDialog(final String label_cabecera,
final String label_pie, final String centered_label,
final String titulo, final Object[] left_items,
final Object[] right_items, final String left_label,
final String right_label, final SaveOrUpdateAction guardar,
final Icon icono, final String title,
final String icono_seleccionado) {
final Dimension dimensionList = new Dimension(
SummaryAction.PANEL_WIDTH, SummaryAction.HEIGHT);
final Dimension dimensionPanel = new Dimension(
SummaryAction.PANEL_WIDTH + 5, SummaryAction.HEIGHT
+ SummaryAction.FILTER_HEIGHT + 5);
final Dimension dimensionButtonPanel = new Dimension(
SummaryAction.BUTTON_WIDTH, SummaryAction.HEIGHT);
final Dimension dimensionFilterLateral = new Dimension(
SummaryAction.PANEL_WIDTH, SummaryAction.FILTER_HEIGHT);
final JFrame d = createJDialog(titulo);
d.setResizable(false);
JPanel cabecera = buildCabecera(label_cabecera, textfieldSize, icono,
title, icono_seleccionado);
d.add(cabecera, BorderLayout.NORTH);
JPanel central = buildCentral(centered_label, left_items, right_items,
left_label, right_label, textfieldSize, dimensionList,
dimensionPanel, dimensionButtonPanel, dimensionFilterLateral);
d.add(central, BorderLayout.CENTER);
JPanel pie = buildPie(label_pie, guardar, textfieldSize, d);
d.add(pie, BorderLayout.SOUTH);
if (guardar != null) {
guardar.setFrame(d);
}
return d;
}
private JFrame createJDialog(final String titulo) {
final JFrame d = new JFrame(titulo);
d.setResizable(false);
d.setAlwaysOnTop(true);
d.setIconImage(window.getIconImage());
d.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
d.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
if (cambios) {
int res = JOptionPane
.showConfirmDialog(
d,
"Existen cambios sin guardar. ¿Seguro que desea cerrar la ventana?",
"Cambios sin guardar",
JOptionPane.OK_CANCEL_OPTION);
if (res != JOptionPane.CANCEL_OPTION) {
e.getWindow().dispose();
}
} else {
e.getWindow().dispose();
}
}
});
d.setLayout(new BorderLayout(5, 5));
d.setBackground(Color.WHITE);
d.getContentPane().setBackground(Color.WHITE);
return d;
}
private JPanel buildCentralUrl(final String centered_label,
final Object[] left_items, final Object[] right_items,
final String left_label, final String right_label,
final int textfieldSize, final Dimension dimensionList,
final Dimension dimensionPanel,
final Dimension dimensionButtonPanel,
final Dimension dimensionFilterLateral, JPanel cabecera) {
JPanel central = buildCenter(centered_label);
GridBagConstraints gbc = new GridBagConstraints();
buildJList(dimensionList, left_items, left, false);
JScrollPane scrollleft = addScrollPane(dimensionList, left);
buildJList(dimensionList, right_items, right, false);
JScrollPane scrollright = addScrollPane(dimensionList, right);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.insets = new Insets(10, 10, 10, 10);
gbc.gridwidth = 5;
central.add(cabecera, gbc);
gbc.gridwidth = 1;
gbc.gridy++;
JPanel leftPanel = null;
if (left_items != null) {
leftPanel = buildLateral(left_label, dimensionPanel,
dimensionFilterLateral, scrollleft, left, true);
leftItems.clear();
for (Object o : ((DefaultListModel) left.getModel()).toArray()) {
leftItems.add(o);
}
central.add(leftPanel, gbc);
gbc.gridx++;
JPanel botones = buildBotones(dimensionButtonPanel, left, right);
central.add(botones, gbc);
gbc.gridx++;
right.setEnabled(true);
comboTipoCapa.setEnabled(true);
habilitado.setEnabled(true);
} else {
right.setEnabled(false);
}
JPanel rightPanel = buildLateral(right_label, dimensionPanel,
dimensionFilterLateral, scrollright, right, false);
rightItems.clear();
for (Object o : ((DefaultListModel) right.getModel()).toArray()) {
rightItems.add(o);
}
central.add(rightPanel, gbc);
if (left_items != null) {
final JButton up = new JButton(LogicConstants.getIcon("button_up"));
up.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
reorder(0, right.getModel().getSize() - 1);
}
});
up.setBorderPainted(false);
up.setOpaque(false);
up.setContentAreaFilled(false);
final JButton down = new JButton(LogicConstants
.getIcon("button_down"));
down.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
reorder(right.getModel().getSize() - 1, 0);
}
});
down.setBorderPainted(false);
down.setOpaque(false);
down.setContentAreaFilled(false);
JPanel upDown = new JPanel(new FlowLayout());
upDown.setOpaque(false);
upDown.add(up);
upDown.add(down);
upDown.setPreferredSize(new Dimension(SummaryAction.BUTTON_WIDTH,
100));
gbc.gridx++;
central.add(upDown, gbc);
}
JPanel resultado = new JPanel(new BorderLayout(10, 5));
final TitledBorder titledBorder = new TitledBorder(centered_label);
resultado.setBorder(titledBorder);
resultado.setOpaque(false);
resultado.add(central, BorderLayout.CENTER);
JPanel res = new JPanel(new BorderLayout());
res.setOpaque(false);
res.setBorder(new EmptyBorder(0, 15, 0, 15));
res.add(resultado);
return res;
}
private void reorder(int inicio, int fin) {
boolean sentido = inicio < fin;
LinkedList<Object> aSubir = new LinkedList<Object>();
LinkedList<Object> resultado = new LinkedList<Object>();
for (Object o : right.getSelectedValues()) {
aSubir.add(o);
}
final DefaultListModel defaultListModel = (DefaultListModel) right
.getModel();
if (log.isTraceEnabled()) {
log.trace("Elementos seleccionados:");
for (Object o : aSubir) {
log.trace(o + " " + o.getClass());
}
}
for (int i = inicio; (sentido ? i <= fin : fin <= i); i = (sentido ? i + 1
: i - 1)) {
Object o = defaultListModel.get(i);
if (aSubir.contains(o) && i != inicio) {
Object siguiente = resultado.pollLast();
log.trace("Cambiamos " + o + " por " + siguiente);
resultado.add(o);
resultado.add(siguiente);
} else {
log.trace("Añadimos " + o);
resultado.add(o);
}
}
((DefaultListModel) right.getModel()).removeAllElements();
log.trace("Nueva lista: ");
int inicio2 = (sentido ? 0 : resultado.size() - 1);
int fin2 = (sentido ? resultado.size() - 1 : 0);
for (int i = inicio2; (sentido ? i <= fin2 : fin2 <= i); i = (sentido ? i + 1
: i - 1)) {
Object o = resultado.get(i);
log.trace("Nueva lista >" + o);
((DefaultListModel) right.getModel()).addElement(o);
}
int seleccion[] = new int[aSubir.size()];
int k = 0;
for (Integer i = 0; i < right.getModel().getSize(); i++) {
if (aSubir.contains(right.getModel().getElementAt(i))) {
seleccion[k++] = i;
}
}
right.setSelectedIndices(seleccion);
right.updateUI();
}
private JPanel buildCentral(final String centered_label,
final Object[] left_items, final Object[] right_items,
final String left_label, final String right_label,
final int textfieldSize, final Dimension dimension,
final Dimension dimension1, final Dimension dimension2,
final Dimension dimension3) {
JPanel central = buildCenter(centered_label);
GridBagConstraints gbc = new GridBagConstraints();
buildJList(dimension, left_items, left);
JScrollPane scrollleft = addScrollPane(dimension, left);
buildJList(dimension, right_items, right);
JScrollPane scrollright = addScrollPane(dimension, right);
gbc.gridx = 0;
gbc.insets = new Insets(10, 10, 10, 10);
JPanel leftPanel = null;
if (left_items != null) {
leftPanel = buildLateral(left_label, dimension1, dimension3,
scrollleft, left, true);
leftItems.clear();
for (Object o : ((DefaultListModel) left.getModel()).toArray()) {
leftItems.add(o);
}
central.add(leftPanel, gbc);
gbc.gridx++;
JPanel botones = buildBotones(dimension2, left, right);
central.add(botones, gbc);
gbc.gridx++;
right.setEnabled(true);
comboTipoCapa.setEnabled(true);
habilitado.setEnabled(true);
} else {
right.setEnabled(false);
}
JPanel rightPanel = buildLateral(right_label, dimension1, dimension3,
scrollright, right, false);
rightItems.clear();
for (Object o : ((DefaultListModel) right.getModel()).toArray()) {
rightItems.add(o);
}
central.add(rightPanel, gbc);
JPanel resultado = new JPanel(new BorderLayout(10, 5));
final TitledBorder titledBorder = new TitledBorder(centered_label);
resultado.setBorder(titledBorder);
resultado.setOpaque(false);
resultado.add(central, BorderLayout.CENTER);
JPanel res = new JPanel(new BorderLayout());
res.setOpaque(false);
res.setBorder(new EmptyBorder(0, 15, 0, 15));
res.add(resultado);
return res;
}
private JPanel buildLateral(final String topLabel,
final Dimension dimension1, final Dimension dimensionFilterLateral,
JScrollPane scrollList, JList list, boolean left) {
JPanel leftPanel = new JPanel(new GridBagLayout());
leftPanel.setOpaque(false);
leftPanel.setMinimumSize(dimension1);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy = 0;
JPanel left_filtro = buildPanelFilter(topLabel, textfieldSize - 21,
dimensionFilterLateral, list, left);
leftPanel.add(left_filtro, gbc);
gbc.gridy++;
leftPanel.add(scrollList, gbc);
return leftPanel;
}
private JPanel buildPanelFilter(final String topLabel,
final int textfieldSize, final Dimension dimension,
final JList list, final boolean left) {
JPanel left_filtro = new JPanel(new GridBagLayout());
left_filtro.setPreferredSize(dimension);
left_filtro.setOpaque(false);
final GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.BASELINE_LEADING;
left_filtro.add(new JLabel(topLabel, JLabel.LEFT), gbc);
final JTextField filtro = new JTextField(textfieldSize);
gbc.gridy++;
left_filtro.add(filtro, gbc);
AbstractAction actionStartFilter = new AbstractAction(null,
getIcon("Buttons.noFiltrar")) {
private static final long serialVersionUID = -4737487889360372801L;
@Override
public void actionPerformed(ActionEvent e) {
((DefaultListModel) list.getModel()).removeAllElements();
filtro.setText(null);
if (left) {
for (Object obj : leftItems) {
((DefaultListModel) list.getModel()).addElement(obj);
}
} else {
for (Object obj : rightItems) {
((DefaultListModel) list.getModel()).addElement(obj);
}
}
}
};
AbstractAction actionStopFilter = new AbstractAction(null,
getIcon("Buttons.filtrar")) {
private static final long serialVersionUID = 6570608476764008290L;
@Override
public void actionPerformed(ActionEvent e) {
((DefaultListModel) list.getModel()).removeAllElements();
if (left) {
for (Object obj : leftItems) {
if (compare(filtro, obj)) {
((DefaultListModel) list.getModel())
.addElement(obj);
}
}
} else {
for (Object obj : rightItems) {
if (compare(filtro, obj)) {
((DefaultListModel) list.getModel())
.addElement(obj);
}
}
}
}
private boolean compare(final JTextField filtro, Object obj) {
final String elemento = obj.toString().toUpperCase().trim();
final String text = filtro.getText().toUpperCase().trim();
final String pattern = text.replace("*", ".*");
boolean res = Pattern.matches(pattern, elemento);
return res;// || elemento.indexOf(text) >= 0;
}
};
JButton jButton = new JButton(actionStartFilter);
JButton jButton2 = new JButton(actionStopFilter);
jButton.setBorderPainted(false);
jButton2.setBorderPainted(false);
jButton.setContentAreaFilled(false);
jButton2.setContentAreaFilled(false);
jButton.setPreferredSize(new Dimension(
jButton.getIcon().getIconWidth(), jButton.getIcon()
.getIconHeight()));
jButton2.setPreferredSize(new Dimension(jButton2.getIcon()
.getIconWidth(), jButton2.getIcon().getIconHeight()));
gbc.gridx++;
left_filtro.add(jButton2, gbc);
gbc.gridx++;
left_filtro.add(jButton, gbc);
return left_filtro;
}
private JScrollPane addScrollPane(final Dimension dimension,
final JList list) {
JScrollPane scrollleft = new JScrollPane(list);
scrollleft.setOpaque(false);
scrollleft
.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollleft.getViewport().setOpaque(false);
scrollleft.setPreferredSize(dimension);
return scrollleft;
}
private JList buildJList(final Dimension dimension, final Object[] items,
final JList list) {
return buildJList(dimension, items, list, true);
}
private JList buildJList(final Dimension dimension, final Object[] items,
final JList list, final boolean sort) {
if (items == null) {
return null;
}
list.setModel(new DefaultListModel() {
@Override
public void addElement(Object obj) {
boolean inserted = false;
if (sort) {
for (int i = 0; i < this.getSize() && !inserted; i++) {
try {
final String comparator = ((obj == null) ? "" : obj
.toString());
if (this.get(i).toString().compareTo(comparator) > 0) {
this.add(i, obj);
inserted = true;
}
} catch (Throwable t) {
log.error("Error al ordenar a " + obj
+ " y no lo incluimos", t);
inserted = true;
}
}
}
if (!inserted) {
super.addElement(obj);
}
}
});
log.trace("Lista con " + items.length + " objetos");
for (Object obj : items) {
((DefaultListModel) list.getModel()).addElement(obj);
}
list.setCellRenderer(new DefaultListCellRenderer() {
private static final long serialVersionUID = -987995602141400182L;
@Override
public Component getListCellRendererComponent(JList list,
Object value, int index, boolean isSelected,
boolean cellHasFocus) {
JLabel c = new JLabel();
c.setText(value.toString());
if (isSelected) {
c.setOpaque(true);
c.setBackground(Color.YELLOW);
}
return c;
}
});
list.setMinimumSize(dimension);
list.setFixedCellHeight(22);
return list;
}
@SuppressWarnings("unchecked")
private JPanel buildPie(final String label_pie,
final SaveOrUpdateAction guardar, final int textfieldSize,
final JFrame d) {
GridBagConstraints gbc;
JPanel pie = new JPanel(new GridBagLayout());
pie.setBorder(new EmptyBorder(5, 15, 15, 15));
pie.setOpaque(false);
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(15, 15, 15, 15);
gbc.gridwidth = 1;
JLabel labl_pie = new JLabel(label_pie, JLabel.LEFT);
pie.add(labl_pie, gbc);
textfieldPie.setColumns(textfieldSize);
textfieldPie.getDocument().addDocumentListener(changeListener);
labl_pie.setLabelFor(textfieldPie);
gbc.gridx++;
gbc.gridwidth = 1;
pie.add(textfieldPie, gbc);
gbc.gridy++;
gbc.gridx = 1;
gbc.insets = new Insets(15, -90, 15, 15);
JPanel botones = getBotonesSalir(guardar, d, 200);
pie.add(botones, gbc);
return pie;
}
private JButton getGuardarBtn(SaveOrUpdateAction guardar) {
JButton guardarBtn = new JButton(guardar);
if (isNew) {
guardarBtn.setText("Crear");
guardarBtn.setIcon(getIcon("button_crear"));
} else {
guardarBtn.setText("Guardar");
guardarBtn.setIcon(getIcon("button_save"));
}
return guardarBtn;
}
private JPanel buildBotones(final Dimension dimension2, final JList left,
final JList right) {
JPanel botones = new JPanel(new GridBagLayout());
botones.setPreferredSize(dimension2);
JButton derecha = new JButton(LogicConstants.getIcon("button_right"));
derecha.setBorderPainted(false);
derecha.setOpaque(false);
derecha.setContentAreaFilled(false);
derecha.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cambios = true;
for (Object o : left.getSelectedValues()) {
((DefaultListModel) right.getModel()).addElement(o);
rightItems.add(o);
}
for (Object o : left.getSelectedValues()) {
((DefaultListModel) left.getModel()).removeElement(o);
leftItems.remove(o);
}
}
});
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy = 0;
botones.add(derecha, gbc);
izquierda.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cambios = true;
for (Object o : right.getSelectedValues()) {
((DefaultListModel) left.getModel()).addElement(o);
leftItems.add(o);
}
for (Object o : right.getSelectedValues()) {
((DefaultListModel) right.getModel()).removeElement(o);
rightItems.remove(o);
}
}
});
gbc.gridy++;
izquierda.setBorderPainted(false);
izquierda.setOpaque(false);
izquierda.setContentAreaFilled(false);
botones.add(izquierda, gbc);
botones.setOpaque(false);
return botones;
}
private JPanel buildCabecera(final String label_cabecera,
final int textfieldSize, final Icon icono, final String titulo,
final String icono_seleccionado) {
JLabel title = new JLabel(titulo, icono, SwingConstants.LEFT);
title.setFont(LogicConstants.deriveBoldFont(12f));
JPanel resultado = new JPanel(new BorderLayout(2, 2));
resultado.setOpaque(false);
resultado.add(title, BorderLayout.NORTH);
JPanel cabecera = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
cabecera.setOpaque(false);
JLabel nombre = new JLabel(label_cabecera, JLabel.RIGHT);
gbc.gridx = 0;
gbc.gridy = 0;
cabecera.add(nombre, gbc);
textfieldCabecera.setColumns(textfieldSize);
textfieldCabecera.getDocument().addDocumentListener(changeListener);
nombre.setLabelFor(textfieldCabecera);
gbc.gridx++;
cabecera.add(textfieldCabecera, gbc);
if (icono_seleccionado != null) {
JLabel nombre2 = new JLabel("Icono:", JLabel.RIGHT);
gbc.gridx = 0;
gbc.gridy++;
cabecera.add(nombre2, gbc);
((DefaultComboBoxModel) iconos.getModel()).removeAllElements();
for (String icon : FlotaConsultas.getAllIcons("/images/"
+ LogicConstants.DIRECTORIO_ICONOS_FLOTAS)) {
((DefaultComboBoxModel) iconos.getModel()).addElement(icon);
}
for (ActionListener l : iconos.getActionListeners()) {
iconos.removeActionListener(l);
}
iconos.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cambios = true;
if (iconos.getSelectedItem() != null) {
i
.setIcon(LogicConstants
.getIcon(LogicConstants.DIRECTORIO_ICONOS_FLOTAS
+ iconos.getSelectedItem()
.toString()
+ "_flota_preview"));
}
i.updateUI();
}
});
iconos.setSelectedItem(icono_seleccionado);
if (iconos.getSelectedIndex() == -1 || i.getIcon() == null) {
if (iconos.getModel().getSize() > 0)
iconos.setSelectedIndex(0);
}
cambios = false;
nombre2.setLabelFor(iconos);
gbc.gridx++;
gbc.anchor = GridBagConstraints.WEST;
cabecera.add(iconos, gbc);
gbc.gridheight = 2;
gbc.gridx = 2;
gbc.gridy = 0;
gbc.insets = new Insets(2, 10, 2, 10);
gbc.ipadx = 5;
gbc.ipady = 5;
i.setBorder(BorderFactory.createLineBorder(Color.black));
cabecera.add(i, gbc);
}
resultado.add(cabecera, BorderLayout.CENTER);
resultado.setBorder(new EmptyBorder(15, 15, 15, 15));
return resultado;
}
private JPanel buildCenter(final String centered_label) {
GridBagConstraints gbc = new GridBagConstraints();
JPanel central = new JPanel(new GridBagLayout());
central.setBorder(new EmptyBorder(15, 15, 15, 15));
central.setOpaque(false);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(5, 15, 5, 15);
gbc.gridwidth = 2;
return central;
}
}