/*
* Copyright (C) 2004 Anthony Smith
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* ----------------------------------------------------------------------------
* TITLE $Id$
* ---------------------------------------------------------------------------
*
* --------------------------------------------------------------------------*/
package opendbcopy.gui.database.single;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.util.List;
import java.util.Observable;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import opendbcopy.config.XMLTags;
import opendbcopy.controller.MainController;
import opendbcopy.gui.DynamicPanel;
import opendbcopy.gui.PluginGui;
import opendbcopy.plugin.model.database.DatabaseModel;
import opendbcopy.plugin.model.exception.MissingElementException;
import org.jdom.Element;
/**
* class description
*
* @author Anthony Smith
* @version $Revision$
*/
public class PanelProcessTable extends DynamicPanel {
private DatabaseModel model;
private boolean select_all = false;
private BorderLayout borderLayout = new BorderLayout();
private BorderLayout borderLayoutPanelMain = new BorderLayout();
private JPanel panelOptions = new JPanel();
private JPanel panelControl = new JPanel();
private JPanel panelMain = new JPanel();
private JPanel panelProcessTable = null;
private JButton buttonSelect = new JButton();
private JScrollPane scrollPane = null;
private JTable tableProcess = null;
private ProcessTableModel processTableModel = null;
/**
* Creates a new PanelProcessTable object.
*
* @param controller DOCUMENT ME!
* @param pluginGui DOCUMENT ME!
* @param registerAsObserver DOCUMENT ME!
*
* @throws MissingElementException DOCUMENT ME!
*/
public PanelProcessTable(MainController controller,
PluginGui workingMode,
Boolean registerAsObserver) throws MissingElementException {
super(controller, workingMode, registerAsObserver);
model = (DatabaseModel) super.model;
guiInit();
}
/**
* DOCUMENT ME!
*
* @param o DOCUMENT ME!
* @param obj DOCUMENT ME!
*/
public final void update(Observable o,
Object obj) {
}
/**
* DOCUMENT ME!
*/
public final void onSelect() {
try {
initTable();
} catch (MissingElementException e) {
postException(e);
}
}
/**
* DOCUMENT ME!
*
* @throws MissingElementException DOCUMENT ME!
*/
public final void initTable() throws MissingElementException {
if (model.getNbrSourceTables() > 0) {
// means tables have already been loaded once
if (scrollPane != null) {
panelMain.remove(scrollPane);
}
processTableModel = new ProcessTableModel(model.getSourceTables());
tableProcess = new JTable(processTableModel);
// Set up column sizes
initColumnSizesTable(tableProcess);
panelProcessTable = new JPanel();
panelProcessTable.setLayout(new BorderLayout());
panelProcessTable.add(tableProcess.getTableHeader(), BorderLayout.PAGE_START);
panelProcessTable.add(tableProcess, BorderLayout.CENTER);
scrollPane = new JScrollPane(panelProcessTable);
panelMain.add(scrollPane, BorderLayout.CENTER);
buttonSelect.setEnabled(true);
panelMain.updateUI();
} else {
buttonSelect.setEnabled(false);
}
}
/**
* DOCUMENT ME!
*
* @throws MissingElementException DOCUMENT ME!
*/
private void guiInit() throws MissingElementException {
borderLayout.setHgap(10);
borderLayout.setVgap(10);
this.setLayout(borderLayout);
panelMain.setLayout(borderLayoutPanelMain);
borderLayoutPanelMain.setHgap(10);
borderLayoutPanelMain.setVgap(10);
buttonSelect.setPreferredSize(new Dimension(160, 25));
panelControl.setMinimumSize(new Dimension(300, 30));
panelControl.setPreferredSize(new Dimension(300, 30));
panelControl.setLayout(new BorderLayout(20, 20));
panelControl.add(buttonSelect, BorderLayout.EAST);
if (select_all) {
buttonSelect.setText(rm.getString("button.selectAll"));
} else {
buttonSelect.setText(rm.getString("button.deselectAll"));
}
buttonSelect.addActionListener(new PanelProcessTable_buttonSelect_actionAdapter(this));
buttonSelect.setEnabled(false);
panelMain.add(panelControl, BorderLayout.NORTH);
initTable();
this.add(panelOptions, BorderLayout.SOUTH);
this.add(panelMain, BorderLayout.CENTER);
}
/*
* This method picks good column sizes.
* If all column heads are wider than the column's cells'
* contents, then you can just use column.sizeWidthToFit().
*/
private void initColumnSizesTable(JTable table) {
ProcessTableModel modelTable = (ProcessTableModel) table.getModel();
TableColumn column = null;
Component comp = null;
int headerWidth = 0;
int cellWidth = 0;
Object[] longValues = modelTable.longValues;
TableCellRenderer headerRenderer = table.getTableHeader().getDefaultRenderer();
for (int i = 0; i < modelTable.getColumnCount(); i++) {
column = table.getColumnModel().getColumn(i);
comp = headerRenderer.getTableCellRendererComponent(null, column.getHeaderValue(), false, false, 0, 0);
headerWidth = comp.getPreferredSize().width;
comp = table.getDefaultRenderer(modelTable.getColumnClass(i)).getTableCellRendererComponent(table, longValues[i], false, false, 0, i);
cellWidth = comp.getPreferredSize().width;
column.setPreferredWidth(Math.max(headerWidth, cellWidth));
}
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
void buttonSelect_actionPerformed(ActionEvent e) {
try {
if (!select_all) {
for (int row = 0; row < processTableModel.getRowCount(); row++) {
processTableModel.setValueAt(new Boolean(false), row, 2);
}
buttonSelect.setText(rm.getString("button.selectAll"));
select_all = true;
} else {
for (int row = 0; row < processTableModel.getRowCount(); row++) {
processTableModel.setValueAt(new Boolean(true), row, 2);
}
buttonSelect.setText(rm.getString("button.deselectAll"));
select_all = false;
}
} catch (Exception ex) {
postException(ex);
}
}
/**
* class description
*
* @author Anthony Smith
* @version $Revision$
*/
class ProcessTableModel extends AbstractTableModel {
private String[] columnNames = { rm.getString("text.table.type"), rm.getString("text.table.sourceTableView"), rm.getString("text.table.process") };
public final Object[] longValues = { "table", "abcdefghijklmnopqrstuvwxyz", new Boolean(false) };
private List tablesList;
public ProcessTableModel(List tablesList) {
this.tablesList = tablesList;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public final int getColumnCount() {
return columnNames.length;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public final int getRowCount() {
return tablesList.size();
}
/**
* DOCUMENT ME!
*
* @param col DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public final String getColumnName(int col) {
return columnNames[col];
}
/**
* DOCUMENT ME!
*
* @param row DOCUMENT ME!
* @param col DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public final Object getValueAt(int row,
int col) {
Element rowElement = (Element) tablesList.get(row);
switch (col) {
case 0: return rowElement.getAttributeValue(XMLTags.TABLE_TYPE);
case 1: return rowElement.getAttributeValue(XMLTags.NAME);
case 2: return Boolean.valueOf(rowElement.getAttributeValue(XMLTags.PROCESS));
}
return "you should'nt be here";
}
/*
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/
public final Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/*
* Don't need to implement this method unless your table's
* editable.
*/
public final boolean isCellEditable(int row,
int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col < 2) {
return false;
} else {
return true;
}
}
/*
* Don't need to implement this method unless your table's
* data can change.
*/
public final void setValueAt(Object value,
int row,
int col) {
if (col == 2) {
Element rowElement = (Element) tablesList.get(row);
rowElement.setAttribute(XMLTags.PROCESS, ((Boolean) value).toString());
fireTableCellUpdated(row, col);
}
}
}
}
/**
* class description
*
* @author Anthony Smith
* @version $Revision$
*/
class PanelProcessTable_buttonSelect_actionAdapter implements java.awt.event.ActionListener {
PanelProcessTable adaptee;
/**
* Creates a new PanelMappingTable_buttonSelect_actionAdapter object.
*
* @param adaptee DOCUMENT ME!
*/
PanelProcessTable_buttonSelect_actionAdapter(PanelProcessTable adaptee) {
this.adaptee = adaptee;
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
public final void actionPerformed(ActionEvent e) {
adaptee.buttonSelect_actionPerformed(e);
}
}