/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.mappingsplugin.ui.query.relational; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Collection; import java.util.ListIterator; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.ListCellRenderer; 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.mappingsmodel.meta.MWClass; import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWAbstractQuery; import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWQuery; import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWQueryParameter; import org.eclipse.persistence.tools.workbench.mappingsmodel.query.relational.MWQueryParameterArgument; import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.query.QueryParameterDialog; import org.eclipse.persistence.tools.workbench.uitools.app.FilteringPropertyValueModel; 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.swing.ComboBoxModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.cell.SimpleListCellRenderer; import org.eclipse.persistence.tools.workbench.utility.NameTools; /** * This panel is used on the ExpressionBuilderDialog SecondArgumentPanel * If the user chooses to create a parameter argument for their expression, this panel is shown. * They must then select a query parameter from the combo box */ final class ParameterArgumentPanel extends ArgumentPanel { private PropertyValueModel queryArgumentHolder; ParameterArgumentPanel(PropertyValueModel argumentHolder, WorkbenchContextHolder contextHolder, Collection enablingComponents) { super(argumentHolder, contextHolder); initialize(enablingComponents); } private void initialize(Collection enablingComponents) { setLayout(new GridBagLayout()); GridBagConstraints constraints = new GridBagConstraints(); JComboBox parameterComboBox = buildParameterComboBox(); constraints.gridx = 0; constraints.gridy = 0; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 1; constraints.weighty = 1; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.anchor = GridBagConstraints.FIRST_LINE_START; constraints.insets = new Insets(5, 5, 5, 5); add(parameterComboBox, constraints); enablingComponents.add(parameterComboBox); JButton addButton = buildButton("ADD_PARAMETER_BUTTON"); addButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { addParameter(); } }); constraints.gridx = 1; constraints.gridy = 0; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 0; constraints.weighty = 1; constraints.fill = GridBagConstraints.NONE; constraints.anchor = GridBagConstraints.FIRST_LINE_START; constraints.insets = new Insets(5, 5, 5, 5); add(addButton, constraints); } private void addParameter() { MWQuery query = (MWQuery) getQueryHolder().getValue(); String newName = NameTools.uniqueNameFor(MWQuery.PARAMETER_NAME_PREFIX, query.parameterNames()); QueryParameterDialog dialog = new QueryParameterDialog(query, query.typeFor(String.class), newName, (AbstractDialog) getWorkbenchContext().getCurrentWindow(), getWorkbenchContext(), resourceRepository().getString("QUERY_PARAMETER_DIALOG.title")); dialog.show(); if (dialog.wasConfirmed()) { MWClass type = dialog.getParameterType(); String name = dialog.getParameterName(); MWQueryParameter parameter = query.addParameter(type); parameter.setName(name); ((MWQueryParameterArgument) this.getArgumentHolder().getValue()).setQueryParameter(parameter); } } // *********** parameters ************ private JComboBox buildParameterComboBox() { JComboBox comboBox = new JComboBox(new ComboBoxModelAdapter(buildParametersCollectionHolder(), buildParameterHolder())); comboBox.setRenderer(buildParametersListCellRenderer()); return comboBox; } private ListValueModel buildParametersCollectionHolder() { return new ListAspectAdapter(getQueryHolder(), MWAbstractQuery.PARAMETERS_LIST) { protected ListIterator getValueFromSubject() { return ((MWAbstractQuery) subject).parameters(); } protected int sizeFromSubject() { return ((MWAbstractQuery) subject).parametersSize(); } }; } private PropertyValueModel buildParameterHolder() { return new PropertyAspectAdapter(getArgumentHolder(), MWQueryParameterArgument.QUERY_PARAMETER_PROPERTY) { protected Object getValueFromSubject() { return ((MWQueryParameterArgument) subject).getQueryParameter(); } protected void setValueOnSubject(Object value) { ((MWQueryParameterArgument) subject).setQueryParameter((MWQueryParameter) value); } }; } protected PropertyValueModel buildQueryArgumentHolder(PropertyValueModel argumentHolder) { return new FilteringPropertyValueModel(argumentHolder) { protected boolean accept(Object value) { return value instanceof MWQueryParameterArgument; } }; } private ListCellRenderer buildParametersListCellRenderer() { return new SimpleListCellRenderer() { protected String buildText(Object value) { // need null check for combo-box return value == null ? resourceRepository().getString("NONE_SELECTED") : ((MWQueryParameter) value).getName(); } }; } }