/*******************************************************************************
* 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.mapping.xml;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Iterator;
import java.util.ListIterator;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
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.resources.ResourceRepository;
import org.eclipse.persistence.tools.workbench.framework.ui.view.AbstractSubjectPanel;
import org.eclipse.persistence.tools.workbench.framework.uitools.SwingComponentFactory;
import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.xml.MWEisReferenceMapping;
import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.xml.MWXmlFieldPair;
import org.eclipse.persistence.tools.workbench.mappingsmodel.xml.MWXmlField;
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.ValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.swing.ColumnAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.swing.ListModelAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.swing.ObjectListSelectionModel;
import org.eclipse.persistence.tools.workbench.uitools.app.swing.TableModelAdapter;
import org.eclipse.persistence.tools.workbench.uitools.cell.SimpleTableCellRenderer;
import org.eclipse.persistence.tools.workbench.utility.CollectionTools;
final class EisReferenceMappingFieldPairsPanel
extends AbstractSubjectPanel
{
// **************** Variables *********************************************
private ObjectListSelectionModel fieldPairsSelectionModel;
// **************** Constructors ******************************************
EisReferenceMappingFieldPairsPanel(ValueModel subjectHolder, WorkbenchContextHolder context) {
super(subjectHolder, context);
addHelpTopicId(this, "mapping.eis.fieldPairs");
}
// **************** Initialization ****************************************
protected void initializeLayout() {
GridBagConstraints constraints = new GridBagConstraints();
// Field pairs table
JComponent tablePanel = this.buildFieldPairsTablePanel();
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 1;
constraints.weighty = 1;
constraints.fill = GridBagConstraints.BOTH;
constraints.anchor = GridBagConstraints.CENTER;
constraints.insets = new Insets(0, 0, 0, 0);
this.add(tablePanel, constraints);
// Button panel
JPanel buttonPanel = this.buildButtonPanel();
constraints.gridx = 1;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 0;
constraints.weighty = 0;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.anchor = GridBagConstraints.PAGE_START;
constraints.insets = new Insets(0, 5, 0, 0);
this.add(buttonPanel, constraints);
}
// **************** Field pairs table *************************************
private JComponent buildFieldPairsTablePanel() {
JTable table = this.buildFieldPairsTable();
JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.getViewport().setBackground(table.getBackground());
scrollPane.getViewport().setMinimumSize(new Dimension(10, 10));
scrollPane.getViewport().setPreferredSize(new Dimension(10, 10));
return scrollPane;
}
private JTable buildFieldPairsTable() {
ListValueModel listValue = this.buildFieldPairsValue();
TableModel tableModel = this.buildFieldPairsTableModel(listValue);
this.fieldPairsSelectionModel = this.buildFieldPairSelectionModel(listValue);
JTable table = SwingComponentFactory.buildTable(tableModel, this.fieldPairsSelectionModel);
TableColumn column;
// source field column
column = table.getColumnModel().getColumn(FieldPairsTableColumnAdapter.SOURCE_XPATH_COLUMN);
column.setCellRenderer(this.buildXpathColumnCellRenderer());
// target field column
column = table.getColumnModel().getColumn(FieldPairsTableColumnAdapter.TARGET_XPATH_COLUMN);
column.setCellRenderer(this.buildXpathColumnCellRenderer());
this.addPropertyChangeListener("enabled" /* stupid hard-coded property name */, this.buildTableEnabler(table));
return table;
}
private ListValueModel buildFieldPairsValue() {
return new ListAspectAdapter(this.getSubjectHolder(), MWEisReferenceMapping.XML_FIELD_PAIRS_LIST) {
public Object getItem(int index) {
return ((MWEisReferenceMapping) this.subject).xmlFieldPairAt(index);
}
protected ListIterator getValueFromSubject() {
return ((MWEisReferenceMapping) subject).xmlFieldPairs();
}
};
}
private TableModel buildFieldPairsTableModel(ListValueModel fieldPairsValue) {
return new TableModelAdapter(fieldPairsValue, this. buildFieldPairsTableColumnAdapter());
}
private ColumnAdapter buildFieldPairsTableColumnAdapter() {
return new FieldPairsTableColumnAdapter(this.resourceRepository());
}
private ObjectListSelectionModel buildFieldPairSelectionModel(ListValueModel fieldPairsValue) {
ObjectListSelectionModel selectionModel = new ObjectListSelectionModel(new ListModelAdapter(fieldPairsValue));
selectionModel.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
return selectionModel;
}
private TableCellRenderer buildXpathColumnCellRenderer() {
return new SimpleTableCellRenderer() {
protected String buildText(Object value) {
if ("".equals(value)) {
return EisReferenceMappingFieldPairsPanel.this.resourceRepository().getString("NONE_SELECTED");
}
else {
return (String) value;
}
}
};
}
/** Sets the table enabled/disabled based on this panels enabled/disabled state */
private PropertyChangeListener buildTableEnabler(final JTable table) {
return new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
table.setEnabled(((Boolean) evt.getNewValue()).booleanValue());
}
};
}
private JPanel buildButtonPanel() {
JPanel buttonPanel = new JPanel(new GridLayout(3, 1, 0, 5));
// Add button
JButton addButton = this.buildAddFieldPairButton();
buttonPanel.add(addButton);
addAlignRight(addButton);
// Edit button
JButton editButton = this.buildEditFieldPairButton();
buttonPanel.add(editButton);
addAlignRight(editButton);
// Remove button
JButton removeButton = this.buildRemoveFieldPairsButton();
buttonPanel.add(removeButton);
addAlignRight(removeButton);
return buttonPanel;
}
private JButton buildAddFieldPairButton() {
JButton addButton = this.buildButton("FIELD_PAIR_ADD_BUTTON");
addButton.addActionListener(this.buildAddFieldPairAction());
this.addPropertyChangeListener("enabled" /* stupid hard-coded property name */, this.buildAddButtonEnabler(addButton));
return addButton;
}
private ActionListener buildAddFieldPairAction() {
return new ActionListener() {
public void actionPerformed(ActionEvent e) {
MWEisReferenceMapping eisReferenceMapping =
(MWEisReferenceMapping) EisReferenceMappingFieldPairsPanel.this.getSubjectHolder().getValue();
WorkbenchContext context =
EisReferenceMappingFieldPairsPanel.this.getWorkbenchContext();
EisReferenceMappingFieldPairEditingDialog.promptToAddFieldPair(eisReferenceMapping, context);
}
};
}
/** Sets the addButton enabled/disabled based on this panels enabled/disabled state */
private PropertyChangeListener buildAddButtonEnabler(final JButton button) {
return new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
button.setEnabled(((Boolean) evt.getNewValue()).booleanValue());
}
};
}
private JButton buildEditFieldPairButton() {
JButton editButton = this.buildButton("FIELD_PAIR_EDIT_BUTTON");
editButton.addActionListener(this.buildEditActionListener());
editButton.setEnabled(false);
this.buildEditFieldPairButtonEnabler(editButton);
return editButton;
}
private ActionListener buildEditActionListener() {
return new ActionListener() {
public void actionPerformed(ActionEvent e) {
MWXmlFieldPair fieldPair =
(MWXmlFieldPair) EisReferenceMappingFieldPairsPanel.this.fieldPairsSelectionModel.getSelectedValue();
WorkbenchContext context =
EisReferenceMappingFieldPairsPanel.this.getWorkbenchContext();
EisReferenceMappingFieldPairEditingDialog.promptToEditFieldPair(fieldPair, context);
}
};
}
private void buildEditFieldPairButtonEnabler(final JButton editButton) {
this.fieldPairsSelectionModel.addListSelectionListener(
new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if ( ! e.getValueIsAdjusting()) {
editButton.setEnabled(EisReferenceMappingFieldPairsPanel.this.fieldPairsSelectionModel.getSelectedValues().length == 1);
}
}
}
);
}
private JButton buildRemoveFieldPairsButton() {
JButton removeButton = this.buildButton("FIELD_PAIR_REMOVE_BUTTON");
removeButton.addActionListener(buildRemoveFieldPairsActionListener());
removeButton.setEnabled(false);
this.buildRemoveFieldPairsButtonEnabler(removeButton);
return removeButton;
}
private ActionListener buildRemoveFieldPairsActionListener() {
return new ActionListener() {
public void actionPerformed(ActionEvent e) {
EisReferenceMappingFieldPairsPanel.this.removeSelectedFieldPairs();
}
};
}
private void removeSelectedFieldPairs() {
for (Iterator stream = CollectionTools.iterator(this.fieldPairsSelectionModel.getSelectedValues()); stream.hasNext(); ) {
((MWEisReferenceMapping) this.subject()).removeXmlFieldPair((MWXmlFieldPair) stream.next());
}
}
private void buildRemoveFieldPairsButtonEnabler(final JButton removeButton) {
this.fieldPairsSelectionModel.addListSelectionListener(
new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if ( ! e.getValueIsAdjusting()) {
removeButton.setEnabled(! EisReferenceMappingFieldPairsPanel.this.fieldPairsSelectionModel.isSelectionEmpty());
}
}
}
);
}
// **************** Member classes ****************************************
private static class FieldPairsTableColumnAdapter
implements ColumnAdapter
{
private ResourceRepository resourceRepository;
public static final int COLUMN_COUNT = 2;
public static final int SOURCE_XPATH_COLUMN = 0;
public static final int TARGET_XPATH_COLUMN = 1;
public int getColumnCount() {
return COLUMN_COUNT;
}
FieldPairsTableColumnAdapter(ResourceRepository resourceRepository) {
super();
this.resourceRepository = resourceRepository;
}
public String getColumnName(int index) {
switch (index) {
case SOURCE_XPATH_COLUMN:
return this.resourceRepository.getString("FIELD_PAIR_SOURCE_FIELD_COLUMN");
case TARGET_XPATH_COLUMN:
return this.resourceRepository.getString("FIELD_PAIR_TARGET_FIELD_COLUMN");
}
return "";
}
public Class getColumnClass(int index) {
return String.class;
}
public boolean isColumnEditable(int index) {
return false;
}
public PropertyValueModel[] cellModels(Object subject) {
MWXmlFieldPair fieldPair = (MWXmlFieldPair) subject;
PropertyValueModel[] result = new PropertyValueModel[COLUMN_COUNT];
result[SOURCE_XPATH_COLUMN] = this.buildXpathAdapter(fieldPair.getSourceXmlField());
result[TARGET_XPATH_COLUMN] = this.buildXpathAdapter(fieldPair.getTargetXmlField());
return result;
}
private PropertyValueModel buildXpathAdapter(MWXmlField xmlField) {
return new PropertyAspectAdapter(MWXmlField.XPATH_PROPERTY, xmlField) {
protected Object getValueFromSubject() {
return ((MWXmlField) this.subject).getXpath();
}
};
}
}
}