/*
* 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.extension.ui.wizards;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.teiid.core.designer.util.CoreStringUtil;
import org.teiid.designer.extension.ExtensionPlugin;
import org.teiid.designer.extension.definition.MedStatus;
import org.teiid.designer.extension.definition.ModelExtensionDefinition;
import org.teiid.designer.extension.definition.ModelExtensionDefinitionValidator;
import org.teiid.designer.extension.registry.ModelExtensionRegistry;
import org.teiid.designer.extension.ui.Activator;
import org.teiid.designer.extension.ui.Messages;
import org.teiid.designer.ui.common.util.WidgetFactory;
import org.teiid.designer.ui.common.wizard.AbstractWizardPage;
/**
* @since 5.5
*/
public class NewMedDetailsPage extends AbstractWizardPage {
private static final int COLUMN_COUNT = 2;
private static final String DEFAULT_METAMODEL_NAME = "Relational"; //$NON-NLS-1$
private static final String DEFAULT_VERSION = "1"; //$NON-NLS-1$
private static final String TOKEN_ERROR = "[Error] "; //$NON-NLS-1$
private static final String TOKEN_WARNING = "[Warning] "; //$NON-NLS-1$
private static final String TOKEN_INFO = "[Info] "; //$NON-NLS-1$
private static final String CR = "\n"; //$NON-NLS-1$
private Text namespacePrefixText, namespaceUriText, versionText, descriptionText, statusTextBox;
private Combo cbxMetamodelUris;
private TableViewer modelTypesViewer;
private Set<String> supportedModelTypes = new HashSet<String>();
private ModelExtensionDefinition initialMed;
private static final String[] MODEL_TYPES = new String[] {"PHYSICAL", "VIRTUAL"}; //$NON-NLS-1$ //$NON-NLS-2$
public NewMedDetailsPage( ModelExtensionDefinition initialMed ) {
super(NewMedDetailsPage.class.getSimpleName(), Messages.newMedDetailsPageTitle);
this.initialMed = initialMed;
}
@Override
public void createControl( Composite theParent ) {
Composite pnlMain = WidgetFactory.createPanel(theParent, SWT.NONE, GridData.FILL_BOTH);
pnlMain.setLayout(new GridLayout(COLUMN_COUNT, false));
setControl(pnlMain);
createMainPanel(pnlMain);
validatePage();
}
private Composite createMainPanel( Composite parent ) {
// If an initial MED was supplied, use it's properties to initialize the UI
String nsPrefix = null;
String nsUri = null;
String extendedMetaclass = null;
int version = 1;
String description = null;
boolean copyMode = false;
if (this.initialMed != null) {
copyMode = true;
nsPrefix = this.initialMed.getNamespacePrefix();
nsUri = this.initialMed.getNamespaceUri();
extendedMetaclass = this.initialMed.getMetamodelUri();
version = this.initialMed.getVersion();
description = this.initialMed.getDescription();
}
// -----------------------------------------------------
// Namespace Prefix
// -----------------------------------------------------
// NSPrefix Label
WidgetFactory.createLabel(parent, Messages.namespacePrefixLabel);
// NSPrefix Text widget
this.namespacePrefixText = WidgetFactory.createTextField(parent, GridData.FILL_HORIZONTAL, 1);
this.namespacePrefixText.setToolTipText(Messages.medNamespacePrefixTooltip);
if (nsPrefix != null) this.namespacePrefixText.setText(nsPrefix);
this.namespacePrefixText.addModifyListener(new ModifyListener() {
@Override
public void modifyText( final ModifyEvent event ) {
nsPrefixModified();
}
});
// -----------------------------------------------------
// Namespace Uri
// -----------------------------------------------------
// NSUri Label
WidgetFactory.createLabel(parent, Messages.namespaceUriLabel);
// NSUri text widget
this.namespaceUriText = WidgetFactory.createTextField(parent, GridData.HORIZONTAL_ALIGN_FILL, COLUMN_COUNT - 1);
this.namespaceUriText.setToolTipText(Messages.medNamespaceUriTooltip);
if (nsUri != null) this.namespaceUriText.setText(nsUri);
this.namespaceUriText.addModifyListener(new ModifyListener() {
@Override
public void modifyText( final ModifyEvent event ) {
nsUriModified();
}
});
// -----------------------------------------------------
// Metamodel Uri
// -----------------------------------------------------
// MetamodelUri Label
WidgetFactory.createLabel(parent, Messages.extendedMetamodelUriLabel);
// MetamodelUri text widget
this.cbxMetamodelUris = WidgetFactory.createCombo(parent, SWT.READ_ONLY, GridData.HORIZONTAL_ALIGN_FILL, COLUMN_COUNT - 1);
this.cbxMetamodelUris.setToolTipText(Messages.medMetamodelClassTooltip);
// populate metamodel names
Set<String> metamodelNames = Activator.getDefault().getExtendableMetamodelNames();
this.cbxMetamodelUris.setItems(metamodelNames.toArray(new String[metamodelNames.size()]));
// Set default metamodel in combo, unless one has been provided
int mmIndx = this.cbxMetamodelUris.indexOf(DEFAULT_METAMODEL_NAME);
if (extendedMetaclass != null && extendedMetaclass.trim().length() > 0) {
String mmName = Activator.getDefault().getMetamodelName(extendedMetaclass);
mmIndx = this.cbxMetamodelUris.indexOf(mmName);
}
this.cbxMetamodelUris.select(mmIndx);
if (copyMode) this.cbxMetamodelUris.setEnabled(false);
this.cbxMetamodelUris.addModifyListener(new ModifyListener() {
@Override
public void modifyText( final ModifyEvent event ) {
handleMetamodelUriChanged();
}
});
// -----------------------------------------------------
// Supported ModelTypes
// -----------------------------------------------------
// MetamodelUri Label
WidgetFactory.createLabel(parent, Messages.modelTypesLabel);
this.modelTypesViewer = WidgetFactory.createTableViewer(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI
| SWT.BORDER);
this.modelTypesViewer.getTable().setToolTipText(Messages.medModelTypesToolTip);
((GridData)this.modelTypesViewer.getTable().getLayoutData()).heightHint = this.modelTypesViewer.getTable().getItemHeight() * 3;
this.modelTypesViewer.setContentProvider(new IStructuredContentProvider() {
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
@Override
public void dispose() {
// nothing to do
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
@Override
public Object[] getElements( Object inputElement ) {
return getAvailableModelTypes();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object,
* java.lang.Object)
*/
@Override
public void inputChanged( Viewer viewer,
Object oldInput,
Object newInput ) {
// nothing to do
}
});
this.modelTypesViewer.setLabelProvider(new LabelProvider() {
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
*/
@Override
public String getText( Object element ) {
String modelType = (String)element;
return Activator.getDefault().getModelTypeName(modelType);
}
});
this.modelTypesViewer.setInput(this);
setModelTypeSelections();
if (copyMode) {
this.modelTypesViewer.getTable().setEnabled(false);
}
this.modelTypesViewer.addSelectionChangedListener(new ISelectionChangedListener() {
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
@Override
public void selectionChanged( SelectionChangedEvent event ) {
handleModelTypeSelected();
}
});
// -----------------------------------------------------
// Version
// -----------------------------------------------------
// Version Label
WidgetFactory.createLabel(parent, Messages.versionLabel);
// Version text widget
this.versionText = WidgetFactory.createTextField(parent,
GridData.HORIZONTAL_ALIGN_FILL,
COLUMN_COUNT - 1,
DEFAULT_VERSION,
SWT.READ_ONLY);
this.versionText.setToolTipText(Messages.medVersionTooltip);
if (version != -1) this.versionText.setText(Integer.toString(version));
this.versionText.setText(DEFAULT_VERSION);
this.versionText.setBackground(parent.getBackground());
if (copyMode) this.versionText.setEnabled(false);
// -----------------------------------------------------
// Description
// -----------------------------------------------------
// Description Label
WidgetFactory.createLabel(parent, Messages.descriptionLabel);
// Description text widget
this.descriptionText = WidgetFactory.createTextField(parent, GridData.HORIZONTAL_ALIGN_FILL, COLUMN_COUNT - 1);
this.descriptionText.setToolTipText(Messages.medDescriptionToolTip);
if (description != null) this.descriptionText.setText(description);
this.descriptionText.addModifyListener(new ModifyListener() {
@Override
public void modifyText( final ModifyEvent event ) {
descriptionModified();
}
});
// -----------------------------------------------------
// Status
// -----------------------------------------------------
// Status Label
WidgetFactory.createLabel(parent, GridData.HORIZONTAL_ALIGN_FILL, COLUMN_COUNT, Messages.newMedDetailsPageStatusLabel);
// Description text widget
this.statusTextBox = WidgetFactory.createTextField(parent, GridData.FILL_BOTH,
COLUMN_COUNT,
null,
SWT.BORDER | SWT.MULTI | SWT.H_SCROLL);
this.namespacePrefixText.setFocus();
return parent;
}
private void setModelTypeSelections() {
if (this.initialMed != null) {
this.supportedModelTypes = new HashSet(this.initialMed.getSupportedModelTypes());
if (supportedModelTypes.isEmpty()) {
this.modelTypesViewer.getTable().selectAll();
} else {
this.modelTypesViewer.setSelection(new StructuredSelection(supportedModelTypes.toArray()), true);
}
} else {
this.modelTypesViewer.getTable().selectAll();
}
}
private Object[] getAvailableModelTypes() {
String mmUri = null;
if (this.initialMed != null) {
mmUri = this.initialMed.getMetamodelUri();
} else {
String mmName = this.cbxMetamodelUris.getText();
mmUri = Activator.getDefault().getMetamodelUri(mmName);
}
if (CoreStringUtil.isEmpty(mmUri)) {
return CoreStringUtil.Constants.EMPTY_STRING_ARRAY;
}
return Activator.getDefault().getModelTypes(mmUri).toArray();
}
public static Set<String> getDefaultModelTypes() {
Set<String> modelTypes = new HashSet<String>(MODEL_TYPES.length);
for (String modelType : MODEL_TYPES) {
modelTypes.add(modelType);
}
return modelTypes;
}
void handleModelTypeSelected() {
supportedModelTypes.clear();
IStructuredSelection selection = (IStructuredSelection)this.modelTypesViewer.getSelection();
// add any new model types
for (Object selectedModelType : selection.toArray()) {
supportedModelTypes.add((String)selectedModelType);
}
validatePage();
}
private void nsPrefixModified() {
validatePage();
}
private void nsUriModified() {
validatePage();
}
private void handleMetamodelUriChanged() {
this.modelTypesViewer.refresh();
this.setModelTypeSelections();
validatePage();
}
private void descriptionModified() {
validatePage();
}
public String getNamespacePrefix() {
return this.namespacePrefixText.getText();
}
public String getNamespaceUri() {
return this.namespaceUriText.getText();
}
public String getMetamodelUri() {
String metamodelName = this.cbxMetamodelUris.getText();
return Activator.getDefault().getMetamodelUri(metamodelName);
}
public String getVersion() {
return this.versionText.getText();
}
public int getVersionInt() {
int versionInt = 1;
try {
versionInt = Integer.parseInt(this.versionText.getText());
} catch (Exception e) {
}
return versionInt;
}
@Override
public String getDescription() {
return this.descriptionText.getText();
}
public Collection<String> getSupportedModelTypes() {
return this.supportedModelTypes;
}
/**
* Validation logic for the page. Wizard completion is allowed, even with errors - but the problems should be displayed.
*
* @since 7.6
*/
private void validatePage() {
MedStatus nsPrefixStatus = ModelExtensionDefinitionValidator.validateNamespacePrefix(getNamespacePrefix(),
getRegistry().getAllNamespacePrefixes());
MedStatus nsUriStatus = ModelExtensionDefinitionValidator.validateNamespaceUri(getNamespaceUri(),
getRegistry().getAllNamespaceUris());
MedStatus metaModelUriStatus = ModelExtensionDefinitionValidator.validateMetamodelUri(getMetamodelUri(),
getRegistry().getExtendableMetamodelUris());
MedStatus definitionStatus = ModelExtensionDefinitionValidator.validateDescription(getDescription());
MedStatus versionStatus = ModelExtensionDefinitionValidator.validateVersion(getVersion());
MedStatus modelTypeStatus = ModelExtensionDefinitionValidator.validateModelTypes(supportedModelTypes, getDefaultModelTypes());
StringBuffer sb = new StringBuffer();
addStatusMessage(sb, nsPrefixStatus);
addStatusMessage(sb, nsUriStatus);
addStatusMessage(sb, metaModelUriStatus);
addStatusMessage(sb, versionStatus);
addStatusMessage(sb, definitionStatus);
addStatusMessage(sb, modelTypeStatus);
this.statusTextBox.setText(sb.toString());
setMessage(Messages.newMedDetailsPageMsg);
setPageComplete(true);
}
private void addStatusMessage( final StringBuffer sb,
final MedStatus status ) {
if (status.isError()) {
sb.append(TOKEN_ERROR + status.getMessage() + CR);
} else if (status.isWarning()) {
sb.append(TOKEN_WARNING + status.getMessage() + CR);
} else if (status.isInfo()) {
sb.append(TOKEN_INFO + status.getMessage() + CR);
}
}
/**
* @return the model extension registry (never <code>null</code>)
*/
protected ModelExtensionRegistry getRegistry() {
return ExtensionPlugin.getInstance().getRegistry();
}
}