package org.eclipse.persistence.tools.workbench.mappingsplugin.ui.query.relational;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.text.NumberFormat;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.ComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import org.eclipse.persistence.exceptions.ConversionException;
import org.eclipse.persistence.tools.workbench.framework.context.ApplicationContext;
import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContext;
import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContextHolder;
import org.eclipse.persistence.tools.workbench.framework.ui.dialog.AbstractDialog;
import org.eclipse.persistence.tools.workbench.framework.ui.view.AbstractSubjectPanel;
import org.eclipse.persistence.tools.workbench.framework.uitools.Spacer;
import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWAbstractProcedureArgument;
import org.eclipse.persistence.tools.workbench.uitools.app.ListAspectAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.ListValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.PropertyAspectAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.PropertyValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.SimplePropertyValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.ValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.swing.ComboBoxModelAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.swing.DocumentAdapter;
import org.eclipse.persistence.tools.workbench.uitools.swing.Combo;
import org.eclipse.persistence.tools.workbench.utility.CollectionTools;
public final class ValueInArgumentPane extends AbstractSubjectPanel {
public ValueInArgumentPane(PropertyValueModel argumentHolder, WorkbenchContextHolder workbenchContextHolder) {
super(argumentHolder, workbenchContextHolder);
}
@Override
protected void initializeLayout() {
GridBagConstraints constraints = new GridBagConstraints();
JButton editButton = new JButton(buildEditAction());
editButton.setText(resourceRepository().getString("STORED_PROCEDURE_PROPERTIES_PAGE_ARGUMENT_VALUE_EDIT_BUTTON"));
JTextField argumentValueField = new JTextField(buildArgumentValueDocument(), null, 20);
JComponent argumentValueWidgets = buildLabeledComponent(
"STORED_PROCEDURE_PROPERTIES_PAGE_ARGUMENT_VALUE_COLUMN",
argumentValueField,
editButton);
argumentValueField.setEditable(false);
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 2;
constraints.gridheight = 1;
constraints.weightx = 1;
constraints.weighty = 0;
constraints.fill = GridBagConstraints.BOTH;
constraints.anchor = GridBagConstraints.PAGE_START;
constraints.insets = new Insets(10, 10, 0, 0);
add(argumentValueWidgets, constraints);
Spacer endSpacer = new Spacer(-1);
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 2;
constraints.gridheight = 1;
constraints.weightx = 0;
constraints.weighty = 1;
constraints.fill = GridBagConstraints.VERTICAL;
constraints.anchor = GridBagConstraints.LINE_START;
constraints.insets = new Insets(0, 0, 0, 0);
add(endSpacer, constraints);
}
private Action buildEditAction() {
return new AbstractAction() {
public void actionPerformed(ActionEvent e) {
ArgumentValueDialog dialog = new ArgumentValueDialog(getWorkbenchContext(), getSubjectHolder());
dialog.show();
if (dialog.wasConfirmed()) {
((MWAbstractProcedureArgument)subject()).setArgumentValue(((ArgumentValueDialog)dialog).getArgumentValue());
}
}
};
}
private Document buildArgumentValueDocument() {
return new DocumentAdapter(buildArgumentValueHolder());
}
private PropertyValueModel buildArgumentValueHolder() {
return new PropertyAspectAdapter(getSubjectHolder(), MWAbstractProcedureArgument.ARGUMENT_VALUE_PROPERTY) {
@Override
protected Object getValueFromSubject() {
return ((MWAbstractProcedureArgument)subject()).getArgumentValue();
}
@Override
protected void setValueOnSubject(Object value) {
((MWAbstractProcedureArgument)subject()).setArgumentValue((String)value);
}
};
}
private class ArgumentValueDialog extends AbstractDialog {
private JTextField argumentValueTextField;
private Combo typeChooser;
private ValueModel argumentHolder;
private ArgumentValueDialog(WorkbenchContext context, ValueModel argumentHolder) {
super(context);
this.argumentHolder = argumentHolder;
}
@Override
protected AbstractSubjectPanel buildMainPanel() {
return new DialogPane(getSubjectHolder(), getApplicationContext());
}
protected MWAbstractProcedureArgument argument() {
return (MWAbstractProcedureArgument)this.argumentHolder.getValue();
}
protected String getInvalidInputMessageKey(Class javaClass, List<String> arguments) {
String javaClassName = javaClass.getName();
if (javaClassName.equals("java.lang.Boolean"))
return "BE_EITHER_TRUE_OR_FALSE";
if (javaClassName.equals("java.lang.Byte"))
return "BE_BETWEEN_0_AND_127";
if (javaClassName.equals("java.lang.Character"))
return "BE_SINGLE_CHARACTER";
if (javaClassName.equals("java.lang.Double"))
{
CollectionTools.addAll(arguments, new String[] { NumberFormat.getInstance().format(Double.MIN_VALUE), NumberFormat.getInstance().format(Double.MAX_VALUE) });
return "BE_BETWEEN_DOUBLE";
}
if (javaClassName.equals("java.lang.Float"))
{
CollectionTools.addAll(arguments, new String[] { NumberFormat.getInstance().format(Float.MIN_VALUE), NumberFormat.getInstance().format(Float.MAX_VALUE) });
return "BE_BETWEEN_FLOAT";
}
if (javaClassName.equals("java.lang.Integer"))
{
CollectionTools.addAll(arguments, new String[] { NumberFormat.getInstance().format(Integer.MIN_VALUE), NumberFormat.getInstance().format(Integer.MAX_VALUE) });
return "BE_BETWEEN_INT";
}
if (javaClassName.equals("java.lang.Long"))
{
CollectionTools.addAll(arguments, new String[] { NumberFormat.getInstance().format(Long.MIN_VALUE), NumberFormat.getInstance().format(Long.MAX_VALUE) });
return "BE_BETWEEN_LONG";
}
if (javaClassName.equals("java.lang.Short"))
{
CollectionTools.addAll(arguments, new String[] { NumberFormat.getInstance().format(Short.MIN_VALUE), NumberFormat.getInstance().format(Short.MAX_VALUE) });
return "BE_BETWEEN_SHORT";
}
if (javaClassName.equals("java.lang.String"))
return "BE_A_STRING";
if (javaClassName.equals("java.math.BigDecimal"))
return "CONTAINS_ONLY_DIGITS";
if (javaClassName.equals("java.math.BigInteger"))
return "CONTAINS_ONLY_DIGITS_AND";
if (javaClassName.equals("java.sql.Date"))
return "BE_IN_FORMAT1";
if (javaClassName.equals("java.sql.Time"))
return "BE_IN_FORMAT2";
if (javaClassName.equals("java.sql.Timestamp"))
return "BE_IN_FORMAT3";
if (javaClassName.equals("java.util.Date"))
return "BE_IN_FORMAT4";
if (javaClassName.equals("java.util.Calendar"))
return "BE_IN_FORMAT5";
if (javaClass == byte[].class || javaClass == Byte[].class)
return "BE_IN_FORMAT_BYTE_ARRAY";
if (javaClass == char[].class || javaClass == Character[].class)
return "BE_A_STRING";
return "ILLEGAL_FORMAT";
}
@Override
protected String helpTopicId() {
return "storedprocedure.arguments.value.editDialog";
}
@Override
public boolean preConfirm() {
try {
this.argument().buildValueFromString((String)this.typeChooser.getSelectedItem(), this.argumentValueTextField.getText());
} catch (ConversionException ce) {
showInvalidConversionDialog(ce);
return false;
}
return true;
}
public String getArgumentValue() {
return this.argumentValueTextField.getText();
}
private void showInvalidConversionDialog(ConversionException ce) {
Vector<String> arguments = new Vector<String>();
arguments.add(ce.getClassToConvertTo().getName());
JOptionPane.showMessageDialog(getWorkbenchContext().getCurrentWindow(),
resourceRepository().getString(getInvalidInputMessageKey(ce.getClassToConvertTo(), arguments), arguments.toArray()),
resourceRepository().getString("ILLEGAL_FORMAT"),
JOptionPane.WARNING_MESSAGE);
}
private void updateOKButton() {
boolean enableOKButton = this.argumentValueTextField.getText() != null && !this.argumentValueTextField.getText().equals("");
getOKAction().setEnabled(enableOKButton);
}
private class CVDocumentListener implements DocumentListener {
public void changedUpdate(DocumentEvent de) {
updateOKButton();
}
public void insertUpdate(DocumentEvent de) {
updateOKButton();
}
public void removeUpdate(DocumentEvent de) {
updateOKButton();
}
}
private class DialogPane extends AbstractSubjectPanel {
DialogPane(ValueModel subjectHolder, ApplicationContext context) {
super(subjectHolder, context);
}
private ComboBoxModel buildValueTypeComboboxModel() {
return new ComboBoxModelAdapter(buildValueTypeChooserValueModel(), buildValueTypeChooserPropertyAdapter());
}
private ListValueModel buildValueTypeChooserValueModel() {
return new ListAspectAdapter(argumentHolder) {
@Override
protected ListIterator getValueFromSubject() {
return MWAbstractProcedureArgument.buildBasicTypesList().listIterator();
}
};
}
private PropertyValueModel buildValueTypeChooserPropertyAdapter() {
return new SimplePropertyValueModel();
}
@Override
protected void initializeLayout() {
setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
setTitle(resourceRepository().getString("STORED_PROCEDURE_PROPERTIES_PAGE_ARGUMENT_VALUE_EDIT_DIALOG_TITLE"));
GridBagConstraints constraints = new GridBagConstraints();
// Create the type chooser
typeChooser = new Combo(buildValueTypeComboboxModel());
JComponent argumentValueTypeSelector = buildLabeledComponent(
"STORED_PROCEDURE_PROPERTIES_PAGE_ARGUMENT_VALUE_CLASS_COLUMN",
typeChooser);
typeChooser.setSelectedIndex(8);
typeChooser.setEditable(false);
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 0;
constraints.weighty = 0;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.anchor = GridBagConstraints.LINE_START;
constraints.insets = new Insets(5, 0, 0, 0);
add(argumentValueTypeSelector, constraints);
argumentValueTextField = new JTextField(20);
JComponent argumentValueWidgets = buildLabeledComponent("STORED_PROCEDURE_PROPERTIES_PAGE_ARGUMENT_VALUE_COLUMN", argumentValueTextField);
argumentValueTextField.getDocument().addDocumentListener(new CVDocumentListener());
argumentValueTextField.setColumns(20);
constraints.gridx = 0;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 0;
constraints.weighty = 0;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.anchor = GridBagConstraints.LINE_START;
constraints.insets = new Insets(5, 0, 0, 0);
add(argumentValueWidgets, constraints);
// Spacer
Spacer spacer = new Spacer(-1);
constraints.gridx = 0;
constraints.gridy = 2;
constraints.gridwidth = 2;
constraints.gridheight = 1;
constraints.weightx = 1;
constraints.weighty = 1;
constraints.fill = GridBagConstraints.VERTICAL;
constraints.anchor = GridBagConstraints.CENTER;
constraints.insets = new Insets(0, 0, 0, 0);
add(spacer, constraints);
updateOKButton();
}
}
}
}