package com.vividsolutions.jump.workbench.ui.plugin.datastore;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import com.vividsolutions.jump.I18N;
import com.vividsolutions.jump.util.Block;
import com.vividsolutions.jump.util.CollectionUtil;
import com.vividsolutions.jump.workbench.model.LayerManager;
import com.vividsolutions.jump.workbench.WorkbenchContext;
import com.vividsolutions.jump.workbench.datastore.ConnectionDescriptor;
import com.vividsolutions.jump.workbench.ui.RecordPanel;
import com.vividsolutions.jump.workbench.ui.RecordPanelModel;
import com.vividsolutions.jump.workbench.ui.ValidatingTextField;
/**
* The panel used to choose a connection and input a SQL query.
*/
public class RunDatastoreQueryPanel extends ConnectionPanel
implements ActionListener, RecordPanelModel {
private JTextField layerNameTextField;
//private JTextField maxFeaturesTextField;
private Hashtable queryMap = new Hashtable();
private ArrayList currentConnectionQueries = new ArrayList();
private int currentIndex = -1;
private RecordPanel recordPanel = new RecordPanel(this);
private LayerManager layerManager;
public RunDatastoreQueryPanel(WorkbenchContext context) {
super(context);
layerManager = context.getLayerManager();
initialize();
}
public int getRecordCount() {
int num = 0;
if (currentConnectionQueries != null) {
num = currentConnectionQueries.size();
}
return num;
}
public void setCurrentIndex(int index) {
currentIndex = index;
String query = null;
if (index > -1) {
query = (String)currentConnectionQueries.get(index);
}
getQueryTextArea().setText(query);
}
public int getCurrentIndex() {
return currentIndex;
}
private void initialize() {
JButton jbView = new JButton(I18N.get("jump.workbench.ui.plugin.datastore.RunDatastoreQueryPanel.View"));
jbView.addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent e ) {
queryTextArea.insert("${view:-1}", queryTextArea.getCaretPosition());
}
});
JButton jbFence = new JButton(I18N.get("jump.workbench.ui.plugin.datastore.RunDatastoreQueryPanel.Fence"));
jbFence.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
queryTextArea.insert("${fence:-1}", queryTextArea.getCaretPosition());
}
});
JPanel jpButtons = new JPanel(new java.awt.GridLayout(2,1));
jpButtons.add(jbView);
jpButtons.add(jbFence);
addRow(I18N.get("jump.workbench.ui.plugin.datastore.RunDatastoreQueryPanel.Layer-Name"), getLayerNameTextField(), null, false);
//addRow(I18N.get("jump.workbench.ui.plugin.datastore.RunDatastoreQueryPanel.Max-Features"), getMaxFeaturesTextField(), null, false);
addRow(I18N.get("jump.workbench.ui.plugin.datastore.RunDatastoreQueryPanel.Query"), new JScrollPane(getQueryTextArea()) {
{setPreferredSize(new Dimension(MAIN_COLUMN_WIDTH, 100));}
}, jpButtons, true);
// We are not using addRow because we want the widgets centered over the
// OK/Cancel buttons.
add( recordPanel,
new GridBagConstraints( 0, //x
3, // y
3, // width
1, // height
1,
0,
GridBagConstraints.NORTHWEST,
GridBagConstraints.HORIZONTAL,
INSETS,
0,
0 )
);
getConnectionComboBox().addActionListener(this);
}
private JTextField getLayerNameTextField() {
if (layerNameTextField == null) {
layerNameTextField = new JTextField(
layerManager.uniqueLayerName(I18N.get("jump.workbench.ui.plugin.datastore.RunDatastoreQueryPanel.New-Query-Layer"))
);
}
return layerNameTextField;
}
//private JTextField getMaxFeaturesTextField() {
// if (maxFeaturesTextField == null) {
// maxFeaturesTextField = new ValidatingTextField("", 10,
// new ValidatingTextField.BoundedIntValidator(1,
// Integer.MAX_VALUE));
// }
// return maxFeaturesTextField;
//}
private JTextArea getQueryTextArea() {
if (queryTextArea == null) {
queryTextArea = new JTextArea();
}
return queryTextArea;
}
private JTextArea queryTextArea;
public String validateInput() {
String errMsg = super.validateInput();
if (errMsg == null) {
if (getQuery().length() == 0) {
errMsg = I18N.get("jump.workbench.ui.plugin.datastore.RunDatastoreQueryPanel.Required-field-missing-Query");
}
}
return errMsg;
}
public String getLayerName() {
return layerManager.uniqueLayerName(layerNameTextField.getText().trim());
}
public void setLayerName(String layerName) {
layerNameTextField.setText(layerName);
}
public String getQuery() {
return queryTextArea.getText().trim();
}
public void setQuery(String query) {
getQueryTextArea().setText(query);
}
public void saveQuery() {
String query = getQuery();
// maybe we should check for duplicates
currentConnectionQueries.add(query);
currentIndex = currentConnectionQueries.size()-1;
}
public void actionPerformed( ActionEvent actionEvent ) {
ConnectionDescriptor cd = getConnectionDescriptor();
if ( cd != null ) {
if ( queryMap.containsKey(cd) ) {
ArrayList prevQueries = (ArrayList) queryMap.get(cd);
currentConnectionQueries = prevQueries;
} else {
currentConnectionQueries = new ArrayList();
queryMap.put( cd, currentConnectionQueries );
}
setCurrentIndex( currentConnectionQueries.size()-1 );
recordPanel.updateAppearance();
}
}
/**
* @return null if the user has left the Max Features text field blank.
*/
//public Integer getMaxFeatures() {
// return maxFeaturesTextField.getText().trim().length() > 0 ? new Integer(
// maxFeaturesTextField.getText().trim()) : null;
//}
protected Collection connectionDescriptors() {
return CollectionUtil.select(super.connectionDescriptors(),
new Block() {
public Object yield(Object connectionDescriptor) {
try {
return Boolean.valueOf(connectionManager()
.getDriver(
((ConnectionDescriptor) connectionDescriptor)
.getDataStoreDriverClassName())
.isAdHocQuerySupported());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
}
}