package es.icarto.gvsig.navtableforms.gui.tables.menu; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; import javax.swing.AbstractAction; import javax.swing.JOptionPane; import javax.swing.JTable; import javax.swing.table.TableModel; import es.icarto.gvsig.navtableforms.gui.tables.IForm; import es.icarto.gvsig.navtableforms.gui.tables.JTableUtils; import es.icarto.gvsig.navtableforms.gui.tables.model.AlphanumericTableModel; import es.icarto.gvsig.navtableforms.gui.tables.model.BaseTableModel; /** * AlphanumericCompleteJTableContextualMenu * * Relationship table contextual menus which opens subforms and has options for * updating, creating and deleting registers. * * @author Jorge L�pez Fern�ndez <jlopez@cartolab.es> */ public class AlphanumericCompleteJTableContextualMenu extends AlphanumericJTableContextualMenu { private CreateAction createAction; private UpdateAction updateAction; private DeleteAction deleteAction; public AlphanumericCompleteJTableContextualMenu(IForm form) { super(form); } @Override public void mouseClicked(MouseEvent e) { table = (JTable) e.getComponent(); int selectedRow = getSelectedRowIdx(); if ((e.getClickCount() == 2) && (selectedRow > -1)) { TableModel model = table.getModel(); if (model instanceof AlphanumericTableModel) { form.actionUpdateRecord(((AlphanumericTableModel) model) .convertRowIndexToModel(selectedRow)); } else { form.actionUpdateRecord(table .convertRowIndexToModel(selectedRow)); } } else if (e.getButton() == BUTTON_RIGHT) { if (!JTableUtils.hasRows(table) || (selectedRow == NO_ROW_SELECTED)) { updateMenuItem.setEnabled(false); deleteMenuItem.setEnabled(false); } else { updateMenuItem.setEnabled(true); deleteMenuItem.setEnabled(true); } popupMenu.show(e.getComponent(), e.getX(), e.getY()); } } private int getSelectedRowIdx() { int selectedRow = table.getSelectedRow(); if ((table.getRowSorter() != null) && (selectedRow > -1)) { return table.getRowSorter().convertRowIndexToModel(selectedRow); } return selectedRow; } @Override protected void initContextualMenu() { createAction = new CreateAction(); updateAction = new UpdateAction(); deleteAction = new DeleteAction(); newMenuItem.setAction(createAction); popupMenu.add(newMenuItem); updateMenuItem.setAction(updateAction); popupMenu.add(updateMenuItem); deleteMenuItem.setAction(deleteAction); popupMenu.add(deleteMenuItem); } // TODO: fpuga. {Create, Update, Delete}Action and the methods related with // it, are used to handle the case that we want an interface with add, // update, delete buttons instead or plus the listener in the table. This // implementation should be improved before used, take it only as a // prototype public AbstractAction getCreateAction() { return createAction; } public AbstractAction getUpdateAction() { return updateAction; } public AbstractAction getDeleteAction() { return deleteAction; } private class CreateAction extends AbstractAction { public CreateAction() { super("A�adir"); } @Override public void actionPerformed(ActionEvent e) { form.actionCreateRecord(); } } private class UpdateAction extends AbstractAction { public UpdateAction() { super("Editar"); } @Override public void actionPerformed(ActionEvent e) { if ((table == null) || (table.getSelectedRowCount() != 1)) { JOptionPane.showMessageDialog(null, "Debe seleccionar una fila para editar los datos.", "Ninguna fila seleccionada", JOptionPane.INFORMATION_MESSAGE); return; } TableModel model = table.getModel(); final int selectedRow = getSelectedRowIdx(); if (model instanceof BaseTableModel) { form.actionUpdateRecord(((BaseTableModel) model) .convertRowIndexToModel(selectedRow)); } else { form.actionUpdateRecord(table .convertRowIndexToModel(selectedRow)); } } } private class DeleteAction extends AbstractAction { public DeleteAction() { super("Eliminar"); } @Override public void actionPerformed(ActionEvent e) { if ((table == null) || (table.getSelectedRowCount() != 1)) { JOptionPane.showMessageDialog(null, "Debe seleccionar una fila para eliminar los datos.", "Ninguna fila seleccionada", JOptionPane.INFORMATION_MESSAGE); return; } else { Object[] options = { "Eliminar", "Cancelar" }; int response = JOptionPane .showOptionDialog( null, "Los datos seleccionados se eliminar�n de forma permanente.", "Eliminar", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]); if (response == JOptionPane.YES_OPTION) { TableModel model = table.getModel(); final int selectedRow = getSelectedRowIdx(); if (model instanceof AlphanumericTableModel) { form.actionDeleteRecord(((AlphanumericTableModel) model) .convertRowIndexToModel(selectedRow)); } else { form.actionDeleteRecord(table .convertRowIndexToModel(selectedRow)); } } } } } }