/*******************************************************************************
* 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;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Iterator;
import javax.swing.BorderFactory;
import javax.swing.ButtonModel;
import javax.swing.ComboBoxModel;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.ListCellRenderer;
import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContextHolder;
import org.eclipse.persistence.tools.workbench.framework.ui.chooser.ClassChooserPanel;
import org.eclipse.persistence.tools.workbench.framework.ui.chooser.DefaultListChooser;
import org.eclipse.persistence.tools.workbench.framework.ui.chooser.DefaultListChooserDialog;
import org.eclipse.persistence.tools.workbench.framework.ui.view.AbstractPanel;
import org.eclipse.persistence.tools.workbench.framework.uitools.AccessibleTitledBorder;
import org.eclipse.persistence.tools.workbench.framework.uitools.AccessibleTitledPanel;
import org.eclipse.persistence.tools.workbench.framework.uitools.Spacer;
import org.eclipse.persistence.tools.workbench.framework.uitools.SwingTools;
import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWClass;
import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWClassRepository;
import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWMethod;
import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.common.cell.MethodCellRendererAdapter;
import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.meta.ClassChooserTools;
import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.meta.ClassRepositoryHolder;
import org.eclipse.persistence.tools.workbench.uitools.app.ListValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.PropertyValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.ReadOnlyCollectionValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.SortedListValueModelAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.swing.ComboBoxModelAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.swing.RadioButtonModelAdapter;
import org.eclipse.persistence.tools.workbench.uitools.cell.AdaptableListCellRenderer;
import org.eclipse.persistence.tools.workbench.uitools.chooser.ListChooser;
import org.eclipse.persistence.tools.workbench.utility.CollectionTools;
import org.eclipse.persistence.tools.workbench.utility.string.StringConverter;
public final class TransformerEditingPanel
extends AbstractPanel
{
// **************** Variables *********************************************
/** Used to govern how the transformer is created */
private TransformerSpec transformerSpec;
// **************** Constructors ******************************************
public TransformerEditingPanel(TransformerSpec transformerSpec, WorkbenchContextHolder contextHolder) {
super(contextHolder);
this.transformerSpec = transformerSpec;
this.initializeLayout();
}
// **************** Initialization ****************************************
private void initializeLayout() {
this.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
GridBagConstraints constraints = new GridBagConstraints();
// method radio button
JRadioButton methodButton = this.buildMethodButton();
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 0;
constraints.weighty = 0;
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.LINE_START;
constraints.insets = new Insets(0, 0, 0, 0);
this.add(methodButton, constraints);
// method chooser
JPanel methodChooserPanel = this.buildMethodChooserPanel();
methodChooserPanel.setBorder(new AccessibleTitledBorder(methodButton.getText()));
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.CENTER;
constraints.insets = new Insets(5, SwingTools.checkBoxIconWidth(), 0, 0);
this.add(methodChooserPanel, constraints);
// class radio button
JRadioButton classButton = this.buildClassButton();
constraints.gridx = 0;
constraints.gridy = 2;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 0;
constraints.weighty = 0;
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.LINE_START;
constraints.insets = new Insets(10, 0, 0, 0);
this.add(classButton, constraints);
// class chooser
JPanel classChooser = this.buildClassChooserPanel();
classChooser.setBorder(new AccessibleTitledBorder(classButton.getText()));
constraints.gridx = 0;
constraints.gridy = 3;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 1;
constraints.weighty = 1;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.anchor = GridBagConstraints.PAGE_START;
constraints.insets = new Insets(5, SwingTools.checkBoxIconWidth(), 0, 0);
this.add(classChooser, constraints);
}
private JRadioButton buildMethodButton() {
JRadioButton button = new JRadioButton();
button.setModel(this.buildMethodButtonModel());
button.setText(this.resourceRepository().getString("TRANSFORMER_PANEL_METHOD_BUTTON"));
button.setMnemonic(this.resourceRepository().getMnemonic("TRANSFORMER_PANEL_METHOD_BUTTON"));
return button;
}
private ButtonModel buildMethodButtonModel() {
return new RadioButtonModelAdapter(this.transformerSpec.transformerTypeHolder(), TransformerSpec.TRANSFORMATION_METHOD);
}
private JPanel buildMethodChooserPanel() {
JPanel panel = new JPanel(new BorderLayout(5, 0));
JLabel methodLabel = this.buildMethodChooserLabel();
panel.add(methodLabel, BorderLayout.LINE_START);
addAlignLeft(methodLabel);
ListChooser methodChooser = this.buildMethodChooser();
methodLabel.setLabelFor(methodChooser);
panel.add(methodChooser, BorderLayout.CENTER);
Spacer spacer = new Spacer();
panel.add(spacer, BorderLayout.LINE_END);
addAlignRight(spacer);
return panel;
}
private JLabel buildMethodChooserLabel() {
JLabel label = buildLabel("TRANSFORMER_PANEL_METHOD_CHOOSER");
this.transformerSpec.transformerTypeHolder().addPropertyChangeListener(
PropertyValueModel.VALUE,
this.buildComponentEnablingListener(label, TransformerSpec.TRANSFORMATION_METHOD)
);
label.setEnabled(this.transformerSpec.transformerTypeHolder().getValue() == TransformerSpec.TRANSFORMATION_METHOD);
return label;
}
private ListChooser buildMethodChooser() {
ListChooser chooser = new DefaultListChooser(
this.buildMethodChooserModel(),
this.getWorkbenchContextHolder(),
this.buildMethodChooserDialogBuilder()
);
chooser.setRenderer(this.buildMethodRenderer());
this.transformerSpec.transformerTypeHolder().addPropertyChangeListener(
PropertyValueModel.VALUE,
this.buildComponentEnablingListener(chooser, TransformerSpec.TRANSFORMATION_METHOD)
);
chooser.setEnabled(this.transformerSpec.transformerTypeHolder().getValue() == TransformerSpec.TRANSFORMATION_METHOD);
return chooser;
}
private DefaultListChooserDialog.Builder buildMethodChooserDialogBuilder() {
DefaultListChooserDialog.Builder builder = new DefaultListChooserDialog.Builder();
builder.setStringConverter(buildMWMethodStringConverter());
return builder;
}
private StringConverter buildMWMethodStringConverter() {
return new StringConverter() {
public String convertToString(Object o) {
return o == null ? "" : ((MWMethod) o).shortSignatureWithReturnType();
}
};
}
private ComboBoxModel buildMethodChooserModel() {
return new ComboBoxModelAdapter(this.buildMethodChoicesValue(), this.transformerSpec.transformationMethodHolder());
}
private ListValueModel buildMethodChoicesValue() {
return new SortedListValueModelAdapter(
new ReadOnlyCollectionValueModel(
CollectionTools.collection(this.transformerSpec.candidateTransformationMethods())
)
);
}
private ListCellRenderer buildMethodRenderer() {
return new AdaptableListCellRenderer(
new MethodCellRendererAdapter(this.resourceRepository()) {
protected Icon buildNonNullValueIcon(Object value) {
return null;
}
}
);
}
private JRadioButton buildClassButton() {
JRadioButton button = new JRadioButton();
button.setModel(this.buildClassButtonModel());
button.setText(this.resourceRepository().getString("TRANSFORMER_PANEL_CLASS_BUTTON"));
button.setMnemonic(this.resourceRepository().getMnemonic("TRANSFORMER_PANEL_CLASS_BUTTON"));
return button;
}
private ButtonModel buildClassButtonModel() {
return new RadioButtonModelAdapter(this.transformerSpec.transformerTypeHolder(), TransformerSpec.TRANSFORMER_CLASS);
}
private JPanel buildClassChooserPanel() {
JPanel panel = new AccessibleTitledPanel(new BorderLayout(5, 0));
JLabel label = this.buildClassChooserLabel();
panel.add(label, BorderLayout.LINE_START);
addAlignLeft(label);
ClassChooserPanel chooser = this.buildClassChooserPanel2(label);
panel.add(chooser, BorderLayout.CENTER);
addPaneForAlignment(chooser);
return panel;
}
private JLabel buildClassChooserLabel() {
JLabel label = new JLabel(this.resourceRepository().getString("TRANSFORMER_PANEL_CLASS_CHOOSER"));
label.setDisplayedMnemonic(this.resourceRepository().getMnemonic("TRANSFORMER_PANEL_CLASS_CHOOSER"));
this.transformerSpec.transformerTypeHolder().addPropertyChangeListener(
PropertyValueModel.VALUE,
this.buildComponentEnablingListener(label, TransformerSpec.TRANSFORMER_CLASS)
);
label.setEnabled(this.transformerSpec.transformerTypeHolder().getValue() == TransformerSpec.TRANSFORMER_CLASS);
return label;
}
private ClassChooserPanel buildClassChooserPanel2(JLabel label) {
ClassChooserPanel chooserPanel = ClassChooserTools.buildPanel(
this.transformerSpec.transformerClassHolder(),
this.buildClassRepositoryHolder(),
ClassChooserTools.buildDeclarableNonVoidFilter(),
label,
this.getWorkbenchContextHolder()
);
this.transformerSpec.transformerTypeHolder().addPropertyChangeListener(
PropertyValueModel.VALUE,
this.buildComponentEnablingListener(chooserPanel, TransformerSpec.TRANSFORMER_CLASS)
);
chooserPanel.setEnabled(this.transformerSpec.transformerTypeHolder().getValue() == TransformerSpec.TRANSFORMER_CLASS);
return chooserPanel;
}
private ClassRepositoryHolder buildClassRepositoryHolder() {
return new ClassRepositoryHolder() {
public MWClassRepository getClassRepository() {
return TransformerEditingPanel.this.transformerSpec.classRepository();
}
};
}
private PropertyChangeListener buildComponentEnablingListener(final Component component, final String enabledValue) {
return new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
component.setEnabled(evt.getNewValue() == enabledValue);
}
};
}
// **************** Member classes ****************************************
public static interface TransformerSpec
{
/** Should return an unchanging holder (only the value may change) */
PropertyValueModel transformerTypeHolder();
/** The value of the above holder */
String transformerType();
// the allowable transformer types
public final static String TRANSFORMATION_METHOD = "transformationMethod";
public final static String TRANSFORMER_CLASS = "transformerClass";
// this one is only used to be changed *from*
// i.e. it is an absence of the other two
public final static String NULL_TRANSFORMER = "nullTransformer";
/** Should return an unchanging holder (only the value may change) */
PropertyValueModel transformationMethodHolder();
/** The value of the above holder */
MWMethod transformationMethod();
/** The methods that may be chosen for this transformer */
Iterator candidateTransformationMethods();
/** Return whether the method signature is valid for a transformation method */
boolean transformationMethodIsValid();
/** Should return an unchanging holder (only the value may change) */
PropertyValueModel transformerClassHolder();
/** The value of the above holder */
MWClass transformerClass();
/** The class repository from which transformer classes may be chosen */
MWClassRepository classRepository();
}
}