/*
* 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;
import info.clearthought.layout.TableLayout;
import opendbcopy.config.GUI;
import opendbcopy.config.XMLTags;
import opendbcopy.connection.exception.CloseConnectionException;
import opendbcopy.connection.exception.DriverNotFoundException;
import opendbcopy.connection.exception.OpenConnectionException;
import opendbcopy.controller.MainController;
import opendbcopy.plugin.PluginManager;
import opendbcopy.plugin.model.Model;
import opendbcopy.plugin.model.exception.MissingAttributeException;
import opendbcopy.plugin.model.exception.MissingElementException;
import opendbcopy.plugin.model.exception.PluginException;
import opendbcopy.plugin.model.exception.UnsupportedAttributeValueException;
import opendbcopy.resource.ResourceManager;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.jdom.Element;
import org.jdom.JDOMException;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
/**
* class description
*
* @author Anthony Smith
* @version $Revision$
*/
public class PluginGui {
private static Logger logger = Logger.getLogger(PluginGui.class.getName());
private MainController controller;
private ResourceManager rm;
private PluginManager pluginManager;
private Model model;
private Element pluginElement;
private String identifier;
private String displayOrder;
private String title;
private String modelClassName;
private HashMap availablePluginThreads;
private Vector panelsMetadata;
private Vector panels;
private JTabbedPane tab;
private JPanel panelPluginGui;
private JPanel panelControl;
private JTextArea statusBar;
private JButton buttonNext;
/**
* Creates a new Mode object.
*
* @param controller DOCUMENT ME!
* @param pluginGuiElement DOCUMENT ME!
* @param pluginElement DOCUMENT ME!
*
* @throws MissingAttributeException DOCUMENT ME!
* @throws MissingElementException DOCUMENT ME!
* @throws IllegalArgumentException DOCUMENT ME!
*/
PluginGui(MainController controller,
Element pluginGuiElement,
Element pluginElement) throws MissingAttributeException, MissingElementException {
if (controller == null) {
throw new IllegalArgumentException("Missing controller");
}
if (pluginGuiElement == null) {
throw new IllegalArgumentException("Missing pluginGuiElement");
}
if (pluginElement == null) {
throw new IllegalArgumentException("Missing pluginElement");
}
if ((pluginGuiElement.getAttributeValue(XMLTags.IDENTIFIER) != null) && (pluginGuiElement.getAttributeValue(XMLTags.IDENTIFIER).length() == 0)) {
throw new MissingAttributeException(pluginGuiElement, XMLTags.IDENTIFIER);
}
this.controller = controller;
this.pluginElement = pluginElement;
rm = controller.getResourceManager();
availablePluginThreads = new HashMap();
identifier = pluginGuiElement.getAttributeValue(XMLTags.IDENTIFIER);
if (pluginGuiElement.getChild(XMLTags.TITLE) == null) {
throw new MissingElementException(pluginGuiElement, XMLTags.TITLE);
}
title = pluginGuiElement.getChild(XMLTags.TITLE).getAttributeValue(XMLTags.VALUE);
if (title == null) {
throw new MissingAttributeException(pluginGuiElement.getChild(XMLTags.TITLE), XMLTags.VALUE);
} else {
title = rm.getString(title);
}
loadPlugins(pluginElement);
loadPanels(pluginGuiElement);
}
/**
* DOCUMENT ME!
*
* @param model DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws MissingAttributeException DOCUMENT ME!
* @throws ClassNotFoundException DOCUMENT ME!
* @throws InstantiationException DOCUMENT ME!
* @throws InvocationTargetException DOCUMENT ME!
* @throws IllegalAccessException DOCUMENT ME!
* @throws PluginException DOCUMENT ME!
*/
public final JPanel load(Model model) throws MissingAttributeException, ClassNotFoundException, InstantiationException, InvocationTargetException, IllegalAccessException, PluginException {
this.model = model;
double[][] sizeMain = {
{ GUI.B, GUI.F, GUI.B }, // Columns
{ GUI.B, GUI.F, GUI.VS, GUI.P, GUI.B }
}; // Rows
double[][] sizeControl = {
{ GUI.B, GUI.F, GUI.HG, GUI.P, GUI.B }, // Columns
{ GUI.VS, GUI.P, GUI.VS }
}; // Rows
panelPluginGui = new JPanel(new TableLayout(sizeMain));
panelControl = new JPanel(new TableLayout(sizeControl));
statusBar = new JTextArea();
statusBar.setEditable(false);
statusBar.setBackground(null);
buttonNext = new JButton(rm.getString("button.next"));
buttonNext.addActionListener(new WorkingMode_buttonNext_actionAdapter(this));
panelControl.add(statusBar, "1, 1, l, t");
panelControl.add(buttonNext, "3, 1, r, t");
JTabbedPane tab = loadDynamically();
tab.addMouseListener(new WorkingMode_tab_mouseAdapter(this));
panelPluginGui.add(tab, "1, 1");
panelPluginGui.add(panelControl, "1, 3");
return panelPluginGui;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws ClassNotFoundException DOCUMENT ME!
* @throws InstantiationException DOCUMENT ME!
* @throws InvocationTargetException DOCUMENT ME!
* @throws IllegalAccessException DOCUMENT ME!
*/
private JTabbedPane loadDynamically() throws ClassNotFoundException, InstantiationException, InvocationTargetException, IllegalAccessException {
tab = new JTabbedPane();
for (int i = 0; i < getNbrDynamicPanelsMetadata(); i++) {
DynamicPanelMetadata dynPanelMetadata = getDynamicPanelMetadata(i);
DynamicPanel dynPanel = (DynamicPanel) dynamicallyLoadPanel(dynPanelMetadata);
tab.add(dynPanel, controller.getResourceManager().getString(dynPanelMetadata.getTitle()));
}
return tab;
}
/**
* DOCUMENT ME!
*
* @param operation DOCUMENT ME!
* @param messageSuccessful DOCUMENT ME!
*
* @throws UnsupportedAttributeValueException DOCUMENT ME!
* @throws MissingAttributeException DOCUMENT ME!
* @throws MissingElementException DOCUMENT ME!
* @throws DriverNotFoundException DOCUMENT ME!
* @throws OpenConnectionException DOCUMENT ME!
* @throws CloseConnectionException DOCUMENT ME!
* @throws JDOMException DOCUMENT ME!
* @throws SQLException DOCUMENT ME!
* @throws IOException DOCUMENT ME!
* @throws Exception DOCUMENT ME!
*/
public final void execute(Element operation,
String messageSuccessful) throws UnsupportedAttributeValueException, MissingAttributeException, MissingElementException, DriverNotFoundException, OpenConnectionException, CloseConnectionException, JDOMException, SQLException, IOException, Exception {
try {
model.execute(operation);
logger.info(messageSuccessful);
postMessage(messageSuccessful);
} catch (Exception e) {
logger.error(e);
e.printStackTrace();
JOptionPane.showMessageDialog(controller.getFrame(), e.getMessage(), "Oooooops!", JOptionPane.ERROR_MESSAGE);
}
}
/**
* DOCUMENT ME!
*
* @param message DOCUMENT ME!
*/
public final void postMessage(String message) {
statusBar.setText(message);
logger.info(message);
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
* @param level DOCUMENT ME!
*/
public final void postException(Exception e,
Level level) {
e.printStackTrace();
if (level.isGreaterOrEqual(Level.ERROR)) {
logger.error(e);
JOptionPane.showMessageDialog(controller.getFrame(), e.getMessage(), "Oooooops!", JOptionPane.ERROR_MESSAGE);
} else if (level.isGreaterOrEqual(Level.WARN)) {
logger.warn(e);
JOptionPane.showMessageDialog(controller.getFrame(), e.getMessage(), "Oooooops!", JOptionPane.WARNING_MESSAGE);
}
}
/**
* DOCUMENT ME!
*/
public final void enableNextButton() {
if (tab.getSelectedIndex() == (tab.getTabCount() - 1)) {
buttonNext.setVisible(false);
} else {
buttonNext.setVisible(true);
}
}
/**
* DOCUMENT ME!
*/
public final void destroyDynamicPanels() {
if (tab != null) {
for (int i = 0; i < tab.getTabCount(); i++) {
DynamicPanel dynPanel = (DynamicPanel) tab.getComponent(i);
tab.remove(dynPanel);
if (getDynamicPanelMetadata(i).isRegisterObserver()) {
try {
controller.deleteObserver(dynPanel);
} catch (Exception e) {
// who cares ...
}
}
dynPanel = null;
}
}
}
/**
* DOCUMENT ME!
*
* @param index DOCUMENT ME!
*/
public final void setSelectedTab(int index) {
tab.setSelectedIndex(index);
DynamicPanel dynPanel = (DynamicPanel) tab.getComponentAt(index);
// give the panel the chance to do some action on selection
dynPanel.onSelect();
}
/**
* DOCUMENT ME!
*
* @return Returns the panels.
*/
public final Vector getPanels() {
return panels;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public final int getNbrDynamicPanels() {
return panels.size();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public final int getNbrDynamicPanelsMetadata() {
return panelsMetadata.size();
}
/**
* DOCUMENT ME!
*
* @param dynamicPanelMetadata DOCUMENT ME!
*/
public final void addDynamicPanelMetadata(DynamicPanelMetadata dynamicPanelMetadata) {
if (panelsMetadata == null) {
panelsMetadata = new Vector();
}
panelsMetadata.add(dynamicPanelMetadata);
}
/**
* DOCUMENT ME!
*
* @return Returns the title.
*/
public final String getTitle() {
return title;
}
/**
* DOCUMENT ME!
*
* @return Returns the identifier.
*/
public final String getIdentifier() {
return identifier;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public final HashMap getAvailablePluginThreads() {
return availablePluginThreads;
}
/**
* DOCUMENT ME!
*
* @return Returns the displayOrder.
*/
public final String getDisplayOrder() {
return displayOrder;
}
/**
* DOCUMENT ME!
*
* @return Returns the modelClassName.
*/
public final String getModelClassName() {
return modelClassName;
}
/**
* DOCUMENT ME!
*
* @return Returns the pluginElement.
*/
public final Element getPluginElement() {
return pluginElement;
}
/**
* DOCUMENT ME!
*
* @return Returns the model.
*/
public final Model getModel() {
return model;
}
/**
* DOCUMENT ME!
*
* @param model The model to set.
*/
public final void setModel(Model model) {
this.model = model;
}
/**
* DOCUMENT ME!
*
* @return Returns the panelPluginGui.
*/
public JPanel getPanelPluginGui() {
return panelPluginGui;
}
/**
* DOCUMENT ME!
*
* @param index DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private DynamicPanelMetadata getDynamicPanelMetadata(int index) {
if (index < panelsMetadata.size()) {
return (DynamicPanelMetadata) panelsMetadata.elementAt(index);
} else {
return null;
}
}
/**
* DOCUMENT ME!
*
* @param index DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private DynamicPanel getDynamicPanel(int index) {
if (index < panels.size()) {
return (DynamicPanel) panels.elementAt(index);
} else {
return null;
}
}
/**
* DOCUMENT ME!
*
* @param dynamicPanelMetadata DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws ClassNotFoundException DOCUMENT ME!
* @throws InstantiationException DOCUMENT ME!
* @throws InvocationTargetException DOCUMENT ME!
* @throws IllegalAccessException DOCUMENT ME!
*/
private Object dynamicallyLoadPanel(DynamicPanelMetadata dynamicPanelMetadata) throws ClassNotFoundException, InstantiationException, InvocationTargetException, IllegalAccessException {
Class dynClass = Class.forName(dynamicPanelMetadata.getClassName());
Constructor[] constructors = dynClass.getConstructors();
Object[] params = new Object[3];
params[0] = controller;
params[1] = this;
if (dynamicPanelMetadata.isRegisterObserver()) {
params[2] = new Boolean(true);
} else {
params[2] = new Boolean(false);
}
// works as long there is only one constructor
return constructors[0].newInstance(params);
}
/**
* DOCUMENT ME!
*
* @param pluginElement DOCUMENT ME!
*
* @throws MissingAttributeException DOCUMENT ME!
* @throws IllegalArgumentException DOCUMENT ME!
*/
private void loadPlugins(Element pluginElement) throws MissingAttributeException {
if (pluginElement == null) {
throw new IllegalArgumentException("Missing pluginElement");
}
if ((pluginElement.getAttributeValue(XMLTags.MODEL_CLASS) == null) || (pluginElement.getAttributeValue(XMLTags.MODEL_CLASS).length() == 0)) {
throw new MissingAttributeException(pluginElement, XMLTags.MODEL_CLASS);
} else {
modelClassName = pluginElement.getAttributeValue(XMLTags.MODEL_CLASS);
}
Iterator itThreads = pluginElement.getChild(XMLTags.THREADS).getChildren(XMLTags.THREAD).iterator();
while (itThreads.hasNext()) {
Element threadElement = (Element) itThreads.next();
if (threadElement.getAttributeValue(XMLTags.THREAD_CLASS) == null) {
throw new MissingAttributeException(threadElement, XMLTags.THREAD);
}
if (threadElement.getAttributeValue(XMLTags.DESCRIPTION) == null) {
throw new MissingAttributeException(threadElement, XMLTags.DESCRIPTION);
}
availablePluginThreads.put(threadElement.getAttributeValue(XMLTags.THREAD_CLASS), rm.getString(threadElement.getAttributeValue(XMLTags.DESCRIPTION)));
}
}
/**
* DOCUMENT ME!
*
* @param workingModeElement DOCUMENT ME!
*
* @throws MissingAttributeException DOCUMENT ME!
* @throws MissingElementException DOCUMENT ME!
*/
private void loadPanels(Element workingModeElement) throws MissingAttributeException, MissingElementException {
// now retrieve requested panels
if (workingModeElement.getChild(XMLTags.PANELS) == null) {
throw new MissingElementException(workingModeElement, XMLTags.PANELS);
}
if (workingModeElement.getChild(XMLTags.PANELS).getChildren(XMLTags.PANEL).size() == 0) {
throw new MissingElementException(workingModeElement.getChild(XMLTags.PANELS), XMLTags.PANEL);
}
Iterator itPanels = workingModeElement.getChild(XMLTags.PANELS).getChildren(XMLTags.PANEL).iterator();
while (itPanels.hasNext()) {
Element dynamicPanelElement = (Element) itPanels.next();
String titlePanel = dynamicPanelElement.getAttributeValue(XMLTags.TITLE);
if (titlePanel == null) {
throw new MissingAttributeException(dynamicPanelElement, XMLTags.TITLE);
}
if (dynamicPanelElement.getChild(XMLTags.CLASS) == null) {
throw new MissingElementException(dynamicPanelElement, XMLTags.CLASS);
}
if (dynamicPanelElement.getChild(XMLTags.CLASS).getAttributeValue(XMLTags.NAME) == null) {
throw new MissingAttributeException(dynamicPanelElement, XMLTags.NAME);
}
String className = dynamicPanelElement.getChild(XMLTags.CLASS).getAttributeValue(XMLTags.NAME);
boolean registerObserver = false;
if ((dynamicPanelElement.getChild(XMLTags.CLASS).getAttributeValue(XMLTags.REGISTER_AS_OBSERVER) != null) && (dynamicPanelElement.getChild(XMLTags.CLASS).getAttributeValue(XMLTags.REGISTER_AS_OBSERVER).compareToIgnoreCase("true") == 0)) {
registerObserver = true;
} else {
registerObserver = false;
}
addDynamicPanelMetadata(new DynamicPanelMetadata(titlePanel, className, registerObserver));
}
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
void buttonNext_actionPerformed(ActionEvent e) {
// selection of working mode
if (tab.getSelectedIndex() < (tab.getTabCount() - 1)) {
tab.setSelectedIndex(tab.getSelectedIndex() + 1);
}
setSelectedTab(tab.getSelectedIndex());
enableNextButton();
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
void tab_mouseClicked(MouseEvent e) {
setSelectedTab(tab.getSelectedIndex());
enableNextButton();
}
}
/**
* class description
*
* @author Anthony Smith
* @version $Revision$
*/
class WorkingMode_buttonNext_actionAdapter implements java.awt.event.ActionListener {
PluginGui adaptee;
/**
* Creates a new WorkingMode_buttonNext_actionAdapter object.
*
* @param adaptee DOCUMENT ME!
*/
WorkingMode_buttonNext_actionAdapter(PluginGui adaptee) {
this.adaptee = adaptee;
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
public final void actionPerformed(ActionEvent e) {
adaptee.buttonNext_actionPerformed(e);
}
}
/**
* class description
*
* @author Anthony Smith
* @version $Revision$
*/
class WorkingMode_tab_mouseAdapter extends java.awt.event.MouseAdapter {
PluginGui adaptee;
/**
* Creates a new WorkingMode_tab_mouseAdapter object.
*
* @param adaptee DOCUMENT ME!
*/
WorkingMode_tab_mouseAdapter(PluginGui adaptee) {
this.adaptee = adaptee;
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
public final void mouseClicked(MouseEvent e) {
adaptee.tab_mouseClicked(e);
}
}