package com.hackerdude.apps.sqlide.plugins.browser;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JOptionPane;
import com.hackerdude.apps.sqlide.ProgramIcons;
import com.hackerdude.apps.sqlide.SqlIdeApplication;
import com.hackerdude.apps.sqlide.dataaccess.DatabaseProcess;
import com.hackerdude.apps.sqlide.dialogs.DlgConnectionConfig;
import com.hackerdude.apps.sqlide.nodes.ItemServerNode;
import com.hackerdude.apps.sqlide.pluginapi.IDENodeContextPluginIF;
import com.hackerdude.apps.sqlide.pluginapi.IDEVisualPluginIF;
import com.hackerdude.apps.sqlide.pluginapi.NodeIDEBase;
import com.hackerdude.apps.sqlide.plugins.isql.ContextCommandRunner;
import com.hackerdude.apps.sqlide.plugins.isql.PluginInteractiveSQL;
import com.hackerdude.apps.sqlide.xml.HostConfigFactory;
import com.hackerdude.apps.sqlide.xml.hostconfig.BrowserPlugin;
import com.hackerdude.apps.sqlide.xml.hostconfig.NamedQueries;
import com.hackerdude.apps.sqlide.xml.hostconfig.Property;
import com.hackerdude.apps.sqlide.xml.hostconfig.SqlideHostConfig;
/**
* This plugin returns all the basic Node Context Operations. It is the lowest
* level node context plugin.
*/
public class BasicNodeContextOperations implements IDENodeContextPluginIF {
public BasicNodeContextOperations() {
}
/**
* Returns the actions for the selected nodes.
*
* @param selectedNodes The nodes currently selected.
* @return An array of actions that will be appropriate for the selected nodes.
*/
public Action[] getActionsFor(NodeIDEBase[] selectedNodes) {
if (selectedNodes.length != 1) { return NULL_ACTIONS; }
ArrayList actionsList = new ArrayList();
if (selectedNodes[0] instanceof ItemServerNode) {
Action newISqlWindow = new ActionISQLWindow(
(ItemServerNode) selectedNodes[0]);
actionsList.add(newISqlWindow);
Action editServerAction = new ActionEditServer(
(ItemServerNode) selectedNodes[0]);
actionsList.add(editServerAction);
}
if (selectedNodes[0] instanceof NodeIDEBase) {
IDEVisualPluginIF rightComponent = SqlIdeApplication.getInstance()
.getRightPanel();
NodeIDEBase node = selectedNodes[0];
if ((rightComponent != null)
&& (rightComponent.getClass() == PluginInteractiveSQL.class)) {
PluginInteractiveSQL iSQL = (PluginInteractiveSQL) rightComponent;
String queryText = iSQL.getQueryText();
if ((queryText != null) && (!queryText.equals(""))) {
Action addQueryAction = new ActionAddQuery(node);
actionsList.add(addQueryAction);
}
addNamedQueries(node.getDatabaseProcess().getHostConfiguration(),
actionsList, iSQL);
}
if ( rightComponent == null && ! ( selectedNodes[0] instanceof ItemServerNode) ) {
DatabaseProcess databaseProcess = selectedNodes[0].getDatabaseProcess();
if ( databaseProcess != null ) {
Action iSQLWindowAction = new ActionISQLWindow("Open ISQL on "+databaseProcess.toString(), databaseProcess);
actionsList.add(iSQLWindowAction);
}
}
}
Action[] result = new Action[actionsList.size()];
result = (Action[]) actionsList.toArray(result);
return result;
}
public void initPlugin() {
}
public String getPluginName() {
return "Basic Node Operations";
}
public String getPluginVersion() {
return "";
}
public void freePlugin() {
}
public String getPluginShortName() {
return "Node Operations";
}
public Icon getPluginIcon() {
return ProgramIcons.getInstance().getDevicesIcon();
}
/**
* Shows the database spec editor.
*/
class ActionEditServer extends AbstractAction {
ItemServerNode itemServerNode;
public ActionEditServer(ItemServerNode itemServerNode) {
super("Configure " + itemServerNode.toString(), ProgramIcons
.getInstance().findIcon("images/EditBook.gif"));
this.itemServerNode = itemServerNode;
}
public void actionPerformed(ActionEvent ev) {
SqlideHostConfig spec = itemServerNode.getDatabaseProcess()
.getHostConfiguration();
DlgConnectionConfig.showConfigurationDialog(SqlIdeApplication.getFrame(),
spec);
SqlIdeApplication.getInstance().refreshPanels();
try {
HostConfigFactory.saveSqlideHostConfig(spec);
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Could not save configuration "
+ spec.getName() + ":\n" + "Could not write to "
+ spec.getFileName() + ex.toString(), "Error while saving",
JOptionPane.ERROR_MESSAGE);
}
}
}
/**
* Shows the database spec editor.
*/
class ActionISQLWindow extends AbstractAction {
DatabaseProcess databaseProcess;
public ActionISQLWindow(ItemServerNode itemServerNode) {
this(itemServerNode.toString(), itemServerNode.getDatabaseProcess());
}
public ActionISQLWindow(String actionName, DatabaseProcess databaseProcess) {
super(actionName, ProgramIcons.getInstance().findIcon("images/Sheet.gif"));
this.databaseProcess = databaseProcess;
}
public void actionPerformed(ActionEvent ev) {
PluginInteractiveSQL iSql = new PluginInteractiveSQL();
iSql.setDatabaseProcess(databaseProcess);
iSql.initPlugin();
SqlIdeApplication.getInstance().setRightPanel(iSql);
}
}
/**
* This action allows us to add a custom query to this connection's context
* menu.
*/
class ActionAddQuery extends AbstractAction {
NodeIDEBase ideNode;
public ActionAddQuery(NodeIDEBase ideNode) {
super(determineAddQueryActionTitle(ideNode));
this.ideNode = ideNode;
}
public void actionPerformed(ActionEvent ev) {
DatabaseProcess proc = ideNode.getDatabaseProcess();
SqlideHostConfig hostConfiguration = proc.getHostConfiguration();
PluginInteractiveSQL iSql = (PluginInteractiveSQL) SqlIdeApplication
.getInstance().getRightPanel();
String queryValue = iSql.getQueryText();
String message = "<HTML><P>Enter a simple name for query:\n"
+ iSql.getQueryText();
String queryName = JOptionPane.showInputDialog(SqlIdeApplication
.getFrame(), message, "Name Query", JOptionPane.OK_CANCEL_OPTION);
if (queryName == null) return;
Property prop = new Property();
prop.setName(queryName);
prop.setValue(queryValue);
if (hostConfiguration.getBrowserPlugin() == null) {
hostConfiguration.setBrowserPlugin(new BrowserPlugin());
}
if (hostConfiguration.getBrowserPlugin().getNamedQueries() == null)
hostConfiguration.getBrowserPlugin()
.setNamedQueries(new NamedQueries());
proc.getHostConfiguration().getBrowserPlugin().getNamedQueries()
.addProperty(prop);
try {
HostConfigFactory.saveSqlideHostConfig(hostConfiguration);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public String determineAddQueryActionTitle(NodeIDEBase ideNode) {
String result = "Add this query to "
+ ideNode.getDatabaseProcess().toString();
return result;
}
private void addNamedQueries(SqlideHostConfig config, ArrayList list,
PluginInteractiveSQL iSQL) {
if (config.getBrowserPlugin() == null) return;
if (config.getBrowserPlugin().getNamedQueries() == null) return;
Property[] properties = config.getBrowserPlugin().getNamedQueries()
.getProperty();
if (properties == null) return;
for (int i = 0; i < properties.length; i++) {
String name = properties[i].getName();
String value = properties[i].getValue();
Action action = ContextCommandRunner.createCustomCommandTyper(name,
value, iSQL);
list.add(action);
}
}
}