/******************************************************************************* * 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; import java.awt.GridBagConstraints; import java.awt.GridLayout; import java.awt.Insets; import java.util.ListIterator; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContextHolder; import org.eclipse.persistence.tools.workbench.framework.resources.ResourceRepository; import org.eclipse.persistence.tools.workbench.framework.ui.view.AbstractPanel; import org.eclipse.persistence.tools.workbench.framework.uitools.AddRemovePanel; import org.eclipse.persistence.tools.workbench.framework.uitools.AddRemoveTablePanel; import org.eclipse.persistence.tools.workbench.framework.uitools.AddRemovePanel.UpDownOptionAdapter; 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.uitools.app.ItemPropertyListValueModelAdapter; 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.ValuePropertyPropertyValueModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.swing.ColumnAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.swing.ObjectListSelectionModel; import org.eclipse.persistence.tools.workbench.uitools.cell.SimpleTableCellRenderer; import org.eclipse.persistence.tools.workbench.utility.CollectionTools; import org.eclipse.persistence.tools.workbench.utility.NameTools; /** * This panel is added to the General Panel of the Named Queries property panel * It is used to add and remove parameters from a query */ public final class QueryParametersPanel extends AbstractPanel { private PropertyValueModel queryHolder; private AddRemoveTablePanel paramatersPanel; public QueryParametersPanel(PropertyValueModel queryHolder, WorkbenchContextHolder contextHolder) { super(contextHolder); this.queryHolder = queryHolder; initializeLayout(); } private String helpTopicId() { return "descriptor.queryManager.general.parameters"; } protected void initializeLayout() { GridBagConstraints constraints = new GridBagConstraints(); this.paramatersPanel = this.buildQueryParametersTable(); constraints.gridx = 0; constraints.gridy = 0; constraints.gridwidth = 2; constraints.gridheight = 1; constraints.weightx = 1; constraints.weighty = 1; constraints.fill = GridBagConstraints.BOTH; constraints.anchor = GridBagConstraints.CENTER; constraints.insets = new Insets(0, 5, 5, 5); this.add(this.paramatersPanel, constraints); // Create the button panel JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(1, 2, 5, 0)); // // Create the Add button // this.addParameterButton = new JButton(resourceRepository().getString("ADD_PARAMETER_BUTTON")); // this.addParameterButton.setMnemonic(resourceRepository().getMnemonic("ADD_PARAMETER_BUTTON")); // this.addParameterButton.addActionListener(this.buildAddParameterAction()); // this.addParameterButton.setEnabled(false); // buttonPanel.add(this.addParameterButton); // // // Create the Remove button // this.removeParameterButton = new JButton(resourceRepository().getString("REMOVE_PARAMETER_BUTTON")); // this.removeParameterButton.setMnemonic(resourceRepository().getMnemonic("REMOVE_PARAMETER_BUTTON")); // this.removeParameterButton.addActionListener(this.buildRemoveParameterAction()); // this.removeParameterButton.setEnabled(false); // buttonPanel.add(this.removeParameterButton); // // // Create the Edit button // this.editParameterButton = new JButton(resourceRepository().getString("EDIT_PARAMETER_BUTTON")); // this.editParameterButton.setMnemonic(resourceRepository().getMnemonic("EDIT_PARAMETER_BUTTON")); // this.editParameterButton.addActionListener(this.buildEditParameterAction()); // this.editParameterButton.setEnabled(false); // buttonPanel.add(this.editParameterButton); buttonPanel.setBorder(BorderFactory.createEmptyBorder()); constraints.gridx = 1; constraints.gridy = 1; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 0; constraints.weighty = 0; constraints.fill = GridBagConstraints.NONE; constraints.anchor = GridBagConstraints.LINE_END; constraints.insets = new Insets(5, 5, 5, 5); this.add(buttonPanel, constraints); addHelpTopicId(this, helpTopicId()); } // ************ Parameters ************ private AddRemoveTablePanel buildQueryParametersTable() { AddRemoveTablePanel tablePanel = new AddRemoveTablePanel( getApplicationContext(), buildParametersPanelAdapter(), buildParametersNameAdapter(), buildQueryParametersTableColumnAdapter(), AddRemovePanel.RIGHT) { protected void updateOptionalButton(JButton optionalButton) { boolean paramsSelected = getSelectionModel().getSelectedValuesSize() == 1; updateButton(optionalButton, paramsSelected); } protected void updateRemoveButton(JButton removeButton) { boolean paramsSelected = getSelectionModel().getSelectedValue() != null; updateButton(removeButton, paramsSelected); } protected void updateAddButton(JButton addButton) { } @Override protected String removeButtonKey() { return "REMOVE_PARAMETER_BUTTON"; } @Override protected String addButtonKey() { return "ADD_PARAMETER_BUTTON"; } private void updateButton(JButton button, boolean paramsSelected) { boolean canRemoveParams = true; button.setEnabled(paramsSelected && canRemoveParams); } }; JTable table = (JTable) tablePanel.getComponent(); table.getColumnModel().getColumn(QueryParametersColumnAdapter.TYPE_COLUMN).setCellRenderer(this.buildTypeRenderer()); return tablePanel; } protected TableCellRenderer buildTypeRenderer() { return new SimpleTableCellRenderer() { protected String buildText(Object value) { return value == null ? null : ((MWClass) value).getName(); } }; } private UpDownOptionAdapter buildParametersPanelAdapter() { return new UpDownOptionAdapter() { public void moveItemsDown(Object[] items) { for (int i = 0; i < items.length; i++) { getQuery().moveParameterDown((MWQueryParameter) items[i]); } } public void moveItemsUp(Object[] items) { for (int i = 0; i < items.length; i++) { getQuery().moveParameterUp((MWQueryParameter) items[i]); } } public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) { removeSelectedQueryParameters(listSelectionModel); } public void addNewItem(ObjectListSelectionModel listSelectionModel) { addQueryParameter(); } public void optionOnSelection(ObjectListSelectionModel listSelectionModel) { editSelectedQueryParameter((MWQueryParameter) listSelectionModel.getSelectedValue()); } public boolean enableOptionOnSelectionChange(ObjectListSelectionModel listSelectionModel) { return listSelectionModel.getSelectedValuesSize() == 1; } public String optionalButtonKey() { return "EDIT_PARAMETER_BUTTON"; } }; } // the list will need to be re-sorted if a name changes private ListValueModel buildParametersNameAdapter() { return new ItemPropertyListValueModelAdapter(buildQueryParametersHolder(), MWQueryParameter.NAME_PROPERTY); } private ListValueModel buildQueryParametersHolder() { return new ListAspectAdapter(this.queryHolder, MWQuery.PARAMETERS_LIST) { protected ListIterator getValueFromSubject() { return ((MWAbstractQuery) this.subject).parameters(); } protected int sizeFromSubject() { return ((MWAbstractQuery) this.subject).parametersSize(); } }; } private ColumnAdapter buildQueryParametersTableColumnAdapter() { return new QueryParametersColumnAdapter(resourceRepository()); } protected void removeSelectedQueryParameters(ObjectListSelectionModel model) { getQuery().removeParameters(CollectionTools.iterator(model.getSelectedValues())); } void addQueryParameter() { String newName = NameTools.uniqueNameFor(MWQuery.PARAMETER_NAME_PREFIX, getQuery().parameterNames()); QueryParameterDialog dialog = new QueryParameterDialog(getQuery(), getQuery().typeFor(String.class), newName, getWorkbenchContext(), resourceRepository().getString("QUERY_PARAMETER_DIALOG.title")); dialog.show(); if (dialog.wasConfirmed()) { MWClass type = dialog.getParameterType(); String name = dialog.getParameterName(); MWQueryParameter parameter = getQuery().addParameter(type, name); selectParameter(parameter); } } void editSelectedQueryParameter(MWQueryParameter selectedParameter) { QueryParameterDialog dialog = new QueryParameterDialog( getQuery(), selectedParameter.getType(), selectedParameter.getName(), getWorkbenchContext(), resourceRepository().getString("QUERY_PARAMETER_DIALOG_EDIT.title")); dialog.show(); if (dialog.wasConfirmed()) { selectedParameter.setType(dialog.getParameterType()); selectedParameter.setName(dialog.getParameterName()); } } MWAbstractQuery getQuery() { return (MWAbstractQuery) this.queryHolder.getValue(); } public void selectParameter(MWQueryParameter parameter) { this.paramatersPanel.setSelectedValue(parameter, true); } // ********** classes ********** public static class QueryParametersColumnAdapter implements ColumnAdapter { private ResourceRepository resourceRepository; public static final int COLUMN_COUNT = 2; public static final int TYPE_COLUMN = 0; public static final int NAME_COLUMN = 1; private static final String[] COLUMN_NAME_KEYS = new String[] { "TYPE_COLUMN_HEADER", "NAME_COLUMN_HEADER", }; protected QueryParametersColumnAdapter(ResourceRepository repository) { super(); this.resourceRepository = repository; } public int getColumnCount() { return COLUMN_COUNT; } public String getColumnName(int index) { return this.resourceRepository.getString(COLUMN_NAME_KEYS[index]); } public Class getColumnClass(int index) { switch (index) { case TYPE_COLUMN: return Object.class; case NAME_COLUMN: return String.class; default: return Object.class; } } public boolean isColumnEditable(int index) { return false; } public PropertyValueModel[] cellModels(Object subject) { MWQueryParameter queryParameter = (MWQueryParameter) subject; PropertyValueModel[] result = new PropertyValueModel[COLUMN_COUNT]; result[TYPE_COLUMN] = this.buildTypeAdapter(queryParameter); result[NAME_COLUMN] = this.buildNameAdapter(queryParameter); return result; } private PropertyValueModel buildTypeAdapter(MWQueryParameter queryParameter) { PropertyValueModel adapter = new PropertyAspectAdapter(MWQueryParameter.TYPE_PROPERTY, queryParameter) { protected Object getValueFromSubject() { return ((MWQueryParameter) this.subject).getType(); } protected void setValueOnSubject(Object value) { ((MWQueryParameter) this.subject).setType((MWClass) value); } }; return new ValuePropertyPropertyValueModelAdapter(adapter, MWClass.NAME_PROPERTY); } private PropertyValueModel buildNameAdapter(MWQueryParameter queryParameter) { return new PropertyAspectAdapter(MWQueryParameter.NAME_PROPERTY, queryParameter) { protected Object getValueFromSubject() { return ((MWQueryParameter) this.subject).getName(); } protected void setValueOnSubject(Object value) { ((MWQueryParameter) this.subject).setName((String) value); } }; } } }