/*
* 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;
import static es.emergya.cliente.constants.LogicConstants.getIcon;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.DefaultCellEditor;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
import javax.swing.SwingWorker;
import javax.swing.border.EmptyBorder;
import javax.swing.border.MatteBorder;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdesktop.swingx.renderer.DefaultTableRenderer;
import es.emergya.actions.Authentication;
import es.emergya.cliente.constants.LogicConstants;
import es.emergya.ui.SpringUtilities;
import es.emergya.ui.base.plugins.Option;
import es.emergya.ui.base.plugins.PluginEventHandler;
import es.emergya.ui.plugins.admin.aux1.SummaryAction;
/**
* Panel que incluye una tabla con columnas y campos para gestionar,
* herramientas de filtrado, de creacion, etc.
*
* Sigue las indicaciones en los bocetos suministrados por el cliente
*
* @author fario
* @author marias
*
*/
public class AdminPanel extends JPanel implements ActionListener {
private static final long serialVersionUID = 4520895666460134341L;
private JPanel tablePanel;
private JTable table;
private Boolean initialized = false;
private JLabel title;
private final JLabel cuenta = new JLabel();
static final Log log = LogFactory.getLog(AdminPanel.class);
private JButton newButton;
private JButton deselectAll;
private JTable filters;
private Integer size = 0;
private Option father = null;
protected int columnToReselect = 1;
protected Map<Integer, Integer> colsWidth = new HashMap<Integer, Integer>();
protected String errorString = "Admin.delete.fail";
protected String errorCause = "";
protected List<Integer> invisibleFilterCols = new LinkedList<Integer>();
private List<Object> seleccion = new ArrayList<Object>(0);
protected Boolean canDelete = true;
protected Boolean canCreateNew = true;
protected MyRendererColoring myRendererColoring = null;
public void setMyRendererColoring(MyRendererColoring rendererColoring) {
this.myRendererColoring = rendererColoring;
}
public Boolean getCanCreateNew() {
return canCreateNew;
}
protected void setCanCreateNew(Boolean canCreateNew) {
this.canCreateNew = canCreateNew;
}
public Boolean getCanDelete() {
return canDelete;
}
protected void setCanDelete(Boolean canDelete) {
this.canDelete = canDelete;
}
public void setErrorCause(String cause) {
this.errorCause = cause;
}
public void addInvisibleFilterCol(Integer i) {
invisibleFilterCols.add(i);
}
public void removeAllInvisibleFilterCol() {
invisibleFilterCols.clear();
}
public AdminPanel(String t, Icon icon, Option myself, boolean canCreateNew,
boolean canDelete) {
super();
setCanCreateNew(canCreateNew);
setCanDelete(canDelete);
setLayout(new SpringLayout());
this.father = myself;
setBackground(Color.WHITE);
// Titulo con icono
JPanel titlePanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
title = new JLabel(t);
title.setIcon(icon);
title.setFont(LogicConstants.deriveBoldFont(12f));
title.setBorder(new EmptyBorder(0, 10, 0, 10));
titlePanel.add(title);
titlePanel.setOpaque(false);
add(titlePanel);
Dimension d = titlePanel.getSize();
if (icon != null)
d.height = icon.getIconHeight();
titlePanel.setMaximumSize(d);
// Controles de "nuevo" "seleccionar todos" etc...
JPanel controls = new JPanel(new FlowLayout(FlowLayout.LEADING));
controls.setOpaque(false);
final boolean femenino = t.indexOf("atrulla") != -1
|| t.indexOf("apa") != -1 || t.indexOf("lota") != -1
|| t.indexOf("encia") != -1;
if (getCanCreateNew()) {
if (femenino) {
newButton = new JButton("Nueva", getIcon("button_nuevo"));
} else {
newButton = new JButton("Nuevo", getIcon("button_nuevo"));
}
controls.add(newButton);
}
if (getCanDelete()) {
JButton selectAll = new JButton(((femenino) ? "Seleccionar Todas"
: "Seleccionar Todos"), getIcon("button_selectall"));
selectAll.addActionListener(this);
controls.add(selectAll);
deselectAll = new JButton(((femenino) ? "Deseleccionar Todas"
: "Deseleccionar Todos"), getIcon("button_unselectall"));
deselectAll.addActionListener(this);
controls.add(deselectAll);
JButton deleteAll = new JButton(
((femenino) ? "Eliminar Seleccionadas"
: "Eliminar Seleccionados"),
getIcon("button_delall"));
deleteAll.addActionListener(this);
controls.add(deleteAll);
}
d = controls.getSize();
controls.setMaximumSize(d);
add(controls);
// Tabla
tablePanel = new JPanel(new BorderLayout());
tablePanel.setOpaque(false);
add(tablePanel);
SpringUtilities.makeCompactGrid(this, 3, 1, 0, 0, 0, 0);
}
public AdminPanel(String t, Icon icon, Option myself) {
this(t, icon, myself, true, true);
}
/**
* A la columna colIndex le pone un width colWidth. La primera columna es el
* 1 (el cero es el checkbox)
*
* @param colIndex
* @param width
*/
public void addColumnWidth(Integer colIndex, Integer colWidth) {
colsWidth.put(colIndex, colWidth);
}
/**
* @see #addColumnWidth(Integer, Integer)
*/
public void resetColumnWidth() {
colsWidth.clear();
}
public void setNewAction(SummaryAction summaryAction) {
newButton.addActionListener(summaryAction);
}
/**
* @param text
* @param icon
*/
public void setTitle(String text, Icon icon) {
title.setText(text);
title.setIcon(icon);
}
public void setNewAction(Action action) {
newButton.setAction(action);
}
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.indexOf("Seleccionar Tod") == 0) {
for (int i = 0; i < table.getRowCount(); i++) {
table.getModel().setValueAt(Boolean.TRUE, i, 0);
}
} else if (cmd.indexOf("Deseleccionar Tod") == 0) {
for (int i = 0; i < table.getRowCount(); i++) {
table.getModel().setValueAt(Boolean.FALSE, i, 0);
}
} else if (cmd.indexOf("Eliminar Seleccionad") == 0) {
boolean alguno = false;
for (int i = table.getRowCount() - 1; i >= 0 && !alguno; i--) {
if ((Boolean) table.getModel().getValueAt(i, 0)) {
alguno = true;
}
}
if (!alguno) {
return;
}
if (JOptionPane.showConfirmDialog(this,
"Buttons.delete.confirm",
"Selecciona una opción", JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) {
return;
}
Vector<Object> fail = new Vector<Object>();
int total = 0;
for (int i = table.getRowCount() - 1; i >= 0; i--) {
if ((Boolean) table.getModel().getValueAt(i, 0)) {
DeleteAction a = (DeleteAction) ((JButton) table
.getValueAt(i, table.getColumnCount() - 1))
.getAction();
total++;
if (!a.delete(false)) {
fail.add(table.getValueAt(i, 1));
}
}
}
if (this.father != null) {
this.father.refresh(null);
PluginEventHandler.fireChange(this.father);
}
if (total == 0) {
JOptionPane.showMessageDialog(this,
"No hay elementos seleccionados para eliminar.", null,
JOptionPane.ERROR_MESSAGE);
}
if (fail.size() > 0) {
JOptionPane.showMessageDialog(this,
errorString + ":\n" + fail.toString() + "\n"
+ errorCause, null, JOptionPane.ERROR_MESSAGE);
}
} else
log.error("Comando no encontrado: " + cmd);
}
/**
*
* @param columnNames
* nombres de las columnas de la tabla
* @param filterOptions
* lista de opciones de un combobox. Si esta vacio entonces es un
* textfield
* @param noFiltrarAction
* @param filtrarAction
*/
public void generateTable(String[] columnNames, Object[][] filterOptions,
AdminPanel.NoFiltrarAction noFiltrarAction,
AdminPanel.FiltrarAction filtrarAction) {
if (columnNames == null) {
columnNames = new String[] {};
}
if (filterOptions == null) {
filterOptions = new Object[][] {};
}
String filterString = "[";
for (Object[] o : filterOptions) {
filterString += Arrays.toString(o) + " ";
}
filterString += "]";
log.debug("generateTable( columnNames = "
+ Arrays.toString(columnNames) + ", filterOptions = "
+ filterString + ")");
tablePanel.removeAll();
int columnNamesLength = columnNames.length;
if (!getCanDelete())
columnNamesLength++;
MyTableModel dataModel = new MyTableModel(1, columnNamesLength + 2) {
private static final long serialVersionUID = 1348355328684460769L;
@Override
public boolean isCellEditable(int row, int column) {
return column != 0 && !invisibleFilterCols.contains(column);
}
};
filters = new JTable(dataModel) {
private static final long serialVersionUID = -8266991359840905405L;
@Override
public Component prepareRenderer(TableCellRenderer renderer,
int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
if (isCellEditable(row, column)
&& column != getColumnCount() - 1) {
if (c instanceof JTextField) {
((JTextField) c).setBorder(new MatteBorder(1, 1, 1, 1,
Color.BLACK));
} else if (c instanceof JComboBox) {
((JComboBox) c).setBorder(new MatteBorder(1, 1, 1, 1,
Color.BLACK));
} else if (c instanceof JLabel) {
((JLabel) c).setBorder(new MatteBorder(1, 1, 1, 1,
Color.BLACK));
}
}
return c;
}
};
filters.setSurrendersFocusOnKeystroke(true);
filters.setShowGrid(false);
filters.setRowHeight(22);
filters.setOpaque(false);
for (Integer i = 0; i < filterOptions.length; i++) {
final Object[] items = filterOptions[i];
if (items != null && items.length > 1) {
setComboBoxEditor(i, items);
} else {
final DefaultCellEditor defaultCellEditor = new DefaultCellEditor(
new JTextField());
defaultCellEditor.setClickCountToStart(1);
filters.getColumnModel().getColumn(i + 1)
.setCellEditor(defaultCellEditor);
}
}
filters.setRowSelectionAllowed(false);
filters.setDragEnabled(false);
filters.setColumnSelectionAllowed(false);
filters.setDefaultEditor(JButton.class, new JButtonCellEditor());
filters.setDefaultRenderer(Object.class, new DefaultTableRenderer() {
private static final long serialVersionUID = -4811729559786534118L;
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
Component c = super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
if (invisibleFilterCols.contains(column))
c = new JLabel("");
return c;
}
});
filters.setDefaultRenderer(JButton.class, new TableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
JButton b = (JButton) value;
b.setBorderPainted(false);
b.setContentAreaFilled(false);
return b;
}
});
filters.setDefaultRenderer(JLabel.class, new TableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
return (JLabel) value;
}
});
filters.setDefaultEditor(JButton.class, new JButtonCellEditor());
filters.getModel().setValueAt(new JLabel(""), 0, 0);
JButton jButton2 = new JButton(noFiltrarAction);
JButton jButton = new JButton(filtrarAction);
jButton.setBorderPainted(false);
jButton2.setBorderPainted(false);
jButton.setContentAreaFilled(false);
jButton2.setContentAreaFilled(false);
if (jButton.getIcon() != null)
jButton.setPreferredSize(new Dimension(jButton.getIcon()
.getIconWidth(), jButton.getIcon().getIconHeight()));
if (jButton2.getIcon() != null)
jButton2.setPreferredSize(new Dimension(jButton2.getIcon()
.getIconWidth(), jButton2.getIcon().getIconHeight()));
filters.getModel().setValueAt(jButton, 0, columnNamesLength - 1);
filters.getColumnModel().getColumn(columnNamesLength - 1)
.setMinWidth(jButton.getWidth() + 24);
filters.getModel().setValueAt(jButton2, 0, columnNamesLength);
filters.getColumnModel().getColumn(columnNamesLength)
.setMinWidth(jButton2.getWidth() + 14);
cuenta.setHorizontalAlignment(JLabel.CENTER);
cuenta.setText("?/?");
filters.getModel().setValueAt(cuenta, 0, columnNamesLength + 1);
tablePanel.add(filters, BorderLayout.NORTH);
Vector<String> headers = new Vector<String>();
headers.add("");
headers.addAll(Arrays.asList(columnNames));
MyTableModel model = new MyTableModel(headers, 0);
table = new JTable(model) {
private static final long serialVersionUID = 949284378605881770L;
private int highLightedRow = -1;
private Rectangle dirtyRegion = null;
public Component prepareRenderer(TableCellRenderer renderer,
int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
try {
if (AdminPanel.this.myRendererColoring != null)
c.setBackground(AdminPanel.this.myRendererColoring
.getColor(AdminPanel.this.table.getValueAt(row,
1)));
} catch (Throwable t) {
log.error("Error al colorear la celda: " + t);
}
return c;
}
@Override
protected void processMouseMotionEvent(MouseEvent e) {
try {
int row = rowAtPoint(e.getPoint());
Graphics g = getGraphics();
if (row == -1) {
highLightedRow = -1;
}
// row changed
if (highLightedRow != row) {
if (null != dirtyRegion) {
paintImmediately(dirtyRegion);
}
for (int j = 0; j < getRowCount(); j++) {
if (row == j) {
// highlight
Rectangle firstRowRect = getCellRect(row, 0,
false);
Rectangle lastRowRect = getCellRect(row,
getColumnCount() - 1, false);
dirtyRegion = firstRowRect.union(lastRowRect);
g.setColor(new Color(0xff, 0xff, 0, 100));
g.fillRect((int) dirtyRegion.getX(),
(int) dirtyRegion.getY(),
(int) dirtyRegion.getWidth(),
(int) dirtyRegion.getHeight());
highLightedRow = row;
}
}
}
} catch (Exception ex) {
}
super.processMouseMotionEvent(e);
}
};
table.setRowHeight(22);
table.setOpaque(false);
// table.setAutoCreateRowSorter(true);
table.setDragEnabled(false);
table.getTableHeader().setReorderingAllowed(false);
table.getTableHeader().setResizingAllowed(false);
table.setDefaultEditor(JButton.class, new JButtonCellEditor());
table.setDefaultRenderer(JButton.class, new TableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
JButton b = (JButton) value;
if (b != null) {
b.setBorderPainted(false);
b.setContentAreaFilled(false);
}
return b;
}
});
JScrollPane jScrollPane = new JScrollPane(table);
jScrollPane.setOpaque(false);
jScrollPane
.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
jScrollPane.getViewport().setOpaque(false);
tablePanel.add(jScrollPane, BorderLayout.CENTER);
}
private JComboBox setComboBoxEditor(Integer i, final Object[] items) {
JComboBox cb = new JComboBox(items);
final DefaultCellEditor defaultCellEditor = new DefaultCellEditor(cb);
defaultCellEditor.setClickCountToStart(1);
filters.getColumnModel().getColumn(i + 1)
.setCellEditor(defaultCellEditor);
return cb;
}
public Integer getNumObjects() {
return ((MyTableModel) table.getModel()).getRowCount();
}
/**
* Cambia los datos que muestra la tabla al array que se le pase.
*
* Se aconseja que sean: * {@link Boolean} para valores si/no *
* {@link AbstractAction} o subclases para botones * Numeros *
* {@link String} para todo lo demas
*
* @param data
*/
public void setTableData(final Object[][] data) {
final Object[][] newData = new Object[data.length][];
SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
private MyTableModel model;
@Override
protected Object doInBackground() throws Exception {
if (data == null) {
return null;
}
model = (MyTableModel) table.getModel();
synchronized (seleccion) {
for (int i = 0; i < model.getRowCount(); i++) {
if ((Boolean) model.getValueAt(i, 0)) {
seleccion
.add(model.getValueAt(i, columnToReselect));
}
}
}
synchronized (seleccion) {
for (int i = 0; i < data.length; i++) {
newData[i] = new Object[data[0].length + 1];
newData[i][0] = new Boolean(
Authentication.isAuthenticated()
&& seleccion
.contains(data[i][columnToReselect - 1]));
for (int j = 0; j < data[i].length; j++) {
newData[i][j + 1] = data[i][j];
}
}
}
return null;
}
protected void done() {
model.updateRows(newData);
if (!initialized) {
table.putClientProperty("terminateEditOnFocusLost",
Boolean.TRUE);
for (Integer i : colsWidth.keySet()) {
try {
final TableColumn column = table.getColumnModel()
.getColumn(i);
final TableColumn filtro = filters.getColumnModel()
.getColumn(i);
column.setPreferredWidth(colsWidth.get(i));
column.setMinWidth(colsWidth.get(i));
column.setMaxWidth(colsWidth.get(i));
filtro.setPreferredWidth(colsWidth.get(i));
filtro.setMinWidth(colsWidth.get(i));
filtro.setMaxWidth(colsWidth.get(i));
} catch (Throwable t) {
log.error("Error al resizar las columnas: " + t);
}
}
TableColumn col = table.getColumnModel().getColumn(0);
TableColumn fil = filters.getColumnModel().getColumn(0);
log.trace("Resizando CheckBox");
col.setMaxWidth(49);
fil.setMaxWidth(49);
int defaultWidth = 54;
for (int i = 1; i < table.getColumnModel().getColumnCount() - 2; i++) {
col = table.getColumnModel().getColumn(i);
fil = filters.getColumnModel().getColumn(i);
final Class<?> columnClass = ((MyTableModel) table
.getModel()).getColumnClass(i);
if (columnClass == JButton.class) {
log.trace("Resizando JButton");
col.setMaxWidth(defaultWidth);
fil.setMaxWidth(defaultWidth);
} else if (columnClass == Boolean.class) {
log.trace("Resizando CheckBox");
col.setMaxWidth(49);
fil.setMaxWidth(49);
}
}
if (getCanDelete()) {
col = table.getColumnModel().getColumn(
table.getColumnModel().getColumnCount() - 2);
col.setMaxWidth(defaultWidth);
col.setPreferredWidth(defaultWidth);
col = table.getColumnModel().getColumn(
table.getColumnModel().getColumnCount() - 1);
col.setMaxWidth(defaultWidth);
col.setPreferredWidth(defaultWidth);
} else {
col = table.getColumnModel().getColumn(
table.getColumnModel().getColumnCount() - 1);
col.setMaxWidth(defaultWidth * 2);
col.setPreferredWidth(defaultWidth * 2);
}
int max = filters.getColumnModel().getColumnCount() - 1;
filters.getColumnModel().getColumn(max).setMaxWidth(61);
filters.getColumnModel().getColumn(max - 1).setMaxWidth(32);
filters.getColumnModel().getColumn(max - 2).setMaxWidth(32);
initialized = true;
}
}
};
sw.execute();
}
/**
* Implementar con la accion de borrar un elemento.
*
* @author fario
*
*/
public abstract class DeleteAction<T> extends AbstractAction {
private static final long serialVersionUID = -4311069821314184357L;
protected T target;
/**
*
* @param o
* objeto a borrar
*/
public DeleteAction(T o) {
super(null, getIcon("Buttons.delete"));
this.target = o;
log.trace("Creado delete action para " + this.target);
}
@Override
public void actionPerformed(ActionEvent e) {
if (JOptionPane.showConfirmDialog(AdminPanel.this,
"Buttons.delete.confirm",
"Selecciona una opción", JOptionPane.YES_NO_OPTION) == JOptionPane.OK_OPTION) {
delete(true);
AdminPanel.this.father.refresh(null);
PluginEventHandler.fireChange(AdminPanel.this.father);
}
}
protected abstract boolean delete(boolean show_alert);
}
/**
* Implementar con la accion de guardar o modificar un elemento
*
* @author marias
*
*/
public abstract class SaveOrUpdateAction<T> extends AbstractAction {
private static final long serialVersionUID = -4311069821314184357L;
protected T original = null;
protected JFrame frame = null;
/**
*
* @param o
* objeto a guardar o modificar
*/
public SaveOrUpdateAction(T o) {
super();
this.original = o;
log.trace("Creado save action para " + this.original);
}
public void setFrame(JFrame f) {
this.frame = f;
}
public void closeFrame() {
if (this.frame != null) {
this.frame.dispose();
}
PluginEventHandler.fireChange(AdminPanel.this.father);
}
@Override
public abstract void actionPerformed(ActionEvent e);
}
/**
* Implementar con la accion de filtrar
*
* @author marias
*
*/
public abstract class FiltrarAction extends AbstractAction {
private static final long serialVersionUID = -4311069821314184357L;
public FiltrarAction() {
super(null, getIcon("Buttons.filtrar"));
}
@Override
public void actionPerformed(ActionEvent e) {
SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
applyFilter(AdminPanel.this.filters);
return null;
}
};
sw.execute();
}
protected abstract void applyFilter(JTable filters);
}
public class MyRendererColoring {
public Color getColor(Object object) {
return null;
}
}
/**
* Dejar de filtrar
*
* @author marias
*
*/
public abstract class NoFiltrarAction extends AbstractAction {
private static final long serialVersionUID = -4311069821314184357L;
public NoFiltrarAction() {
super(null, getIcon("Buttons.noFiltrar"));
}
@Override
public void actionPerformed(ActionEvent e) {
SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
applyFilter();
return null;
}
@Override
protected void done() {
for (int i = 1; i < ((MyTableModel) AdminPanel.this.filters
.getModel()).getColumnCount() - 3; i++) {
if (filters.getModel().getValueAt(0, i) instanceof String) {
filters.getModel().setValueAt(null, 0, i);
} else if (filters.getModel().getValueAt(0, i) instanceof JComboBox) {
((JComboBox) filters.getModel().getValueAt(0, i))
.setSelectedIndex(0);
}
}
super.done();
}
};
sw.execute();
}
protected abstract void applyFilter();
}
public void setCuenta(final int showed, final int total) {
SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
setSize(total);
return null;
}
@Override
protected void done() {
cuenta.setText("(" + showed + "/" + total + ")");
filters.updateUI();
}
};
sw.execute();
}
public void changeRow(final int fila, final int destino) {
SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
@Override
protected void done() {
((MyTableModel) table.getModel()).changeRow(fila, destino);
}
@Override
protected Object doInBackground() throws Exception {
return null;
}
};
sw.execute();
}
/**
* Columna que usar en el equals que define la fila seleccionada. Útil para
* refrescos y filtros de la tabla.
*
* @param columnToReselect
*/
public void setColumnToReselect(int columnToReselect) {
this.columnToReselect = columnToReselect;
}
public void setSize(Integer size) {
this.size = size;
}
public Integer getTotalSize() {
return size;
}
public void setFilter(final Integer i, final String[] items) {
SwingWorker<JComboBox, Object> sw = new SwingWorker<JComboBox, Object>() {
@Override
protected JComboBox doInBackground() throws Exception {
JComboBox cb = setComboBoxEditor(i - 1, items);
return cb;
}
@Override
protected void done() {
if (filters.getCellEditor() != null)
filters.getCellEditor().cancelCellEditing();
filters.repaint();
}
};
sw.execute();
}
public void unckeckAll() {
if (this.deselectAll != null)
synchronized (seleccion) {
this.deselectAll.doClick();
AdminPanel.this.seleccion.clear();
}
}
}
class MyTableModel extends AbstractTableModel {
private static final long serialVersionUID = 2123942827487198300L;
private String columnNames[] = new String[0];
private Object rowData[][] = new Object[0][0];
private Object sync = new Object();
public MyTableModel(String[] colNames, int i) {
columnNames = colNames;
rowData = new Object[i][0];
}
public void changeRow(int fila, int destino) {
Object[] row = removeRowSilent(fila);
addRow(row, destino);
}
public MyTableModel(int i, int j) {
rowData = new Object[i][j];
columnNames = new String[j];
for (int k = 0; k < j; k++) {
columnNames[k] = "";
}
}
public MyTableModel(Vector<String> headers, int i) {
this(headers.toArray(new String[0]), i);
}
public void addRowSilent(Vector<Object> fila, int indice) {
synchronized (sync) {
Object newRowData[][] = new Object[rowData.length + 1][];
int k = 0;
for (int i = 0; i < newRowData.length; i++) {
if (indice == i) {
newRowData[i] = fila.toArray();
} else {
newRowData[i] = rowData[k++];
}
}
rowData = newRowData;
}
}
public void addRow(Vector<Object> fila) {
addRowSilent(fila, rowData.length);
fireTableDataChanged();
}
public void addRow(Object[] fila, int indice) {
Vector<Object> vector = new Vector<Object>();
for (Object f : fila) {
vector.add(f);
}
addRowSilent(vector, indice);
fireTableDataChanged();
}
public void addRow(Object[] fila) {
addRow(fila, rowData.length);
}
public Object[] removeRowSilent(int fila) {
Object[] res = null;
synchronized (sync) {
try {
if (rowData.length == 0) {
return new Object[0][];
}
Object newRowData[][] = new Object[rowData.length - 1][];
int i = 0;
int contador = 0;
for (Object[] row : rowData) {
if (contador != fila) {
newRowData[i++] = row;
} else {
res = row;
}
contador++;
}
rowData = newRowData;
} catch (ArrayIndexOutOfBoundsException e) {
}
}
return res;
}
public Object[] removeRow(int fila) {
Object[] res = removeRowSilent(fila);
fireTableDataChanged();
return res;
}
@Override
public String getColumnName(int col) {
return columnNames[col].toString();
}
@Override
public int getRowCount() {
return rowData.length;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public Object getValueAt(int row, int col) {
Object object = null;
synchronized (sync) {
try {
object = rowData[row][col];
AdminPanel.log.trace("getValueAt(" + row + ", " + col + ") = "
+ object);
} catch (Throwable t) {
}
}
return object;
}
@Override
public void setValueAt(Object value, int row, int col) {
synchronized (sync) {
rowData[row][col] = value;
}
fireTableCellUpdated(row, col);
}
public void updateRowsSilent(Object[][] data) {
synchronized (sync) {
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
if (data[i][j] instanceof AbstractAction) {
data[i][j] = new JButton((AbstractAction) data[i][j]);
}
}
}
rowData = data;
}
columnNames = new String[data.length];
for (int k = 0; k < data.length; k++) {
columnNames[k] = "";
}
}
public void updateRows(Object[][] data) {
updateRowsSilent(data);
fireTableDataChanged();
}
@Override
public Class<?> getColumnClass(int columnIndex) {
final Object valueAt = getValueAt(0, columnIndex);
if (valueAt == null) {
return Object.class;
}
if (valueAt instanceof AbstractAction) {
return AbstractAction.class;
}
return valueAt.getClass();
}
@Override
public boolean isCellEditable(int row, int column) {
return column == 0 || getValueAt(row, column) instanceof JButton;
}
}