/*******************************************************************************
* 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.relational;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.ListCellRenderer;
import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContextHolder;
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.AbstractSubjectPanel;
import org.eclipse.persistence.tools.workbench.mappingsmodel.MWModel;
import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWReference;
import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWTable;
import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.relational.MWTableReferenceMapping;
import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.common.cell.ReferenceCellRendererAdapter;
import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.db.ColumnPairsPanel;
import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.db.NewTableReferenceDialog;
import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.project.relational.RelationalProjectNode;
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.cell.AdaptableListCellRenderer;
import org.eclipse.persistence.tools.workbench.uitools.chooser.ListChooser;
import org.eclipse.persistence.tools.workbench.uitools.chooser.NodeSelector;
import org.eclipse.persistence.tools.workbench.uitools.swing.CachingComboBoxModel;
import org.eclipse.persistence.tools.workbench.uitools.swing.ExtendedComboBoxModel;
import org.eclipse.persistence.tools.workbench.uitools.swing.IndirectComboBoxModel;
import org.eclipse.persistence.tools.workbench.utility.CollectionTools;
import org.eclipse.persistence.tools.workbench.utility.string.StringConverter;
abstract class AbstractTableReferencePanel
extends AbstractSubjectPanel
{
AbstractTableReferencePanel(PropertyValueModel subjectHolder, WorkbenchContextHolder contextHolder) {
super(subjectHolder, contextHolder);
}
private ActionListener buildCreateNewReferenceAction() {
return new ActionListener() {
public void actionPerformed(ActionEvent e) {
AbstractTableReferencePanel.this.createNewReference();
}
};
}
protected ColumnPairsPanel buildColumnPairsPanel() {
return new ColumnPairsPanel(this.getWorkbenchContextHolder(), this.buildTableReferenceHolder());
}
private ListChooser buildTableReferenceChooser() {
ListChooser listChooser =
new DefaultListChooser(
this.buildExtendedTableReferenceComboBoxModel(),
this.getWorkbenchContextHolder(),
this.buildTableReferenceNodeSelector(),
this.buildTableReferenceChooserDialogBuilder()
);
listChooser.setRenderer(buildReferenceListRenderer());
return listChooser;
}
protected CachingComboBoxModel buildExtendedTableReferenceComboBoxModel() {
return new ExtendedComboBoxModel(
new IndirectComboBoxModel(this.buildTableReferenceHolder(), this.getSubjectHolder()) {
protected ListIterator listValueFromSubject(Object subject) {
return AbstractTableReferencePanel.this.orderedReferenceChoices((MWTableReferenceMapping) subject);
}
}
);
}
protected ListIterator orderedReferenceChoices(MWTableReferenceMapping mapping) {
return CollectionTools.sort(this.candidateReferences(mapping)).listIterator();
}
/**
* return a list of the candidate references for the specified mapping;
* this need not be a ValueModel because it is used in an
* IndirectComboBoxModel, which rebuilds the drop-down list *every* time
*/
protected Iterator candidateReferences(MWTableReferenceMapping mapping) {
return mapping.candidateReferences();
}
private DefaultListChooserDialog.Builder buildTableReferenceChooserDialogBuilder() {
DefaultListChooserDialog.Builder builder = new DefaultListChooserDialog.Builder();
builder.setTitleKey("TABLE_REFERENCE_LIST_BROWSER_DIALOG.title");
builder.setListBoxLabelKey("TABLE_REFERENCE_LIST_BROWSER_DIALOG.listLabel");
builder.setStringConverter(buildTableReferenceStringConverter());
return builder;
}
private ListCellRenderer buildReferenceListRenderer() {
return new AdaptableListCellRenderer(new ReferenceCellRendererAdapter(resourceRepository()));
}
private StringConverter buildTableReferenceStringConverter() {
return new StringConverter() {
public String convertToString(Object o) {
return o == null ? "" : ((MWReference) o).getName();
}
};
}
protected PropertyValueModel buildTableReferenceHolder() {
return new PropertyAspectAdapter(this.getSubjectHolder(), MWTableReferenceMapping.REFERENCE_PROPERTY) {
protected Object getValueFromSubject() {
return ((MWTableReferenceMapping) this.subject).getReference();
}
protected void setValueOnSubject(Object value) {
((MWTableReferenceMapping) this.subject).setReference((MWReference) value);
}
};
}
private NodeSelector buildTableReferenceNodeSelector() {
return new NodeSelector() {
public void selectNodeFor(Object item) {
RelationalProjectNode projectNode = (RelationalProjectNode) navigatorSelectionModel().getSelectedProjectNodes()[0];
projectNode.selectReference((MWReference) item, getWorkbenchContext());
}
};
}
protected void initializeLayout() {
GridBagConstraints constraints = new GridBagConstraints();
// Table Reference chooser
ListChooser tableReferenceChooser = this.buildTableReferenceChooser();
// New Reference button
JButton newReferenceButton = this.buildButton("TABLE_REFERENCE_NEW_BUTTON");
newReferenceButton.addActionListener(this.buildCreateNewReferenceAction());
// Table Reference widgets
JComponent tableReferenceWidgets =
this.buildLabeledComponent(
"TABLE_REFERENCE_CHOOSER",
tableReferenceChooser,
newReferenceButton
);
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.CENTER;
constraints.insets = new Insets(0, 0, 0, 0);
this.add(tableReferenceWidgets, constraints);
// Field Association
ColumnPairsPanel columnPairsPanel = this.buildColumnPairsPanel();
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.CENTER;
constraints.insets = new Insets(5, 0, 0, 0);
this.add(columnPairsPanel, constraints);
this.addPaneForAlignment(columnPairsPanel);
JButton button = new JButton("Test");
int height = button.getPreferredSize().height * 4 + 20;
columnPairsPanel.setPreferredSize(new Dimension(1, height));
this.addHelpTopicId(this, "mapping.tableReference");
}
// ********** build new reference dialog **********
void createNewReference() {
NewTableReferenceDialog dialog = NewTableReferenceDialog.buildReferenceDialogAllowSourceAndTargetSelection(
this.getWorkbenchContext(),
this.candidateNewReferenceSourceTables(),
this.candidateNewReferenceTargetTables()
);
dialog.setSourceTable(this.defaultNewReferenceSourceTable());
dialog.setTargetTable(this.defaultNewReferenceTargetTable());
dialog.show();
if (dialog.wasCanceled()) {
return;
}
MWTable sourceTable = dialog.getSourceTable();
MWReference reference = sourceTable.addReference(dialog.getReferenceName(), dialog.getTargetTable());
reference.setOnDatabase(dialog.isOnDatabase());
this.setReference(reference);
}
/**
* Return the list of tables from which a new reference's source
* table can be chosen (in the NewTableReferenceDialog).
*/
protected List candidateNewReferenceSourceTables() {
return this.allTables();
}
/**
* Return the default source table for building a new reference
* (so it can be pre-selected in the NewTableReferenceDialog).
*/
protected abstract MWTable defaultNewReferenceSourceTable();
/**
* Return the list of tables from which a new reference's target
* table can be chosen (in the NewTableReferenceDialog).
*/
protected List candidateNewReferenceTargetTables() {
return this.allTables();
}
/**
* Return the default target table for building a new reference
* (so it can be pre-selected in the NewTableReferenceDialog).
*/
protected abstract MWTable defaultNewReferenceTargetTable();
protected void setReference(MWReference reference) {
((MWTableReferenceMapping) this.subject()).setReference(reference);
}
protected List allTables() {
return CollectionTools.sort(((MWModel) this.subject()).getDatabase().tables());
}
}