/* * Copyright (C) 2012 Timo Vesalainen * * 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 3 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, see <http://www.gnu.org/licenses/>. */ package org.vesalainen.parsers.sql.dsql.ui.action; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.KeyStroke; import javax.swing.event.SwingPropertyChangeSupport; import javax.swing.table.TableCellEditor; import org.vesalainen.parsers.sql.FetchResult; import org.vesalainen.parsers.sql.UpdateableFetchResult; import org.vesalainen.parsers.sql.dsql.ui.DSJTable; import org.vesalainen.parsers.sql.dsql.ui.FetchResultTableModel; import org.vesalainen.parsers.sql.dsql.ui.I18n; /** * @author Timo Vesalainen */ public class FetchResultHandler implements PropertyChangeListener { public static final String TablePropertyName = "fetchResultTable"; public static final String ModelPropertyName = "fetchResultModel"; protected SwingPropertyChangeSupport changeSupport; private JFrame frame; private JScrollPane scrollPane; private FetchResultTableModel tableModel; private DSJTable table; private DeleteRowAction deleteRowAction; private CommitAction commitAction; private RollbackAction rollbackAction; private FetchResult fetchResult; public FetchResultHandler(JFrame frame, JScrollPane scrollPane) { this.frame = frame; this.scrollPane = scrollPane; deleteRowAction = new DeleteRowAction(); commitAction = new CommitAction(); rollbackAction = new RollbackAction(); changeSupport = new SwingPropertyChangeSupport(this); } public DeleteRowAction getDeleteRowAction() { return deleteRowAction; } public CommitAction getCommitAction() { return commitAction; } public RollbackAction getRollbackAction() { return rollbackAction; } private void setButtonsEnabled(boolean enable) { deleteRowAction.setEnabled(enable); commitAction.setEnabled(enable); rollbackAction.setEnabled(enable); } @Override public void propertyChange(PropertyChangeEvent evt) { if (ExecuteAction.PropertyName.equals(evt.getPropertyName())) { FetchResult result = (FetchResult) evt.getNewValue(); if (result != null) { if (result instanceof UpdateableFetchResult) { setButtonsEnabled(true); } fetchResult = (FetchResult) result; if (tableModel == null) { tableModel = new FetchResultTableModel(fetchResult); table = new DSJTable(tableModel); table.setOwner(frame); scrollPane.setViewportView(table); firePropertyChange(TablePropertyName, null, table); } else { tableModel.updateData(fetchResult); } firePropertyChange(ModelPropertyName, null, tableModel); } else { if (tableModel != null) { tableModel.clear(); } if ( fetchResult != null && (fetchResult instanceof UpdateableFetchResult) ) { UpdateableFetchResult ufr = (UpdateableFetchResult) fetchResult; ufr.rollback(); } firePropertyChange(ModelPropertyName, null, null); setButtonsEnabled(false); } } } public void addPropertyChangeListener(PropertyChangeListener listener) { changeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { changeSupport.removePropertyChangeListener(listener); } public void firePropertyChange(String propertyName, Object oldValue, Object newValue) { changeSupport.firePropertyChange(propertyName, oldValue, newValue); } public class DeleteRowAction extends AbstractAction { public DeleteRowAction() { super(I18n.get("DELETE ROW")); putValue(Action.SHORT_DESCRIPTION, I18n.get("DELETE ROW TOOLTIP")); putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, InputEvent.ALT_DOWN_MASK)); setEnabled(false); } @Override public void actionPerformed(ActionEvent e) { int rowNum = table.getSelectedRow(); while (rowNum != -1) { tableModel.deleteRow(rowNum); rowNum = table.getSelectedRow(); } } } public class CommitAction extends AbstractAction { public CommitAction() { super(I18n.get("COMMIT")); putValue(Action.SHORT_DESCRIPTION, I18n.get("COMMIT TOOLTIP")); putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.ALT_DOWN_MASK)); setEnabled(false); } @Override public void actionPerformed(ActionEvent e) { TableCellEditor cellEditor = table.getCellEditor(); if (cellEditor != null) { cellEditor.stopCellEditing(); } UpdateableFetchResult updateableFetchResult = (UpdateableFetchResult) fetchResult; updateableFetchResult.updateAndCommit(); setButtonsEnabled(false); } } public class RollbackAction extends AbstractAction { public RollbackAction() { super(I18n.get("ROLLBACK")); putValue(Action.SHORT_DESCRIPTION, I18n.get("ROLLBACK TOOLTIP")); putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.ALT_DOWN_MASK)); setEnabled(false); } @Override public void actionPerformed(ActionEvent e) { UpdateableFetchResult updateableFetchResult = (UpdateableFetchResult) fetchResult; updateableFetchResult.rollback(); setButtonsEnabled(false); } } }