/*
* Copyright (c) 2007, 2015, Oracle. All rights reserved.
*
* This software is the proprietary information of Oracle Corporation.
* Use is subject to license terms.
*/
package org.eclipse.persistence.tools.workbench.mappingsplugin.ui.query.relational;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Iterator;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.Document;
import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContextHolder;
import org.eclipse.persistence.tools.workbench.framework.ui.view.AbstractSubjectPanel;
import org.eclipse.persistence.tools.workbench.framework.uitools.AddRemoveListPanel;
import org.eclipse.persistence.tools.workbench.framework.uitools.AddRemoveTablePanel;
import org.eclipse.persistence.tools.workbench.framework.uitools.Spacer;
import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWAbstractProcedureArgument;
import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWProcedure;
import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWProcedureNamedInArgument;
import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWProcedureNamedInOutputArgument;
import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWProcedureNamedOutputArgument;
import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWProcedureUnamedInArgument;
import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWProcedureUnamedInOutputArgument;
import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWProcedureUnamedOutputArgument;
import org.eclipse.persistence.tools.workbench.uitools.ComponentEnabler;
import org.eclipse.persistence.tools.workbench.uitools.SwitcherPanel;
import org.eclipse.persistence.tools.workbench.uitools.app.CollectionAspectAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.CollectionListValueModelAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.CollectionValueModel;
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.TransformationPropertyValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.swing.CheckBoxModelAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.swing.DocumentAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.swing.ObjectListSelectionModel;
import org.eclipse.persistence.tools.workbench.uitools.cell.SimpleListCellRenderer;
import org.eclipse.persistence.tools.workbench.utility.CollectionTools;
import org.eclipse.persistence.tools.workbench.utility.Transformer;
/**
*
* @see MWProcedure
* @see StoredProcedurePropertiesPage – The parent container
*
* @version 11.0.0
* @since 11.0.0
* @author Les Davis
*/
final class StoredProcedurePropertiesPane extends AbstractSubjectPanel
{
private PropertyValueModel selectedArgumentHolder;
private ParameterInArgumentPane namedInPane;
private ValueInArgumentPane namedInValuePane;
private ParameterOutArgumentPane namedOutPane;
private ParameterInOutArgumentPane namedInOutPane;
private ValueInOutArgumentPane namedInOutValuePane;
private ParameterInArgumentPane unnamedInPane;
private ValueInArgumentPane unnamedInValuePane;
private ParameterOutArgumentPane unnamedOutPane;
private ParameterInOutArgumentPane unnamedInOutPane;
private ValueInOutArgumentPane unnamedInOutValuePane;
private PropertyValueModel useUnnamedOutputCursorHolder;
/**
* Creates a new <code>StoredProcedurePropertiesPane</code>.
*
* @param subjectHolder The holder of <code>MWProcedure</code>
* @param workbenchContextHolder The holder of the <code>WorkbenchContext</code>,
* used to retrieve the localized string, active window, etc
*/
StoredProcedurePropertiesPane(PropertyValueModel procedureHolder,
WorkbenchContextHolder workbenchContextHolder)
{
super(procedureHolder, workbenchContextHolder);
}
/**
* {@inheritDoc}
*/
@Override
protected void initializeLayout()
{
GridBagConstraints constraints = new GridBagConstraints();
this.selectedArgumentHolder = new SimplePropertyValueModel();
JComponent nameField = buildLabeledTextField("STORED_PROCEDURE_PROPERTIES_PAGE_PROCEDURE_NAME", buildNameDocument());
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 1;
constraints.weighty = 0;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.anchor = GridBagConstraints.PAGE_START;
constraints.insets = new Insets(0, 0, 0, 0);
add(nameField, constraints);
JCheckBox useUnamedOutputCursorCheckbox = buildCheckBox("STORED_PROCEDURE_PROPERTIES_PAGE_USE_UNNAMED_OUPUT_CURSOR", buildUnnamedOuputCursorCheckboxModel());
constraints.gridx = 0;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 1;
constraints.weighty = 0;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.anchor = GridBagConstraints.LINE_START;
constraints.insets = new Insets(5, 0, 0, 0);
add(useUnamedOutputCursorCheckbox, constraints);
JComponent outputCursorNameWidgets = buildLabeledTextField("STORED_PROCEDURE_PROPERTIES_PAGE_OUTPUT_CURSOR_NAME", buildOutputCursorNameDocument());
constraints.gridx = 0;
constraints.gridy = 2;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 1;
constraints.weighty = 0;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.anchor = GridBagConstraints.LINE_START;
constraints.insets = new Insets(5, 10, 0, 0);
add(outputCursorNameWidgets, constraints);
new ComponentEnabler(buildReverseHolder(this.useUnnamedOutputCursorHolder), outputCursorNameWidgets);
JPanel argumentPanel = new JPanel(new GridBagLayout());
argumentPanel.setOpaque(false);
constraints.gridx = 0;
constraints.gridy = 3;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 0;
constraints.weighty = 1;
constraints.fill = GridBagConstraints.BOTH;
constraints.anchor = GridBagConstraints.LINE_START;
constraints.insets = new Insets(5, 15, 0, 0);
add(argumentPanel, constraints);
AddRemoveListPanel argumentsListPane = buildArgumentsListPanel();
argumentsListPane.setPreferredSize(new Dimension(175, 200));
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 0;
constraints.weighty = 1;
constraints.fill = GridBagConstraints.VERTICAL;
constraints.anchor = GridBagConstraints.PAGE_START;
constraints.insets = new Insets(1, 0, 0, 0);
argumentPanel.add(argumentsListPane, constraints);
JComponent container = new JPanel(new GridBagLayout());
container.setOpaque(false);
constraints.gridx = 1;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 2;
constraints.weightx = 1;
constraints.weighty = 0;
constraints.fill = GridBagConstraints.BOTH;
constraints.anchor = GridBagConstraints.PAGE_START;
constraints.insets = new Insets(0, 10, 0, 0);
argumentPanel.add(container, constraints);
// type widgets
JTextField typeField = new JTextField(buildArgumentTypeDocument(selectedArgumentHolder), null, 20);
typeField.setEditable(false);
JComponent typeWidgets = buildLabeledComponent("ARGUMENT_TYPE_LABEL", typeField);
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 1;
constraints.weighty = 0;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.anchor = GridBagConstraints.LINE_START;
constraints.insets = new Insets(15, 0, 0, 0);
container.add(typeWidgets, constraints);
initializePanes();
// Properties pane
SwitcherPanel argumentsPanel = new SwitcherPanel
(
selectedArgumentHolder,
buildArgumentTypeTransformer()
);
constraints.gridx = 0;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 1;
constraints.weighty = 1;
constraints.fill = GridBagConstraints.BOTH;
constraints.anchor = GridBagConstraints.LINE_START;
constraints.insets = new Insets(10, 0, 0, 0);
container.add(argumentsPanel, constraints);
Spacer endSpace = new Spacer();
constraints.gridx = 0;
constraints.gridy = 4;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 0;
constraints.weighty = 1;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.anchor = GridBagConstraints.LINE_START;
constraints.insets = new Insets(5, 15, 0, 0);
add(endSpace, constraints);
}
protected AddRemoveListPanel buildArgumentsListPanel() {
AddRemoveListPanel argumentsListPanel = new AddRemoveListPanel(
getApplicationContext(),
buildAddRemoveListPanelAdapter(),
buildArgumentListValueModel(),
resourceRepository().getString("ARGUMENTS_LIST"));
argumentsListPanel.setCellRenderer(buildArgumentsListCellRenderer());
argumentsListPanel.setBorder(buildStandardEmptyBorder());
argumentsListPanel.addListSelectionListener(buildArgumentListSelectionListener());
return argumentsListPanel;
}
private AddRemoveListPanel.Adapter buildAddRemoveListPanelAdapter() {
return new AddRemoveListPanel.Adapter() {
public void addNewItem(ObjectListSelectionModel listSelectionModel) {
promptToAddAgument(listSelectionModel);
}
public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
removeSelectedArguments(listSelectionModel);
}
};
}
protected ListSelectionListener buildArgumentListSelectionListener() {
return new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if ( ! e.getValueIsAdjusting()) {
ObjectListSelectionModel listSelectionModel = (ObjectListSelectionModel) e.getSource();
Object[] values = listSelectionModel.getSelectedValues();
if (values.length == 1) {
selectedArgumentHolder.setValue(values[0]);
}
else {
selectedArgumentHolder.setValue(null);
}
}
}
};
}
private ListCellRenderer buildArgumentsListCellRenderer() {
return new SimpleListCellRenderer() {
protected String buildText(Object value) {
if ("".equals(((MWAbstractProcedureArgument)value).getArgumentName())) {
return resourceRepository().getString("UNNAMED_ARGUMENT");
} else {
return ((MWAbstractProcedureArgument)value).getArgumentName();
}
}
};
}
private DocumentAdapter buildNameDocument() {
return new DocumentAdapter(buildNameModel());
}
private PropertyValueModel buildNameModel() {
return new PropertyAspectAdapter(getSubjectHolder(), MWProcedure.NAME_PROPERTY) {
@Override
protected Object getValueFromSubject() {
return ((MWProcedure)subject).getName();
}
@Override
protected void setValueOnSubject(Object value) {
((MWProcedure)subject).setName((String)value);
}
};
}
protected void promptToAddAgument(ObjectListSelectionModel listSelectionModel)
{
AddArgumentDialog.AddArgumentBuilder builder;
builder = new AddArgumentDialog.AddArgumentBuilder();
builder.setTitle(resourceRepository().getString("ADD_ARGUMENT_DIALOG_TITLE"));
builder.setTextFieldDescription("ENTER_NEW_ARGUMENT_NAME");
builder.setHelpTopicId("dialog.addNewArgument");
//builder.setDescriptionTitle("ADD_ARGUMENT_DIALOG_DESCRIPTION_TITLE");
//builder.setDescription("ADD_ARGUMENT_DIALOG_DESCRIPTION");
AddArgumentDialog dialog = builder.buildDialog(getWorkbenchContext());
dialog.show();
if (dialog.wasConfirmed()) {
AddArgumentDialog.ArgumentType argumentType = dialog.getArgumentType();
String argumentName = dialog.getNewName();
MWAbstractProcedureArgument newArgument;
if (argumentType == AddArgumentDialog.ArgumentType.NAMED_IN) {
newArgument = ((MWProcedure)subject()).addNamedInArgument(argumentName);
}
else if (argumentType == AddArgumentDialog.ArgumentType.NAMED_OUT) {
newArgument = ((MWProcedure)subject()).addNamedOutputArgument(argumentName);
}
else if (argumentType == AddArgumentDialog.ArgumentType.NAMED_IN_OUT) {
newArgument = ((MWProcedure)subject()).addNamedInOutputArgument(argumentName);
}
else if (argumentType == AddArgumentDialog.ArgumentType.UNNAMED_IN) {
newArgument = ((MWProcedure)subject()).addUnamedInArgument();
}
else if (argumentType == AddArgumentDialog.ArgumentType.UNNAMED_OUT) {
newArgument = ((MWProcedure)subject()).addUnamedOutputArgument();
}
else {
newArgument = ((MWProcedure)subject()).addUnamedInOutputArgument();
}
if (dialog.getArgumentPassType() == AddArgumentDialog.ArgumentPassType.VALUE) {
newArgument.setPassType(MWAbstractProcedureArgument.VALUE_TYPE);
} else {
newArgument.setPassType(MWAbstractProcedureArgument.PARAMETER_TYPE);
}
listSelectionModel.setSelectedValue(newArgument);
}
}
protected void removeSelectedArguments(ObjectListSelectionModel listSelectionModel)
{
Iterator arguments = CollectionTools.iterator(listSelectionModel.getSelectedValues());
while (arguments.hasNext())
{
((MWProcedure)subject()).removeArgument((MWAbstractProcedureArgument)arguments.next());
}
}
private ListValueModel buildArgumentListValueModel() {
return new CollectionListValueModelAdapter(buildArgumentsHolder());
}
private CollectionValueModel buildArgumentsHolder() {
return new CollectionAspectAdapter(getSubjectHolder(), MWProcedure.ARGUMENT_COLLECTION) {
@Override
protected Iterator getValueFromSubject() {
return ((MWProcedure)subject).getAllArguments();
}
@Override
protected int sizeFromSubject() {
return ((MWProcedure)subject).argumentsSize();
}
};
}
private void initializePanes()
{
namedInPane = new ParameterInArgumentPane(
buildNamedInArgumentHolder(),
getWorkbenchContextHolder()
);
namedInValuePane = new ValueInArgumentPane(
buildNamedInArgumentHolder(),
getWorkbenchContextHolder()
);
namedOutPane = new ParameterOutArgumentPane(
buildNamedOutArgumentHolder(),
getWorkbenchContextHolder()
);
namedInOutPane = new ParameterInOutArgumentPane(
buildNamedInOutArgumentHolder(),
getWorkbenchContextHolder()
);
namedInOutValuePane = new ValueInOutArgumentPane(
buildNamedInOutArgumentHolder(),
getWorkbenchContextHolder()
);
unnamedInPane = new ParameterInArgumentPane(
buildUnnamedInArgumentHolder(),
getWorkbenchContextHolder()
);
unnamedInValuePane = new ValueInArgumentPane(
buildUnnamedInArgumentHolder(),
getWorkbenchContextHolder()
);
unnamedOutPane = new ParameterOutArgumentPane(
buildUnnamedOutputArgumentHolder(),
getWorkbenchContextHolder()
);
unnamedInOutPane = new ParameterInOutArgumentPane(
buildUnnamedInOutputArgumentHolder(),
getWorkbenchContextHolder()
);
unnamedInOutValuePane = new ValueInOutArgumentPane(
buildUnnamedInOutputArgumentHolder(),
getWorkbenchContextHolder()
);
}
private Transformer buildArgumentTypeTransformer() {
return new Transformer() {
private JComponent emptyPane;
private JComponent emptyPane() {
if (emptyPane == null) {
emptyPane = buildEmptyPanel();
}
return emptyPane;
}
private JComponent namedInPane() {
return namedInPane;
}
private JComponent namedInValuePane() {
return namedInValuePane;
}
private JComponent namedOutPane() {
return namedOutPane;
}
private JComponent namedInOutPane() {
return namedInOutPane;
}
private JComponent namedInOutValue() {
return namedInOutValuePane;
}
private JComponent unnamedInPane() {
return unnamedInPane;
}
private JComponent unnamedInValuePane() {
return unnamedInValuePane;
}
private JComponent unnamedOutPane() {
return unnamedOutPane;
}
private JComponent unnamedInOutPane() {
return unnamedInOutPane;
}
private JComponent unnamedInOutValuePane() {
return unnamedInOutValuePane;
}
public JComponent transform(Object argument) {
if (argument == null) {
return emptyPane();
}
MWAbstractProcedureArgument procedureArg = (MWAbstractProcedureArgument)argument;
if (procedureArg.getPassType().equals(MWAbstractProcedureArgument.VALUE_TYPE)) {
if (procedureArg.isNamedIn()) {
return namedInValuePane();
} else if (procedureArg.isNamedInOut()) {
return namedInOutValue();
} else if (procedureArg.isUnnamedIn()) {
return unnamedInValuePane();
} else if (procedureArg.isUnnamedInOut()) {
return unnamedInOutValuePane();
}
} else {
if (procedureArg.isNamedIn()) {
return namedInPane();
} else if (procedureArg.isNamedOut()) {
return namedOutPane();
} else if (procedureArg.isNamedInOut()) {
return namedInOutPane();
} else if (procedureArg.isUnnamedIn()) {
return unnamedInPane();
} else if (procedureArg.isUnnamedOut()) {
return unnamedOutPane();
} else if (procedureArg.isUnnamedInOut()) {
return unnamedInOutPane();
}
}
return emptyPane();
}
};
}
private PropertyValueModel buildNamedInArgumentHolder() {
return new TransformationPropertyValueModel(this.selectedArgumentHolder) {
@Override
protected Object transform(Object value) {
return (value instanceof MWProcedureNamedInArgument) ? (MWProcedureNamedInArgument) value : null;
}
};
}
private PropertyValueModel buildNamedOutArgumentHolder() {
return new TransformationPropertyValueModel(this.selectedArgumentHolder) {
@Override
protected Object transform(Object value) {
return (value instanceof MWProcedureNamedOutputArgument) ? (MWProcedureNamedOutputArgument) value : null;
}
};
}
private PropertyValueModel buildNamedInOutArgumentHolder() {
return new TransformationPropertyValueModel(this.selectedArgumentHolder) {
@Override
protected Object transform(Object value) {
return (value instanceof MWProcedureNamedInOutputArgument) ? (MWProcedureNamedInOutputArgument) value : null;
}
};
}
private PropertyValueModel buildUnnamedInArgumentHolder() {
return new TransformationPropertyValueModel(this.selectedArgumentHolder) {
@Override
protected Object transform(Object value) {
return (value instanceof MWProcedureUnamedInArgument) ? (MWProcedureUnamedInArgument) value : null;
}
};
}
private PropertyValueModel buildUnnamedOutputArgumentHolder() {
return new TransformationPropertyValueModel(this.selectedArgumentHolder) {
@Override
protected Object transform(Object value) {
return (value instanceof MWProcedureUnamedOutputArgument) ? (MWProcedureUnamedOutputArgument) value : null;
}
};
}
private PropertyValueModel buildUnnamedInOutputArgumentHolder() {
return new TransformationPropertyValueModel(this.selectedArgumentHolder) {
@Override
protected Object transform(Object value) {
return (value instanceof MWProcedureUnamedInOutputArgument) ? (MWProcedureUnamedInOutputArgument) value : null;
}
};
}
protected JComponent buildEmptyPanel()
{
JPanel container = new JPanel();
container.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, new Color(204, 204, 204)));
container.setOpaque(false);
return container;
}
protected final Document buildArgumentTypeDocument(PropertyValueModel argumentHolder)
{
return new DocumentAdapter(buildArgumentTypeHolder(argumentHolder));
}
private PropertyValueModel buildArgumentTypeHolder(PropertyValueModel argumentHolder)
{
return new TransformationPropertyValueModel(argumentHolder)
{
@Override
protected String transform(Object argument)
{
if ((argument == null) || (subject() == null))
{
return resourceRepository().getString("ARGUMENT_NONE_SELECTED");
}
if (((MWAbstractProcedureArgument)argument).isNamedIn())
{
return resourceRepository().getString("ARGUMENT_NAMED_IN");
}
if (((MWAbstractProcedureArgument)argument).isNamedOut())
{
return resourceRepository().getString("ARGUMENT_NAMED_OUT");
}
if (((MWAbstractProcedureArgument)argument).isNamedInOut())
{
return resourceRepository().getString("ARGUMENT_NAMED_IN_OUT");
}
if (((MWAbstractProcedureArgument)argument).isUnnamedIn())
{
return resourceRepository().getString("ARGUMENT_UNNAMED_IN");
}
if (((MWAbstractProcedureArgument)argument).isUnnamedOut())
{
return resourceRepository().getString("ARGUMENT_UNNAMED_OUT");
}
else
{
return resourceRepository().getString("ARGUMENT_UNNAMED_IN_OUT");
}
}
};
}
private CheckBoxModelAdapter buildUnnamedOuputCursorCheckboxModel() {
this.useUnnamedOutputCursorHolder = buildUnnamedOutputCursorCheckboxModel();
return new CheckBoxModelAdapter(this.useUnnamedOutputCursorHolder);
}
private PropertyValueModel buildUnnamedOutputCursorCheckboxModel() {
return new PropertyAspectAdapter(getSubjectHolder(), MWProcedure.USE_UNAMED_CURSOR_OUTPUT) {
@Override
protected Object getValueFromSubject() {
return ((MWProcedure)subject).getUseUnamedCursorOutput();
}
@Override
protected void setValueOnSubject(Object value) {
((MWProcedure)subject).setUseUnamedCursorOutput((Boolean)value);
}
};
}
private PropertyValueModel buildReverseHolder(PropertyValueModel holder) {
return new TransformationPropertyValueModel(holder) {
@Override
protected Object transform(Object value) {
if (value == null) {
return null;
}
if (((Boolean)value).booleanValue()) {
return Boolean.FALSE;
} else {
return Boolean.TRUE;
}
}
};
}
private DocumentAdapter buildOutputCursorNameDocument() {
return new DocumentAdapter(buildOutputCursorNameModel());
}
private PropertyValueModel buildOutputCursorNameModel() {
return new PropertyAspectAdapter(getSubjectHolder(), MWProcedure.CURSOR_OUTPUT_NAME) {
@Override
protected Object getValueFromSubject() {
return ((MWProcedure)subject).getCursorOutputName();
}
@Override
protected void setValueOnSubject(Object value) {
((MWProcedure)subject).setCursorOutputName((String)value);
}
};
}
private void selectNewArgument(final AddRemoveTablePanel tablePane,
final ObjectListSelectionModel listSelectionModel,
final MWAbstractProcedureArgument argument,
final int count)
{
listSelectionModel.setSelectedValue(argument);
// int rowIndex = count - 1;
// tablePane.startEditing(rowIndex, 1);
}
}