/*
* 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.editors;
import static org.teiid.designer.extension.ui.UiConstants.UTIL;
import static org.teiid.designer.extension.ui.UiConstants.Form.COMBO_STYLE;
import static org.teiid.designer.extension.ui.UiConstants.Form.SECTION_STYLE;
import static org.teiid.designer.extension.ui.UiConstants.Form.TEXT_STYLE;
import static org.teiid.designer.extension.ui.UiConstants.Form.VIEWER_STYLE;
import static org.teiid.designer.extension.ui.UiConstants.ImageIds.MED_EDITOR;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
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.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.FormDialog;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.core.designer.util.CoreStringUtil;
import org.teiid.designer.core.extension.AbstractMetaclassNameProvider;
import org.teiid.designer.extension.definition.ModelExtensionDefinitionValidator;
import org.teiid.designer.extension.definition.ValidationStatus;
import org.teiid.designer.extension.properties.ModelExtensionPropertyDefinition;
import org.teiid.designer.extension.properties.ModelExtensionPropertyDefinition.PropertyName;
import org.teiid.designer.extension.properties.ModelExtensionPropertyDefinition.Type;
import org.teiid.designer.extension.properties.ModelExtensionPropertyDefinitionImpl;
import org.teiid.designer.extension.properties.NamespaceProvider;
import org.teiid.designer.extension.properties.Translation;
import org.teiid.designer.extension.ui.Activator;
import org.teiid.designer.extension.ui.Messages;
import org.teiid.designer.extension.ui.UiConstants.ImageIds;
import org.teiid.designer.ui.common.table.TableViewerBuilder;
import org.teiid.designer.ui.forms.FormUtil;
import org.teiid.designer.ui.forms.MessageFormDialog;
/**
* The <code>EditPropertyDialog</code> is used to create or edit a property definition.
*/
final class EditPropertyDialog extends FormDialog {
private final String metaclassName;
private final NamespaceProvider namespaceProvider;
private Button btnEditDescription;
private Button btnEditDisplayName;
private Button btnOk;
private Button btnRemoveDescription;
private Button btnRemoveDisplayName;
private Button btnAllowedValues;
private org.eclipse.swt.widgets.List lstAllowedValues;
private Button btnAddValue;
private Button btnEditValue;
private Button btnRemoveValue;
private Button btnInitialValue;
private Text txtInitialValue;
private Button btnFixedValue;
private TableViewerBuilder descriptionViewer;
private TableViewerBuilder displayNameViewer;
private final Collection<String> existingPropIds;
private IManagedForm managedForm;
/**
* The property definition being edited or <code>null</code> when creating a new property definition.
*/
private ModelExtensionPropertyDefinition propDefnBeingEdited;
private ModelExtensionPropertyDefinition propDefn;
private ScrolledForm scrolledForm;
private final ErrorMessage advancedError;
private final ErrorMessage allowedValuesError;
private final ErrorMessage displayNameError;
private final ErrorMessage descriptionError;
private final ErrorMessage indexedError;
private final ErrorMessage initialValueError;
private final ErrorMessage maskedError;
private final ErrorMessage requiredError;
private final ErrorMessage simpleIdError;
private final ErrorMessage typeError;
public EditPropertyDialog(Shell shell,
NamespaceProvider namespaceProvider,
String metaclassName,
Collection<String> existingPropIds) {
super(shell);
CoreArgCheck.isNotEmpty(metaclassName, "metaclassName is empty"); //$NON-NLS-1$
CoreArgCheck.isNotNull(namespaceProvider, "namespaceProvider is null"); //$NON-NLS-1$
this.metaclassName = metaclassName;
this.namespaceProvider = namespaceProvider;
this.propDefn = new ModelExtensionPropertyDefinitionImpl(this.namespaceProvider);
if (existingPropIds == null) {
this.existingPropIds = new ArrayList<String>();
} else {
this.existingPropIds = new ArrayList<String>(existingPropIds);
}
// errors
this.advancedError = new ErrorMessage();
this.allowedValuesError = new ErrorMessage();
this.displayNameError = new ErrorMessage();
this.descriptionError = new ErrorMessage();
this.indexedError = new ErrorMessage();
this.initialValueError = new ErrorMessage();
this.maskedError = new ErrorMessage();
this.requiredError = new ErrorMessage();
this.simpleIdError = new ErrorMessage();
this.typeError = new ErrorMessage();
}
public EditPropertyDialog(Shell shell,
NamespaceProvider namespaceProvider,
String metaclassName,
Collection<String> existingPropIds,
ModelExtensionPropertyDefinition propDefnBeingEdited) {
this(shell, namespaceProvider, metaclassName, existingPropIds);
this.propDefnBeingEdited = propDefnBeingEdited;
if (this.propDefnBeingEdited != null) {
this.propDefnBeingEdited = propDefnBeingEdited;
// remove the property definition being edited
this.existingPropIds.remove(this.propDefnBeingEdited.getSimpleId());
this.propDefn.setAdvanced(this.propDefnBeingEdited.isAdvanced());
this.propDefn.setAllowedValues(this.propDefnBeingEdited.allowedValues());
this.propDefn.setDefaultValue(this.propDefnBeingEdited.getDefaultValue());
this.propDefn.setFixedValue(this.propDefnBeingEdited.getFixedValue());
this.propDefn.setIndex(this.propDefnBeingEdited.shouldBeIndexed());
this.propDefn.setMasked(this.propDefnBeingEdited.isMasked());
this.propDefn.setRequired(this.propDefnBeingEdited.isRequired());
this.propDefn.setSimpleId(this.propDefnBeingEdited.getSimpleId());
this.propDefn.setType(this.propDefnBeingEdited.getType());
if (!this.propDefnBeingEdited.getDescriptions().isEmpty()) {
for (Translation description : this.propDefnBeingEdited.getDescriptions()) {
this.propDefn.addDescription((Translation)description.clone());
}
}
if (!this.propDefnBeingEdited.getDisplayNames().isEmpty()) {
for (Translation displayName : this.propDefnBeingEdited.getDisplayNames()) {
this.propDefn.addDisplayName((Translation)displayName.clone());
}
}
}
}
private void addMessage(ErrorMessage errorMsg) {
errorMsg.update(this.scrolledForm.getMessageManager());
if( errorMsg.isOk() ) {
this.scrolledForm.setMessage(errorMsg.getMessage(),IMessageProvider.NONE);
}
}
private void configureColumn(TableViewerColumn viewerColumn,
String headerText,
String headerToolTip,
boolean resizable) {
TableColumn column = viewerColumn.getColumn();
column.setText(headerText);
column.setToolTipText(headerToolTip);
column.setMoveable(false);
column.setResizable(resizable);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
if (isEditMode()) {
newShell.setText(Messages.editPropertyDialogTitle);
} else {
newShell.setText(Messages.addPropertyDialogTitle);
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.dialogs.MessageDialog#createButton(org.eclipse.swt.widgets.Composite, int, java.lang.String, boolean)
*/
@Override
protected Button createButton(Composite parent,
int id,
String label,
boolean defaultButton) {
Button btn = super.createButton(parent, id, label, defaultButton);
if (id == IDialogConstants.OK_ID) {
// disable OK button initially
this.btnOk = btn;
btn.setEnabled(false);
}
return btn;
}
@SuppressWarnings( "unused" )
private Section createDescriptionSection(Composite body,
FormToolkit toolkit) {
final Section finalSection;
SECTION: {
Section section = FormUtil.createSection(this.managedForm, toolkit, body,
Messages.editPropertyDialogDescriptionSectionTitle,
Messages.editPropertyDialogDescriptionSectionDescription, SECTION_STYLE, true);
section.setExpanded(false);
finalSection = section;
// configure section toolbar
Button[] buttons = FormUtil.createSectionToolBar(finalSection, toolkit,
new Image[] {
Activator.getDefault().getImage(ImageIds.ADD_DESCRIPTION),
Activator.getDefault().getImage(ImageIds.EDIT_DESCRIPTION),
Activator.getDefault().getImage(ImageIds.REMOVE_DESCRIPTION)});
// configure add button
buttons[0].addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleAddDescription();
}
});
buttons[0].setToolTipText(Messages.editPropertyDialogAddDescriptionButtonToolTip);
// configure edit button
buttons[1].setEnabled(false);
buttons[1].addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleEditDescription();
}
});
buttons[1].setToolTipText(Messages.editPropertyDialogEditDescriptionButtonToolTip);
this.btnEditDescription = buttons[1];
// configure remove button
buttons[2].setEnabled(false);
buttons[2].addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleRemoveDescription();
}
});
buttons[2].setToolTipText(Messages.editPropertyDialogRemoveDescriptionButtonToolTip);
this.btnRemoveDescription = buttons[2];
}
final Composite finalContainer;
CONTAINER: {
Composite container = toolkit.createComposite(finalSection);
finalContainer = container;
container.setLayout(new GridLayout());
container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
finalSection.setClient(container);
}
VIEWER: {
this.descriptionViewer = new TableViewerBuilder(finalContainer, VIEWER_STYLE);
Table table = descriptionViewer.getTable();
toolkit.adapt(table);
this.descriptionError.setControl(table);
((GridData)table.getLayoutData()).heightHint = table.getItemHeight() * 5;
((GridData)table.getLayoutData()).widthHint = (int)(getParentShell().getSize().x * .4);
this.descriptionViewer.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 getPropertyDefinition().getDescriptions().toArray();
}
/**
* {@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.descriptionViewer.setLabelProvider(new LabelProvider());
this.descriptionViewer.addDoubleClickListener(new IDoubleClickListener() {
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
*/
@Override
public void doubleClick(DoubleClickEvent event) {
handleEditDescription();
}
});
this.descriptionViewer.addSelectionChangedListener(new ISelectionChangedListener() {
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
@Override
public void selectionChanged(SelectionChangedEvent event) {
handleDescriptionSelected();
}
});
COLUMNS: {
final TableViewerColumn firstColumn = descriptionViewer.createColumn(SWT.LEFT, 50, 50, true);
configureColumn(firstColumn, ColumnHeaders.LOCALE, ColumnToolTips.LOCALE, true);
firstColumn.setLabelProvider(new TranslationLabelProvider(ColumnIndexes.LOCALE));
final TableViewerColumn lastColumn = descriptionViewer.createColumn(SWT.LEFT, 50, 50, true);
lastColumn.setLabelProvider(new TranslationLabelProvider(ColumnIndexes.TRANSLATION));
configureColumn(lastColumn, ColumnHeaders.TRANSLATION, ColumnToolTips.TRANSLATION, true);
}
// populate table
this.descriptionViewer.setInput(this);
}
return finalSection;
}
@SuppressWarnings( "unused" )
private Section createDisplayNameSection(Composite body,
FormToolkit toolkit) {
final Section finalSection;
SECTION: {
Section section = FormUtil.createSection(this.managedForm, toolkit, body,
Messages.editPropertyDialogDisplayNameSectionTitle,
Messages.editPropertyDialogDisplayNameSectionDescription, SECTION_STYLE, true);
section.setExpanded(false);
finalSection = section;
// configure section toolbar
Button[] buttons = FormUtil.createSectionToolBar(finalSection,
toolkit,
new Image[] {
Activator.getDefault().getImage(ImageIds.ADD_DISPLAY_NAME),
Activator.getDefault().getImage(ImageIds.EDIT_DISPLAY_NAME),
Activator.getDefault().getImage(ImageIds.REMOVE_DISPLAY_NAME)});
// configure add button
buttons[0].addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleAddDisplayName();
}
});
buttons[0].setToolTipText(Messages.editPropertyDialogAddDisplayNameButtonToolTip);
// configure edit button
buttons[1].setEnabled(false);
buttons[1].addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleEditDisplayName();
}
});
buttons[1].setToolTipText(Messages.editPropertyDialogEditDisplayNameButtonToolTip);
this.btnEditDisplayName = buttons[1];
// configure remove button
buttons[2].setEnabled(false);
buttons[2].addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleRemoveDisplayName();
}
});
buttons[2].setToolTipText(Messages.editPropertyDialogRemoveDisplayNameButtonToolTip);
this.btnRemoveDisplayName = buttons[2];
}
final Composite finalContainer;
CONTAINER: {
Composite container = toolkit.createComposite(finalSection);
finalContainer = container;
container.setLayout(new GridLayout());
container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
finalSection.setClient(container);
}
VIEWER: {
this.displayNameViewer = new TableViewerBuilder(finalContainer, VIEWER_STYLE);
Table table = displayNameViewer.getTable();
toolkit.adapt(table);
this.displayNameError.setControl(table);
((GridData)table.getLayoutData()).heightHint = table.getItemHeight() * 5;
((GridData)table.getLayoutData()).widthHint = (int)(getParentShell().getSize().x * .4);
this.displayNameViewer.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 getPropertyDefinition().getDisplayNames().toArray();
}
/**
* {@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.displayNameViewer.setLabelProvider(new LabelProvider());
this.displayNameViewer.addDoubleClickListener(new IDoubleClickListener() {
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
*/
@Override
public void doubleClick(DoubleClickEvent event) {
handleEditDisplayName();
}
});
this.displayNameViewer.addSelectionChangedListener(new ISelectionChangedListener() {
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
@Override
public void selectionChanged(SelectionChangedEvent event) {
handleDisplayNameSelected();
}
});
COLUMNS: {
final TableViewerColumn firstColumn = displayNameViewer.createColumn(SWT.LEFT, 50, 50, true);
firstColumn.setLabelProvider(new TranslationLabelProvider(ColumnIndexes.LOCALE));
configureColumn(firstColumn, ColumnHeaders.LOCALE, ColumnToolTips.LOCALE, true);
final TableViewerColumn lastColumn = displayNameViewer.createColumn(SWT.LEFT, 50, 50, true);
lastColumn.setLabelProvider(new TranslationLabelProvider(ColumnIndexes.TRANSLATION));
configureColumn(lastColumn, ColumnHeaders.TRANSLATION, ColumnToolTips.TRANSLATION, true);
}
// populate table
this.displayNameViewer.setInput(this);
}
return finalSection;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.forms.FormDialog#createFormContent(org.eclipse.ui.forms.IManagedForm)
*/
@SuppressWarnings( "unused" )
@Override
protected void createFormContent(IManagedForm managedForm) {
this.managedForm = managedForm;
FORM: {
this.scrolledForm = managedForm.getForm();
this.scrolledForm.setText(Messages.propertyDialogTitle);
this.scrolledForm.setImage(Activator.getDefault().getImage(ImageIds.MED_EDITOR));
this.scrolledForm.setMessage(Messages.propertyDialogMessage, IMessageProvider.NONE);
}
FormToolkit toolkit = managedForm.getToolkit();
toolkit.decorateFormHeading(this.scrolledForm.getForm());
final Composite finalBody;
BODY: {
Composite body = this.scrolledForm.getBody();
finalBody = body;
body.setLayout(new GridLayout());
body.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
body.addControlListener(new ControlAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.ControlAdapter#controlResized(org.eclipse.swt.events.ControlEvent)
*/
@Override
public void controlResized(ControlEvent e) {
super.controlResized(e);
}
});
}
SECTIONS: {
final Section infoSection = createInfoSection(finalBody, toolkit);
final Section propertyValueSection = createPropertyValueSection(finalBody, toolkit);
final Section displayNameSection = createDisplayNameSection(finalBody, toolkit);
final Section descriptionSection = createDescriptionSection(finalBody, toolkit);
infoSection.descriptionVerticalSpacing = propertyValueSection.getTextClientHeightDifference();
descriptionSection.descriptionVerticalSpacing = displayNameSection.getTextClientHeightDifference();
}
// must be done after constructor
this.propDefn.addListener(new PropertyChangeListener() {
/**
* {@inheritDoc}
*
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
handlePropertyChanged(e);
}
});
// set message
validateAll();
}
@SuppressWarnings( "unused" )
private Section createInfoSection(Composite body,
FormToolkit toolkit) {
final Section finalSection;
SECTION: {
Section section = FormUtil.createSection(this.managedForm, toolkit, body, Messages.editPropertyDialogInfoSectionTitle,
Messages.editPropertyDialogInfoSectionDescription, SECTION_STYLE, true);
finalSection = section;
}
final Composite finalContainer;
CONTAINER: {
Composite container = toolkit.createComposite(finalSection);
container.setLayout(new GridLayout(2, false));
container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
finalSection.setClient(container);
finalContainer = container;
}
METACLASS: {
toolkit.createLabel(finalContainer, Messages.metaclassLabel);
// Use shortened name on the label
String labelStr = getMetaclassShortName(this.metaclassName);
Label label = toolkit.createLabel(finalContainer, labelStr);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
}
NAMESPACE_PREFIX: {
toolkit.createLabel(finalContainer, Messages.namespacePrefixLabel);
Label label = toolkit.createLabel(finalContainer, this.namespaceProvider.getNamespacePrefix());
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
}
final Text finalTxtSimpleId;
ID: {
toolkit.createLabel(finalContainer, Messages.simpleIdLabel);
Text txtSimpleId = toolkit.createText(finalContainer, CoreStringUtil.Constants.EMPTY_STRING, TEXT_STYLE);
finalTxtSimpleId = txtSimpleId;
this.simpleIdError.setControl(txtSimpleId);
txtSimpleId.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
txtSimpleId.setFocus();
txtSimpleId.addModifyListener(new ModifyListener() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
*/
@Override
public void modifyText(ModifyEvent e) {
handleSimpleIdChanged(((Text)e.widget).getText());
}
});
if (isEditMode() && (this.propDefn.getSimpleId() != null)) {
txtSimpleId.setText(this.propDefn.getSimpleId());
}
}
RUNTIME_TYPE: {
toolkit.createLabel(finalContainer, Messages.runtimeTypeLabel);
CCombo cbxRuntimeType = new CCombo(finalContainer, COMBO_STYLE);
toolkit.adapt(cbxRuntimeType, true, false);
this.typeError.setControl(cbxRuntimeType);
cbxRuntimeType.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
((GridData)cbxRuntimeType.getLayoutData()).heightHint = cbxRuntimeType.getItemHeight() + 4;
// populate runtime types
for (Type type : Type.values()) {
cbxRuntimeType.add(type.getRuntimeType());
}
// set selection based on property definition
String runtimeType = this.propDefn.getRuntimeType();
if (!CoreStringUtil.isEmpty(runtimeType)) {
int index = cbxRuntimeType.indexOf(runtimeType);
if (index == -1) {
UTIL.log(NLS.bind(Messages.editPropertyDialogInvalidRuntimeTypeMsg, runtimeType));
} else {
cbxRuntimeType.select(index);
}
}
cbxRuntimeType.addModifyListener(new ModifyListener() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
*/
@Override
public void modifyText(ModifyEvent e) {
handleRuntimeTypeChanged(((CCombo)e.widget).getText());
}
});
final RuntimeTypeProposalProvider proposalProvider = new RuntimeTypeProposalProvider(cbxRuntimeType);
proposalProvider.init();
}
FLAGS: {
Button btn = toolkit.createButton(finalContainer, Messages.editPropertyDialogAdvancedButtonText, SWT.CHECK);
this.advancedError.setControl(btn);
btn.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
((GridData)btn.getLayoutData()).verticalIndent = 5;
((GridData)btn.getLayoutData()).horizontalSpan = 2;
btn.setSelection(this.propDefn.isAdvanced());
btn.setToolTipText(Messages.advancedPropertyAttributeColumnHeaderToolTip);
btn.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleAdvancedChanged(((Button)e.widget).getSelection());
}
});
btn = toolkit.createButton(finalContainer, Messages.editPropertyDialogIndexButtonText, SWT.CHECK);
this.indexedError.setControl(btn);
btn.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
((GridData)btn.getLayoutData()).horizontalSpan = 2;
btn.setSelection(this.propDefn.shouldBeIndexed());
btn.setToolTipText(Messages.indexedPropertyAttributeColumnHeaderToolTip);
btn.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleIndexedChanged(((Button)e.widget).getSelection());
}
});
}
return finalSection;
}
@SuppressWarnings( "unused" )
private Section createPropertyValueSection(Composite body,
FormToolkit toolkit) {
Section section = FormUtil.createSection(this.managedForm, toolkit, body,
Messages.editPropertyDialogPropertyValueSectionTitle,
Messages.editPropertyDialogPropertyValueSectionDescription, SECTION_STYLE, true);
final Composite finalContainer;
SECTION: {
Composite container = toolkit.createComposite(section);
finalContainer = container;
container.setLayout(new GridLayout());
container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
section.setClient(container);
}
TOP: {
Button btnRequired = toolkit.createButton(finalContainer, Messages.editPropertyDialogRequiredButtonText, SWT.CHECK);
this.requiredError.setControl(btnRequired);
btnRequired.setSelection(this.propDefn.isRequired());
btnRequired.setToolTipText(Messages.editPropertyDialogRequiredButtonToolTip);
btnRequired.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleRequiredChanged(((Button)e.widget).getSelection());
}
});
Button btnMasked = toolkit.createButton(finalContainer, Messages.editPropertyDialogMaskedButtonText, SWT.CHECK);
this.maskedError.setControl(btnMasked);
btnMasked.setSelection(this.propDefn.isMasked());
btnMasked.setToolTipText(Messages.editPropertyDialogMaskedButtonToolTip);
btnMasked.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleMaskedChanged(((Button)e.widget).getSelection());
}
});
}
MIDDLE: {
Composite middle = toolkit.createComposite(finalContainer);
GridLayout middleLayout = new GridLayout(2, false);
middleLayout.horizontalSpacing = 0;
middleLayout.marginHeight = 0;
middleLayout.marginWidth = 0;
middle.setLayout(middleLayout);
middle.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
this.btnAllowedValues = toolkit.createButton(middle, Messages.editPropertyDialogAllowedValuesButtonText, SWT.CHECK);
this.btnAllowedValues.setToolTipText(Messages.editPropertyDialogAllowedValuesButtonToolTip);
this.btnAllowedValues.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
((GridData)this.btnAllowedValues.getLayoutData()).horizontalSpan = 2;
this.btnAllowedValues.setEnabled(Type.BOOLEAN != this.propDefn.getType());
this.lstAllowedValues = new org.eclipse.swt.widgets.List(middle, SWT.SINGLE | SWT.BORDER);
this.allowedValuesError.setControl(this.lstAllowedValues);
this.lstAllowedValues.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
((GridData)this.lstAllowedValues.getLayoutData()).horizontalIndent = 20;
((GridData)this.lstAllowedValues.getLayoutData()).heightHint = this.lstAllowedValues.getItemHeight() * 5;
this.lstAllowedValues.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleAllowedValueSelected();
}
});
// wait until after populating list before adding selection listener
this.btnAllowedValues.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleHasAllowedValuesSelected();
}
});
Composite pnlButtons = toolkit.createComposite(middle);
RowLayout btnLayout = new RowLayout(SWT.VERTICAL);
btnLayout.marginLeft = 0;
btnLayout.marginRight = 0;
btnLayout.spacing = 0;
btnLayout.marginTop = 0;
btnLayout.marginBottom = 0;
pnlButtons.setLayout(btnLayout);
pnlButtons.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
// configure add allowed value button
this.btnAddValue = toolkit.createButton(pnlButtons, CoreStringUtil.Constants.EMPTY_STRING, SWT.FLAT);
this.btnAddValue.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleAddAllowedValue();
}
});
this.btnAddValue.setToolTipText(Messages.editPropertyDialogAddAllowedValueButtonToolTip);
this.btnAddValue.setImage(Activator.getDefault().getImage(ImageIds.ADD_VALUE));
// configure edit allowed value button
this.btnEditValue = toolkit.createButton(pnlButtons, CoreStringUtil.Constants.EMPTY_STRING, SWT.FLAT);
this.btnEditValue.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleEditAllowedValue();
}
});
this.btnEditValue.setToolTipText(Messages.editPropertyDialogEditAllowedValueButtonToolTip);
this.btnEditValue.setImage(Activator.getDefault().getImage(ImageIds.EDIT_VALUE));
// configure remove allowed value button
this.btnRemoveValue = toolkit.createButton(pnlButtons, CoreStringUtil.Constants.EMPTY_STRING, SWT.FLAT);
this.btnRemoveValue.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleRemoveAllowedValue();
}
});
this.btnRemoveValue.setToolTipText(Messages.editPropertyDialogRemoveAllowedValueButtonToolTip);
this.btnRemoveValue.setImage(Activator.getDefault().getImage(ImageIds.REMOVE_VALUE));
// populate allowed values and set initial enablements
if (isEditMode()) {
String[] allowedValues = this.propDefn.getAllowedValues();
if ((allowedValues != null) && (allowedValues.length != 0)) {
this.btnAllowedValues.setSelection(true);
this.lstAllowedValues.setItems(allowedValues);
}
}
boolean enable = this.btnAllowedValues.getSelection() && this.btnAllowedValues.getEnabled();
this.lstAllowedValues.setEnabled(enable);
this.btnAddValue.setEnabled(enable);
this.btnEditValue.setEnabled(false);
this.btnRemoveValue.setEnabled(false);
}
BOTTOM: {
Composite bottom = toolkit.createComposite(finalContainer, SWT.NONE);
bottom.setLayout(new GridLayout(2, false));
bottom.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
this.btnInitialValue = toolkit.createButton(bottom, Messages.editPropertyDialogInitialValueButtonText, SWT.CHECK);
this.btnInitialValue.setToolTipText(Messages.editPropertyDialogInitialValueButtonToolTip);
this.btnInitialValue.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleHasInitialValueSelected();
}
});
this.txtInitialValue = toolkit.createText(bottom, CoreStringUtil.Constants.EMPTY_STRING, TEXT_STYLE);
this.initialValueError.setControl(this.txtInitialValue);
this.txtInitialValue.addModifyListener(new ModifyListener() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
*/
@Override
public void modifyText(ModifyEvent e) {
handleInitialValueChanged(((Text)e.widget).getText());
}
});
this.txtInitialValue.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
this.btnFixedValue = toolkit.createButton(bottom, Messages.editPropertyDialogFixedValueButtonText, SWT.CHECK);
this.btnFixedValue.setToolTipText(Messages.editPropertyDialogFixedValueButtonToolTip);
this.btnFixedValue.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
handleHasFixedValueSelected();
}
});
this.btnFixedValue.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
((GridData)this.btnFixedValue.getLayoutData()).horizontalIndent = 20;
((GridData)this.btnFixedValue.getLayoutData()).horizontalSpan = 2;
if (!CoreStringUtil.isEmpty(this.propDefn.getDefaultValue())) {
this.btnInitialValue.setSelection(true);
this.txtInitialValue.setText(this.propDefn.getDefaultValue());
} else if (!CoreStringUtil.isEmpty(this.propDefn.getFixedValue())) {
this.btnInitialValue.setSelection(true);
this.btnFixedValue.setSelection(true);
this.txtInitialValue.setText(this.propDefn.getFixedValue());
} else {
this.btnInitialValue.setSelection(false);
this.btnFixedValue.setSelection(false);
this.btnFixedValue.setEnabled(false);
}
}
return section;
}
private String getMetaclassShortName(String metaclass) {
return AbstractMetaclassNameProvider.getLabel(metaclass);
}
ModelExtensionPropertyDefinition getPropertyDefinition() {
return this.propDefn;
}
String getSelectedAllowedValue() {
int index = this.lstAllowedValues.getSelectionIndex();
return ((index == -1) ? null : this.lstAllowedValues.getItem(index));
}
Translation getSelectedDescription() {
IStructuredSelection selection = (IStructuredSelection)this.descriptionViewer.getSelection();
return (selection.isEmpty() ? null : (Translation)selection.getFirstElement());
}
Translation getSelectedDisplayName() {
IStructuredSelection selection = (IStructuredSelection)this.displayNameViewer.getSelection();
return (selection.isEmpty() ? null : (Translation)selection.getFirstElement());
}
void handleAddAllowedValue() {
EditAllowedValueDialog dialog = new EditAllowedValueDialog(getShell(),
this.propDefn.getType(),
this.propDefn.getAllowedValues());
dialog.create();
sizeDialog(dialog.getShell(), getShell());
if (dialog.open() == Window.OK) {
String newAllowedValue = dialog.getAllowedValue();
if (this.propDefn.addAllowedValue(newAllowedValue)) {
this.lstAllowedValues.add(newAllowedValue);
} else {
// not sure when this would happen
UTIL.log(NLS.bind(Messages.editPropertyDialogAllowedValueNotAddedMsg, newAllowedValue));
}
}
}
void handleAddDescription() {
EditTranslationDialog dialog = new EditTranslationDialog(getShell(),
Messages.addPropertyDescriptionDialogTitle,
org.teiid.designer.extension.Messages.propertyDescription,
this.propDefn.getDescriptions());
dialog.create();
// sizeDialog(dialog.getShell(), getShell());
dialog.getShell().pack();
if (dialog.open() == Window.OK) {
Translation newDescription = dialog.getTranslation();
if (this.propDefn.addDescription(newDescription)) {
this.descriptionViewer.refresh();
} else {
// not sure when this would happen
UTIL.log(NLS.bind(Messages.editPropertyDialogDescriptionNotAddedMsg, newDescription));
}
}
}
void handleAddDisplayName() {
EditTranslationDialog dialog = new EditTranslationDialog(getShell(),
Messages.addPropertyDisplayNameDialogTitle,
org.teiid.designer.extension.Messages.propertyDisplayName,
this.propDefn.getDisplayNames());
dialog.create();
sizeDialog(dialog.getShell(), getShell());
if (dialog.open() == Window.OK) {
Translation newDisplayName = dialog.getTranslation();
if (this.propDefn.addDisplayName(newDisplayName)) {
this.displayNameViewer.refresh();
} else {
// not sure when this would happen
UTIL.log(NLS.bind(Messages.editPropertyDialogDisplayNameNotAddedMsg, newDisplayName));
}
}
}
void handleAdvancedChanged(boolean newValue) {
this.propDefn.setAdvanced(newValue);
}
void handleAllowedValueSelected() {
boolean enable = (this.lstAllowedValues.getSelectionIndex() != -1);
if (this.btnEditValue.getEnabled() != enable) {
this.btnEditValue.setEnabled(enable);
}
if (this.btnRemoveValue.getEnabled() != enable) {
this.btnRemoveValue.setEnabled(enable);
}
}
void handleDescriptionSelected() {
IStructuredSelection selection = (IStructuredSelection)this.descriptionViewer.getSelection();
boolean enable = !selection.isEmpty();
if (this.btnEditDescription.getEnabled() != enable) {
this.btnEditDescription.setEnabled(enable);
}
if (this.btnRemoveDescription.getEnabled() != enable) {
this.btnRemoveDescription.setEnabled(enable);
}
}
void handleDisplayNameSelected() {
IStructuredSelection selection = (IStructuredSelection)this.displayNameViewer.getSelection();
boolean enable = !selection.isEmpty();
if (this.btnEditDisplayName.getEnabled() != enable) {
this.btnEditDisplayName.setEnabled(enable);
}
if (this.btnRemoveDisplayName.getEnabled() != enable) {
this.btnRemoveDisplayName.setEnabled(enable);
}
}
void handleEditAllowedValue() {
String selectedAllowedValue = getSelectedAllowedValue();
assert (selectedAllowedValue != null) : "Edit allowed value button is enabled and shouldn't be"; //$NON-NLS-1$
EditAllowedValueDialog dialog = new EditAllowedValueDialog(getShell(),
this.propDefn.getType(),
this.propDefn.getAllowedValues(),
selectedAllowedValue);
dialog.create();
sizeDialog(dialog.getShell(), getShell());
if (dialog.open() == Window.OK) {
String changedValue = dialog.getAllowedValue();
// remove
if (this.propDefn.removeAllowedValue(selectedAllowedValue)) {
this.lstAllowedValues.remove(selectedAllowedValue);
// add
if (this.propDefn.addAllowedValue(changedValue)) {
this.lstAllowedValues.add(changedValue);
}
}
}
}
void handleEditDescription() {
assert (getSelectedDescription() != null) : "Edit description button is enabled and shouldn't be"; //$NON-NLS-1$
Translation selectedDescription = getSelectedDescription();
EditTranslationDialog dialog = new EditTranslationDialog(getShell(),
Messages.editPropertyDescriptionDialogTitle,
org.teiid.designer.extension.Messages.propertyDescription,
this.propDefn.getDescriptions(),
selectedDescription);
dialog.create();
sizeDialog(dialog.getShell(), getShell());
if (dialog.open() == Window.OK) {
Translation changedDescription = dialog.getTranslation();
this.propDefn.removeDescription(selectedDescription);
this.propDefn.addDescription(changedDescription);
this.descriptionViewer.refresh();
}
}
void handleEditDisplayName() {
assert (getSelectedDisplayName() != null) : "Edit display name button is enabled and shouldn't be"; //$NON-NLS-1$
Translation selectedDisplayName = getSelectedDisplayName();
EditTranslationDialog dialog = new EditTranslationDialog(getShell(),
Messages.editPropertyDescriptionDialogTitle,
org.teiid.designer.extension.Messages.propertyDisplayName,
this.propDefn.getDisplayNames(),
selectedDisplayName);
dialog.create();
sizeDialog(dialog.getShell(), getShell());
if (dialog.open() == Window.OK) {
Translation changedDisplayName = dialog.getTranslation();
this.propDefn.removeDisplayName(selectedDisplayName);
this.propDefn.addDisplayName(changedDisplayName);
this.displayNameViewer.refresh();
}
}
void handleHasAllowedValuesSelected() {
boolean enable = this.btnAllowedValues.getSelection();
if (enable) {
for (String allowedValue : this.lstAllowedValues.getItems()) {
this.propDefn.addAllowedValue(allowedValue);
}
} else {
for (String allowedValue : this.lstAllowedValues.getItems()) {
this.propDefn.removeAllowedValue(allowedValue);
}
}
// if boolean don't allow changes to allowed values
enable = (Type.BOOLEAN != this.propDefn.getType());
if (this.btnAllowedValues.getEnabled() != enable) {
this.btnAllowedValues.setEnabled(enable);
}
if (this.lstAllowedValues.getEnabled() != enable) {
this.lstAllowedValues.setEnabled(enable);
}
if (this.btnAddValue.getEnabled() != enable) {
this.btnAddValue.setEnabled(enable);
}
// make sure there is an allowed value selected in order to enable
enable = enable && (this.lstAllowedValues.getSelectionIndex() != -1);
if (this.btnEditValue.getEnabled() != enable) {
this.btnEditValue.setEnabled(enable);
}
if (this.btnRemoveValue.getEnabled() != enable) {
this.btnRemoveValue.setEnabled(enable);
}
// must call these explicitly as a property changed is not generated within this method
validateAllowedValues();
updateState();
}
void handleHasFixedValueSelected() {
boolean hasFixedValue = this.btnFixedValue.getSelection();
String value = this.txtInitialValue.getText();
if (hasFixedValue) {
this.propDefn.setDefaultValue(null); // must be done first in order to validate
this.propDefn.setFixedValue(value);
} else {
this.propDefn.setFixedValue(null); // must be done first in order to validate
this.propDefn.setDefaultValue(value);
}
}
void handleHasInitialValueSelected() {
boolean hasInitialValue = this.btnInitialValue.getSelection();
boolean valueIsFixed = this.btnFixedValue.getSelection();
String value = this.txtInitialValue.getText();
if (hasInitialValue) {
if (valueIsFixed) {
this.propDefn.setFixedValue(value);
this.propDefn.setDefaultValue(null);
} else {
this.propDefn.setDefaultValue(value);
this.propDefn.setFixedValue(null);
}
} else {
this.propDefn.setDefaultValue(null);
this.propDefn.setFixedValue(null);
}
if (this.txtInitialValue.getEnabled() != hasInitialValue) {
this.txtInitialValue.setEnabled(hasInitialValue);
}
if (this.btnFixedValue.getEnabled() != hasInitialValue) {
this.btnFixedValue.setEnabled(hasInitialValue);
}
validateInitialValue(hasInitialValue, valueIsFixed);
updateState();
}
void handleIndexedChanged(boolean newValue) {
this.propDefn.setIndex(newValue);
}
void handleInitialValueChanged(String newValue) {
boolean shouldHaveInitialValue = this.btnInitialValue.getSelection();
if (shouldHaveInitialValue) {
if (this.btnFixedValue.getSelection()) {
this.propDefn.setFixedValue(newValue);
this.propDefn.setDefaultValue(null);
} else {
this.propDefn.setFixedValue(null);
this.propDefn.setDefaultValue(newValue);
}
} else {
this.propDefn.setFixedValue(null);
this.propDefn.setDefaultValue(null);
}
}
void handleMaskedChanged(boolean newValue) {
this.propDefn.setMasked(newValue);
}
void handlePropertyChanged(PropertyChangeEvent e) {
this.scrolledForm.getMessageManager().setAutoUpdate(false);
String propName = e.getPropertyName();
if (PropertyName.ADVANCED.toString().equals(propName)) {
validateAdvancedValue();
} else if (PropertyName.ALLOWED_VALUES.toString().equals(propName)) {
// if old or new value is not a string value reload the list (this could happen if type was changed)
Object oldValue = e.getOldValue();
Object newValue = e.getNewValue();
if (((newValue != null) && !(newValue instanceof String)) || ((oldValue != null) && !(oldValue instanceof String))) {
// should always be a collection but check
if (newValue instanceof Collection) {
this.lstAllowedValues.removeAll();
Object[] newValues = ((Collection)newValue).toArray();
if (newValues.length != 0) {
for (Object value : newValues) {
// should always be a string but check
if (newValue instanceof Collection) {
this.lstAllowedValues.add((String)value);
}
}
if (!this.btnAllowedValues.getSelection()) {
this.btnAllowedValues.setSelection(true);
}
}
}
}
validateAllowedValues();
} else if (PropertyName.DEFAULT_VALUE.toString().equals(propName)) {
validateInitialValue(this.btnInitialValue.getSelection(), false);
} else if (PropertyName.DESCRIPTION.toString().equals(propName)) {
validateDescriptions();
} else if (PropertyName.DISPLAY_NAME.toString().equals(propName)) {
validateDisplayNames();
} else if (PropertyName.FIXED_VALUE.toString().equals(propName)) {
validateInitialValue(this.btnInitialValue.getSelection(), true);
} else if (PropertyName.INDEX.toString().equals(propName)) {
validateIndex();
} else if (PropertyName.MASKED.toString().equals(propName)) {
validateMasked();
} else if (PropertyName.REQUIRED.toString().equals(propName)) {
validateRequired();
} else if (PropertyName.SIMPLE_ID.toString().equals(propName)) {
validateSimpleId();
} else if (PropertyName.TYPE.toString().equals(propName)) {
validateType();
} else {
// shouldn't happen if handling all property changes
assert false;
}
// update buttons enabled state and dialog message
updateState();
this.scrolledForm.getMessageManager().setAutoUpdate(true);
}
void handleRemoveAllowedValue() {
assert (getSelectedAllowedValue() != null) : "Remove allowed value button is enabled and shouldn't be"; //$NON-NLS-1$
if (MessageFormDialog.openQuestion(getShell(), Messages.removeAllowedValueDialogTitle,
Activator.getDefault().getImage(MED_EDITOR),
NLS.bind(Messages.removeAllowedValueDialogMsg, getSelectedDescription()))) {
this.propDefn.removeAllowedValue(getSelectedAllowedValue());
this.lstAllowedValues.remove(getSelectedAllowedValue());
handleAllowedValueSelected(); // removing from ths List doesn't seem to generate a new selection event
}
}
void handleRemoveDescription() {
assert (getSelectedDescription() != null) : "Remove description button is enabled and shouldn't be"; //$NON-NLS-1$
if (MessageFormDialog.openQuestion(getShell(), Messages.removeDescriptionDialogTitle,
Activator.getDefault().getImage(MED_EDITOR),
NLS.bind(Messages.removeDescriptionDialogMsg, getSelectedDescription()))) {
this.propDefn.removeDescription(getSelectedDescription());
this.descriptionViewer.refresh();
}
}
void handleRemoveDisplayName() {
assert (getSelectedDisplayName() != null) : "Remove display name button is enabled and shouldn't be"; //$NON-NLS-1$
if (MessageFormDialog.openQuestion(getShell(), Messages.removeDisplayNameDialogTitle,
Activator.getDefault().getImage(MED_EDITOR),
NLS.bind(Messages.removeDisplayNameDialogMsg, getSelectedDisplayName()))) {
this.propDefn.removeDisplayName(getSelectedDisplayName());
this.displayNameViewer.refresh();
}
}
void handleRequiredChanged(boolean newValue) {
this.propDefn.setRequired(newValue);
}
void handleRuntimeTypeChanged(String newValue) {
Type newType = null;
try {
newType = ModelExtensionPropertyDefinition.Utils.convertRuntimeType(newValue);
this.propDefn.setType(newType);
handleHasAllowedValuesSelected();
} catch (Exception e) {
UTIL.log(e);
}
}
void handleSimpleIdChanged(String newValue) {
this.propDefn.setSimpleId(newValue);
}
private boolean isEditMode() {
return (this.propDefnBeingEdited != null);
}
private void sizeDialog(Shell dialogShell,
Shell parentShell) {
dialogShell.pack();
Point dialogSize = dialogShell.getSize();
Point parentSize = parentShell.getSize();
if ((dialogSize.x > parentSize.x) || (dialogSize.y > parentSize.y)) {
dialogShell.setSize((int)(parentSize.x * 0.8), (int)(parentSize.y * 0.8));
}
}
private void updateState() {
boolean enable = (this.scrolledForm.getMessageType() != IMessageProvider.ERROR);
// change message to default message if there is no error
if (enable) {
if (!Messages.propertyDialogMessage.equals(this.scrolledForm.getMessage())) {
// eclipse bug keeps font foreground red after an error when setting to NONE so set to INFO first as workaround
this.scrolledForm.setMessage(Messages.propertyDialogMessage, IMessageProvider.INFORMATION);
this.scrolledForm.setMessage(Messages.propertyDialogMessage, IMessageProvider.NONE);
}
}
// update UI controls
if (enable) {
if (isEditMode()) {
enable = !this.propDefn.equals(this.propDefnBeingEdited);
}
if (this.btnOk.getEnabled() != enable) {
this.btnOk.setEnabled(enable);
}
} else {
if (this.btnOk.getEnabled()) {
this.btnOk.setEnabled(false);
}
}
}
private void validateAdvancedValue() {
this.advancedError.setStatus(ModelExtensionDefinitionValidator.validatePropertyAdvancedAttribute(this.propDefn.isAdvanced()));
addMessage(this.advancedError);
}
private void validateAll() {
validateAdvancedValue();
validateAllowedValues();
validateDescriptions();
validateDisplayNames();
validateIndex();
validateInitialValue(this.btnInitialValue.getSelection(), this.btnFixedValue.getSelection());
validateMasked();
validateRequired();
validateSimpleId();
validateType();
}
private void validateAllowedValues() {
this.allowedValuesError.clearMessage();
// make sure there is at least one allowed value
if (this.btnAllowedValues.getSelection() && (this.propDefn.allowedValues().isEmpty())) {
this.allowedValuesError.setMessage(Messages.editPropertyDialogAllowedValueRequiredMsg);
}
if (!this.allowedValuesError.isError()) {
this.allowedValuesError.setStatus(ModelExtensionDefinitionValidator.validatePropertyAllowedValues(this.propDefn.getRuntimeType(),
this.propDefn.getAllowedValues()));
}
addMessage(this.allowedValuesError);
validateInitialValue(this.btnInitialValue.getSelection(), this.btnFixedValue.getSelection());
}
private void validateDescriptions() {
this.descriptionError.setStatus(ModelExtensionDefinitionValidator.validateTranslations(org.teiid.designer.extension.Messages.propertyDescription,
this.propDefn.getDescriptions(),
true));
addMessage(this.descriptionError);
}
private void validateDisplayNames() {
this.displayNameError.setStatus(ModelExtensionDefinitionValidator.validateTranslations(org.teiid.designer.extension.Messages.propertyDisplayName,
this.propDefn.getDisplayNames(),
true));
addMessage(this.displayNameError);
}
private void validateIndex() {
this.indexedError.setStatus(ModelExtensionDefinitionValidator.validatePropertyIndexedAttribute(this.propDefn.shouldBeIndexed()));
addMessage(this.indexedError);
}
private void validateInitialValue(boolean shouldHaveInitialValue,
boolean valueIsFixed) {
if (shouldHaveInitialValue) {
if (valueIsFixed) {
this.initialValueError.setStatus(ModelExtensionDefinitionValidator.validatePropertyFixedValue(this.propDefn.getRuntimeType(),
this.propDefn.getFixedValue(),
this.propDefn.getAllowedValues()));
} else {
this.initialValueError.setStatus(ModelExtensionDefinitionValidator.validatePropertyDefaultValue(this.propDefn.getRuntimeType(),
this.propDefn.getDefaultValue(),
this.propDefn.getAllowedValues()));
}
} else {
this.initialValueError.setMessage(null);
}
addMessage(this.initialValueError);
}
private void validateMasked() {
this.maskedError.setStatus(ModelExtensionDefinitionValidator.validatePropertyMaskedAttribute(this.propDefn.isMasked()));
addMessage(this.maskedError);
}
private void validateRequired() {
this.requiredError.setStatus(ModelExtensionDefinitionValidator.validatePropertyRequiredAttribute(this.propDefn.isRequired()));
addMessage(this.requiredError);
}
private void validateSimpleId() {
String simpleId = this.propDefn.getSimpleId();
this.simpleIdError.setStatus(ModelExtensionDefinitionValidator.validatePropertySimpleId(simpleId));
// make sure ID is not a duplicate
if (!this.simpleIdError.isError() && !CoreStringUtil.isEmpty(simpleId) && this.existingPropIds.contains(simpleId)) {
this.simpleIdError.setStatus(ValidationStatus.createErrorMessage(NLS.bind(org.teiid.designer.extension.Messages.duplicatePropertyIdValidatinMsg,
simpleId)));
}
addMessage(this.simpleIdError);
}
private void validateType() {
this.typeError.setStatus(ModelExtensionDefinitionValidator.validatePropertyRuntimeType(this.propDefn.getRuntimeType()));
addMessage(this.typeError);
validateAllowedValues();
}
private interface ColumnHeaders {
String LOCALE = Messages.localeColumnText;
String TRANSLATION = Messages.translationColumnText;
}
private interface ColumnIndexes {
int LOCALE = 0;
int TRANSLATION = 1;
}
private interface ColumnToolTips {
String LOCALE = Messages.localeColumnToolTip;
String TRANSLATION = Messages.translationColumnToolTip;
}
class TranslationLabelProvider extends ColumnLabelProvider {
private final int columnIndex;
public TranslationLabelProvider(final int columnIndex) {
this.columnIndex = columnIndex;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getImage(java.lang.Object)
*/
@Override
public Image getImage(Object element) {
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
Translation translation = (Translation)element;
if (ColumnIndexes.LOCALE == this.columnIndex) {
return translation.getLocale().toString();
}
if (ColumnIndexes.TRANSLATION == this.columnIndex) {
return translation.getTranslation();
}
return super.getText(element);
}
}
}