/*******************************************************************************
* 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.scplugin.ui.session.login;
// JDK
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ListIterator;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContextHolder;
import org.eclipse.persistence.tools.workbench.framework.ui.dialog.NewNameDialog;
import org.eclipse.persistence.tools.workbench.framework.uitools.AddRemoveListPanel;
import org.eclipse.persistence.tools.workbench.framework.uitools.AddRemovePanel.Adapter;
import org.eclipse.persistence.tools.workbench.platformsmodel.DatabasePlatform;
import org.eclipse.persistence.tools.workbench.platformsmodel.DatabasePlatformRepository;
import org.eclipse.persistence.tools.workbench.scplugin.model.SequenceType;
import org.eclipse.persistence.tools.workbench.scplugin.model.adapter.DatabaseLoginAdapter;
import org.eclipse.persistence.tools.workbench.scplugin.model.adapter.DefaultSequenceAdapter;
import org.eclipse.persistence.tools.workbench.scplugin.model.adapter.LoginAdapter;
import org.eclipse.persistence.tools.workbench.scplugin.model.adapter.NativeSequenceAdapter;
import org.eclipse.persistence.tools.workbench.scplugin.model.adapter.SequenceAdapter;
import org.eclipse.persistence.tools.workbench.scplugin.model.adapter.TableSequenceAdapter;
import org.eclipse.persistence.tools.workbench.scplugin.model.adapter.UnaryTableSequenceAdapter;
import org.eclipse.persistence.tools.workbench.scplugin.ui.session.DatabaseSessionNode;
import org.eclipse.persistence.tools.workbench.scplugin.ui.session.login.NewSequenceDialog.NewSequenceBuilder;
import org.eclipse.persistence.tools.workbench.scplugin.ui.session.login.NewSequenceDialog.SequenceStateObject;
import org.eclipse.persistence.tools.workbench.uitools.SwitcherPanel;
import org.eclipse.persistence.tools.workbench.uitools.app.CollectionValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.CompositeCollectionValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.ListAspectAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.ListCollectionValueModelAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.ListValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.NullTransformer;
import org.eclipse.persistence.tools.workbench.uitools.app.PropertyAspectAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.PropertyCollectionValueModelAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.PropertyValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.SimpleCollectionValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.SortedListValueModelAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.TransformationValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.ValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.swing.ObjectListSelectionModel;
import org.eclipse.persistence.tools.workbench.uitools.cell.SimpleListCellRenderer;
import org.eclipse.persistence.tools.workbench.utility.Transformer;
import org.eclipse.persistence.tools.workbench.utility.node.AbstractNodeModel;
import org.eclipse.persistence.tools.workbench.utility.node.Node;
import org.eclipse.persistence.tools.workbench.utility.string.StringTools;
// Mapping Workbench
/**
* This pane shows the information regarding {@link org.eclipse.persistence.tools.workbench.scplugin.model.adapter.DatabaseLoginAdapter
* DatabaseLoginAdapter}.
*
* @see DatabaseSessionTabbedPane - The parent of this pane
* @see DefaultSequencePropertyPane
* @see NativeSequencePropertyPane
* @see TableSequencePropertyPane
* @see UnaryTableSequencePropertyPane
* @see XMLFileSequencePropertyPane
*
* @version 11.1.0
* @author Pascal Filion
*/
public class SequencingPropertiesPage extends AbstractLoginPropertiesPage
{
private DefaultSequencePropertyPane defaultSequencePane;
private NativeSequencePropertyPane nativeSequencePane;
private TableSequencePropertyPane tableSequencePane;
private UnaryTableSequencePropertyPane unaryTableSequencePane;
/**
* A constant associated with the default custom table sequence type.
*/
public static String CUSTOM_TABLE_SEQUENCE = "CustomTableSequence";
/**
* A constant associated with the default default sequence type.
*/
public static String DEFAULT_TABLE_SEQUENCE = "DefaultTableSequence";
/**
* A constant associated with the default Native sequence type.
*/
public static String NATIVE_TABLE_SEQUENCE = "NativeTableSequence";
/**
* Creates a new <code>RdbmsSequencingPropertiesPage</code>.
*
* @param nodeHolder The holder of {@link DatabaseSessionNode}
*/
public SequencingPropertiesPage(PropertyValueModel nodeHolder, WorkbenchContextHolder contextHolder)
{
super(nodeHolder, contextHolder);
}
/**
* Creates this panel along with its widgets.
*
* @return The fully initialized pane
*/
protected Component buildPage()
{
GridBagConstraints constraints = new GridBagConstraints();
// Create the container
JPanel container = new JPanel(new GridBagLayout());
container.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 2;
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);
// Sequences list pane
AddRemoveListPanel listPane = buildSequenceListPane();
PropertyValueModel selectedSequenceHolder = listPane.getSelectedItemHolder();
constraints.gridx = 0;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 0;
constraints.weighty = 1;
constraints.fill = GridBagConstraints.VERTICAL;
constraints.anchor = GridBagConstraints.CENTER;
constraints.insets = new Insets(15, 0, 0, 0);
container.add(listPane, constraints);
// Sequence properties pane
defaultSequencePane = buildDefaultSequencePane(selectedSequenceHolder);
nativeSequencePane = buildNativeSequencePane(selectedSequenceHolder);
tableSequencePane = buildTableSequencePane(selectedSequenceHolder);
unaryTableSequencePane = buildUnaryTableSequencePane(selectedSequenceHolder);
SwitcherPanel sequencePane = new SwitcherPanel(selectedSequenceHolder, buildSequencePaneTransformer());
constraints.gridx = 1;
constraints.gridy = 1;
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(15, 10, 0, 0);
container.add(sequencePane, constraints);
addHelpTopicId(container, "session.login.sequencing");
return container;
}
private Transformer buildSequencePaneTransformer()
{
return new Transformer()
{
public Component transform(Object sequence)
{
if (sequence == null)
{
return null;
}
if (((SequenceAdapter)sequence).getType() == SequenceType.DEFAULT)
{
return defaultSequencePane;
}
if (((SequenceAdapter)sequence).getType() == SequenceType.NATIVE)
{
return nativeSequencePane;
}
if (((SequenceAdapter)sequence).getType() == SequenceType.TABLE)
{
return tableSequencePane;
}
if (((SequenceAdapter)sequence).getType() == SequenceType.UNARY_TABLE)
{
return unaryTableSequencePane;
}
return null;
}
};
}
private ValueModel buildTableSequenceHolder(ValueModel selectedSequenceHolder)
{
return new TransformationValueModel(selectedSequenceHolder)
{
@Override
protected TableSequenceAdapter transformNonNull(Object value)
{
return (((SequenceAdapter)value).getType() == SequenceType.TABLE) ? (TableSequenceAdapter) value : null;
}
};
}
private TableSequencePropertyPane buildTableSequencePane(ValueModel selectedSequenceHolder)
{
return new TableSequencePropertyPane
(
buildTableSequenceHolder(selectedSequenceHolder),
getWorkbenchContextHolder()
);
}
private ValueModel buildUnaryTableSequenceHolder(ValueModel selectedSequenceHolder)
{
return new TransformationValueModel(selectedSequenceHolder)
{
@Override
protected UnaryTableSequenceAdapter transformNonNull(Object value)
{
return (((SequenceAdapter)value).getType() == SequenceType.UNARY_TABLE) ? (UnaryTableSequenceAdapter) value : null;
}
};
}
private UnaryTableSequencePropertyPane buildUnaryTableSequencePane(ValueModel selectedSequenceHolder)
{
return new UnaryTableSequencePropertyPane
(
buildUnaryTableSequenceHolder(selectedSequenceHolder),
getWorkbenchContextHolder()
);
}
private ValueModel buildNativeSequenceHolder(ValueModel selectedSequenceHolder)
{
return new TransformationValueModel(selectedSequenceHolder)
{
@Override
protected NativeSequenceAdapter transformNonNull(Object value)
{
return (((SequenceAdapter)value).getType() == SequenceType.NATIVE) ? (NativeSequenceAdapter) value : null;
}
};
}
private NativeSequencePropertyPane buildNativeSequencePane(ValueModel selectedSequenceHolder)
{
return new NativeSequencePropertyPane
(
buildNativeSequenceHolder(selectedSequenceHolder),
getWorkbenchContextHolder()
);
}
private ValueModel buildDefaultSequenceHolder(ValueModel selectedSequenceHolder)
{
return new TransformationValueModel(selectedSequenceHolder)
{
@Override
protected DefaultSequenceAdapter transformNonNull(Object value)
{
return (((SequenceAdapter)value).getType() == SequenceType.DEFAULT) ? (DefaultSequenceAdapter) value : null;
}
};
}
private DefaultSequencePropertyPane buildDefaultSequencePane(ValueModel selectedSequenceHolder)
{
return new DefaultSequencePropertyPane
(
buildDefaultSequenceHolder(selectedSequenceHolder),
getWorkbenchContextHolder()
);
}
private AddRemoveListPanel buildSequenceListPane()
{
AddRemoveListPanel panel = new AddRemoveListPanel
(
getApplicationContext(),
buildSequenceListAdapter(),
buildSortedSequenceListHolder()
) {
@Override
protected void updateRemoveButton(JButton removeButton) {
SequenceAdapter sequence = (SequenceAdapter)this.getSelectionModel().getSelectedValue();
removeButton.setEnabled((sequence != null)&&(getSelectedValues().length == 1)&&(!sequence.isTheDefaultSequence()));
}
};
panel.setCellRenderer(buildSequenceListRenderer());
return panel;
}
private ListCellRenderer buildSequenceListRenderer() {
return new SimpleListCellRenderer() {
protected String buildText(javax.swing.JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
SequenceAdapter sequence = (SequenceAdapter)value;
StringBuilder sb = new StringBuilder();
boolean hasName = !StringTools.stringIsEmpty(sequence.getName());
if (hasName)
{
sb.append(sequence.getName());
}
else if (!sequence.isTheDefaultSequence())
{
sb.append(resourceRepository().getString("SEQUENCING_PANE_SEQUENCE_NO_NAME", index));
}
else
{
sb.append(resourceRepository().getString("SEQUENCING_PANE_DEFAULT_SEQUENCE_TEXT"));
}
StringBuilder sequenceType = new StringBuilder();
sequenceType.append("SEQUENCING_PANE_SEQUENCE_TYPE_");
sequenceType.append(sequence.getType().name());
sb.append(' ');
sb.append('(');
sb.append(resourceRepository().getString(sequenceType.toString()));
sb.append(')');
if (hasName && sequence.isTheDefaultSequence())
{
sb.append(' ');
sb.append(resourceRepository().getString("SEQUENCING_PANE_DEFAULT_SEQUENCE_TEXT"));
}
return sb.toString();
}};
}
private CollectionValueModel buildAllSequenceCollectionHolder()
{
CollectionValueModel collectionHolders =
new SimpleCollectionValueModel();
collectionHolders.addItem(buildSequenceCollectionHolder());
collectionHolders.addItem(buildDefaultSequenceCollectionHolder());
return new CompositeCollectionValueModel
(
collectionHolders,
NullTransformer.instance()
);
}
private CollectionValueModel buildDefaultSequenceCollectionHolder()
{
return new PropertyCollectionValueModelAdapter
(
buildDefaultCollectionHolder()
);
}
private PropertyValueModel buildDefaultCollectionHolder()
{
return new PropertyAspectAdapter(getSelectionHolder(), LoginAdapter.DEFAULT_SEQUENCE_PROPERTY)
{
@Override
protected SequenceAdapter getValueFromSubject()
{
return ((LoginAdapter)subject).getDefaultSequence();
}
};
}
private CollectionValueModel buildSequenceCollectionHolder()
{
return new ListCollectionValueModelAdapter
(
buildSequenceListHolder()
);
}
private ListValueModel buildSequenceListHolder()
{
return new ListAspectAdapter(getSelectionHolder(), LoginAdapter.SEQUENCES_COLLECTION)
{
@Override
protected ListIterator getValueFromSubject()
{
return ((LoginAdapter)subject).sequences();
}
@Override
protected int sizeFromSubject()
{
return ((LoginAdapter)subject).sequencesSize();
}
};
}
private ListValueModel buildSortedSequenceListHolder()
{
return new SortedListValueModelAdapter
(
buildAllSequenceCollectionHolder()
);
}
private LoginAdapter login() {
return (LoginAdapter)selection();
}
private void editSequence(ObjectListSelectionModel listSelectionModel)
{
SequenceAdapter sequence = (SequenceAdapter) listSelectionModel.getSelectedValue();
NewNameDialog.Builder builder = new NewNameDialog.Builder();
builder.setTextFieldDescription(resourceRepository().getString("SEQUENCING_PANE_EDIT_SEQUENCE_DIALOG_LABEL"));
builder.setTitle(resourceRepository().getString("SEQUENCING_PANE_EDIT_SEQUENCE_DIALOG_TITLE"));
builder.setHelpTopicId("dialog.sequence");
builder.setExistingNames(login().sequenceNames());
builder.setOriginalName(sequence.getName());
builder.setOriginalNameIsLegal(false);
builder.setEmptyNameIsLegal(sequence.isDefault());
NewNameDialog dialog = builder.buildDialog(getWorkbenchContext());
dialog.show();
if (dialog.wasConfirmed())
{
String name = dialog.getNewName().trim();
sequence.setName(name);
listSelectionModel.setSelectedValue(sequence);
}
}
private void addSequence(ObjectListSelectionModel listSelectionModel)
{
NewSequenceBuilder builder = new NewSequenceBuilder(resourceRepository());
builder.addExistingNames(login().sequenceNames());
NewSequenceDialog dialog = builder.buildDialog(getWorkbenchContext());
dialog.show();
if (dialog.wasConfirmed())
{
SequenceStateObject stateObject = (SequenceStateObject)dialog.subject();
SequenceAdapter sequence;
if (stateObject.isDefaultSequence())
{
sequence = login().createAndSetDefaultSequence
(
stateObject.getName(),
stateObject.getSequenceType()
);
}
else
{
sequence = login().addSequence
(
stateObject.getName(),
stateObject.getSequenceType()
);
}
listSelectionModel.setSelectedValue(sequence);
}
}
private Adapter buildSequenceListAdapter()
{
return new AddRemoveListPanel.OptionAdapter()
{
public void addNewItem(ObjectListSelectionModel listSelectionModel)
{
addSequence(listSelectionModel);
}
public boolean enableOptionOnSelectionChange(ObjectListSelectionModel listSelectionModel)
{
return listSelectionModel.getSelectedValuesSize() == 1;
}
public String optionalButtonKey()
{
return "SEQUENCING_PANE_EDIT_BUTTON";
}
public void optionOnSelection(ObjectListSelectionModel listSelectionModel)
{
editSequence(listSelectionModel);
}
public void removeSelectedItems(ObjectListSelectionModel listSelectionModel)
{
for (Object sequence : listSelectionModel.getSelectedValues())
{
login().removeSequence((SequenceAdapter) sequence);
}
}
};
}
}