/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.ui.wizards;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jface.dialogs.IDialogPage;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.XSDSimpleTypeDefinition;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.types.DatatypeManager;
import org.teiid.designer.ui.UiConstants;
import org.teiid.designer.ui.common.InternalUiConstants;
import org.teiid.designer.ui.common.viewsupport.StatusInfo;
import org.teiid.designer.ui.common.widget.accumulator.AccumulatorPanel;
import org.teiid.designer.ui.common.widget.accumulator.IAccumulatedValuesChangeListener;
import org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* This page is used to capture the user preferences for Generation of XSD from Relational objects.
*
* @since 8.0
*/
public class ConvertEnterpriseTypesPage extends WizardPage
implements InternalUiConstants.Widgets, UiConstants, IAccumulatedValuesChangeListener {
private final DatatypeManager dtMgr = ModelerCore.getWorkspaceDatatypeManager();
private final String leftHeader = Util.getString("ConvertEnterpriseTypesPage.leftHeader"); //$NON-NLS-1$
private final String rightHeader = Util.getString("ConvertEnterpriseTypesPage.rightHeader"); //$NON-NLS-1$
private final Collection nonEnterpriseTypes = new HashSet();
private final ILabelProvider accumulatorLabelProvider = ModelUtilities.getEMFLabelProvider();
private TableViewer typeViewer;
private AccumulatorPanel panel;
private Collection typesToConvert;
/**
* Constructor for NewModelWizardSpecifyModelPage
*
* @param The current ISelection selection
*/
public ConvertEnterpriseTypesPage( Resource rsrc ) {
super("typesPage"); //$NON-NLS-1$
setTitle(Util.getString("ConvertEnterpriseTypesPage.title")); //$NON-NLS-1$
setDescription(Util.getString("ConvertEnterpriseTypesPage.desc")); //$NON-NLS-1$
initialize(rsrc);
}
/**
* @see IDialogPage#createControl(Composite)
*/
@Override
public void createControl( Composite parent ) {
Composite container = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
container.setLayout(layout);
Composite topComposite = new Composite(container, SWT.NULL);
GridData topCompositeGridData = new GridData(GridData.FILL_VERTICAL);
topComposite.setLayoutData(topCompositeGridData);
GridLayout topLayout = new GridLayout();
topLayout.numColumns = 2;
topComposite.setLayout(topLayout);
final EnterpriseTypeAccumulatorSource source = new EnterpriseTypeAccumulatorSource(this, topComposite);
panel = new AccumulatorPanel(topComposite, source, new ArrayList(), accumulatorLabelProvider, leftHeader, rightHeader);
panel.addAccumulatedValuesChangeListener(this);
setControl(container);
typeViewer.add(nonEnterpriseTypes.toArray());
checkStatus();
}
@Override
public void accumulatedValuesChanged( AccumulatorPanel source ) {
typesToConvert = source.getItemsMovedToSelected();
checkStatus();
}
public Collection getTypesToConvert() {
if (this.typesToConvert == null) {
return Collections.EMPTY_LIST;
}
return typesToConvert;
}
/**
* Tests if the current workbench selection is a suitable container to use. All selections must be Relational (Virtual or
* Physical). All Tables and Procedure Results within the selection are added to the Collection of root objects to use for
* building.
*/
private void initialize( Resource rsrc ) {
if (rsrc != null) {
addNonEnterpriseTypes(rsrc);
}
}
private void addNonEnterpriseTypes( final Resource xsdRsrc ) {
final Iterator eObjects = xsdRsrc.getContents().iterator();
while (eObjects.hasNext()) {
final Object next = eObjects.next();
if (next instanceof XSDSchema) {
final Iterator children = ((XSDSchema)next).eContents().iterator();
while (children.hasNext()) {
final Object child = children.next();
if (child instanceof XSDSimpleTypeDefinition && !dtMgr.isEnterpriseDatatype((EObject)child)) {
nonEnterpriseTypes.add(child);
}
}
}
}
}
/**
* If genOut is selected the user must supply a model name. If genInput is selected the user must supply a model name. User
* must select at least one of genOut or genInput
*/
private void checkStatus() {
if (nonEnterpriseTypes == null || nonEnterpriseTypes.isEmpty()) {
setMessage(Util.getString("ConvertEnterpriseTypesPage.none"), IMessageProvider.ERROR); //$NON-NLS-1$
setPageComplete(false);
return;
} else if (typesToConvert == null || typesToConvert.isEmpty()) {
setMessage(Util.getString("ConvertEnterpriseTypesPage.noneSelected"), IMessageProvider.ERROR); //$NON-NLS-1$
setPageComplete(false);
return;
}
setMessage(Util.getString("ConvertEnterpriseTypesPage.done"), IMessageProvider.NONE); //$NON-NLS-1$
setPageComplete(true);
}
void typesToConvertChanged() {
}
void typesToConvertRemoved( final Collection values ) {
Iterator it = values.iterator();
while (it.hasNext()) {
Object value = it.next();
typeViewer.add(value);
}
}
void typesToConvertAdded( final Collection values ) {
Iterator it = values.iterator();
while (it.hasNext()) {
Object value = it.next();
typeViewer.remove(value);
}
}
Collection getAvailableTypes() {
final int count = typeViewer.getTable().getItemCount();
final ArrayList values = new ArrayList(count);
for (int i = 0; i < count; i++) {
Object value = typeViewer.getElementAt(i);
values.add(value);
}
return values;
}
int getAvailableTypesCount() {
return typeViewer.getTable().getItemCount();
}
Collection getSelectedAvailableTypes() {
final int[] selectionIndices = typeViewer.getTable().getSelectionIndices();
final ArrayList selectedValues = new ArrayList(selectionIndices.length);
for (int i = 0; i < selectionIndices.length; i++) {
final int index = selectionIndices[i];
selectedValues.add(typeViewer.getElementAt(index));
}
return selectedValues;
}
int getSelectedAvailableTypeCount() {
if (typeViewer != null) {
return typeViewer.getTable().getSelectionCount();
} // endif
return 0;
}
Control createTypeControl( final Composite parent ) {
typeViewer = new TableViewer(parent, SWT.MULTI);
typeViewer.setLabelProvider(accumulatorLabelProvider);
return typeViewer.getControl();
}
void addTypeSelectionListener( final SelectionListener listener ) {
typeViewer.getTable().addSelectionListener(listener);
}
class EnterpriseTypeAccumulatorSource implements IAccumulatorSource {
private final IStatus OK_STATUS = new StatusInfo(UiConstants.PLUGIN_ID);
private final ConvertEnterpriseTypesPage caller;
TableViewer viewer;
public EnterpriseTypeAccumulatorSource( ConvertEnterpriseTypesPage cllr,
Composite parent ) {
super();
this.caller = cllr;
}
@Override
public void accumulatedValuesRemoved( Collection values ) {
caller.typesToConvertRemoved(values);
caller.typesToConvertChanged();
}
@Override
public void accumulatedValuesAdded( Collection values ) {
caller.typesToConvertAdded(values);
caller.typesToConvertChanged();
}
@Override
public Collection getAvailableValues() {
return caller.getAvailableTypes();
}
@Override
public int getAvailableValuesCount() {
return caller.getAvailableTypesCount();
}
@Override
public Collection getSelectedAvailableValues() {
return caller.getSelectedAvailableTypes();
}
@Override
public int getSelectedAvailableValuesCount() {
return caller.getSelectedAvailableTypeCount();
}
@Override
public Control createControl( Composite parent ) {
return caller.createTypeControl(parent);
}
@Override
public void addSelectionListener( SelectionListener listener ) {
caller.addTypeSelectionListener(listener);
}
/* (non-Javadoc)
* @see org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource#supportsAddAll()
*/
@Override
public boolean supportsAddAll() {
return true;
}
/* (non-Javadoc)
* @see org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource#getSelectionStatus()
*/
@Override
public IStatus getSelectionStatus() {
return OK_STATUS;
}
}
}