/* * 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.datatools.profiles.ws; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; 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.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.core.designer.util.I18nUtil; import org.teiid.core.designer.util.StringConstants; import org.teiid.core.designer.util.StringUtilities; import org.teiid.datatools.connectivity.model.Parameter; import org.teiid.designer.datatools.ui.DatatoolsUiConstants; import org.teiid.designer.datatools.ui.DatatoolsUiPlugin; import org.teiid.designer.ui.common.table.ComboBoxEditingSupport; import org.teiid.designer.ui.common.table.TableViewerBuilder; import org.teiid.designer.ui.common.util.WidgetFactory; /** * @since 8.6 */ public class ParameterPanel implements DatatoolsUiConstants { static final String PREFIX = I18nUtil.getPropertyPrefix(ParameterPanel.class); TableViewerBuilder propertiesViewer; Button addPropertyButton; Button removePropertyButton; Button upPropertyButton, downPropertyButton; private Map<String, Parameter> parameterMap; private int visibleTableRows; private WSProfileDetailsWizardPage wsProfileDetailsWizardPage; private PropertyPage propertyPage; /** * Constructor * @param wsProfileDetailsWizardPage * @param parent the parent Composite * @param parameterMap * @param propertiesManager the TeiidpropertiesManager * @param visibleTableRows the number of visible rows to be shown in the table */ public ParameterPanel(WSProfileDetailsWizardPage wsProfileDetailsWizardPage, Composite parent, Map<String, Parameter> parameterMap, int visibleTableRows) { super(); this.parameterMap = parameterMap; this.visibleTableRows = visibleTableRows; this.wsProfileDetailsWizardPage = wsProfileDetailsWizardPage; createPanel(parent); } /** * Constructor * @param propertyPage * @param parent the parent Composite * @param parameterMap * @param propertiesManager the TeiidpropertiesManager * @param visibleTableRows the number of visible rows to be shown in the table */ public ParameterPanel(PropertyPage propertyPage, Composite parent, Map<String, Parameter> parameterMap, int visibleTableRows) { super(); this.parameterMap = parameterMap; this.visibleTableRows = visibleTableRows; this.propertyPage = propertyPage; createPanel(parent); } /* * create the panel * @param parent the parent composite */ private void createPanel(Composite parent) { Composite panel = WidgetFactory.createGroup(parent, StringConstants.EMPTY_STRING, SWT.FILL, 2, 1); //$NON-NLS-1$ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); gd.horizontalSpan = 2; panel.setLayoutData(gd); // // add toolbar above the table // Composite toolbarPanel = WidgetFactory.createPanel(panel, SWT.NONE, GridData.VERTICAL_ALIGN_BEGINNING, 1, 4); ((GridLayout)toolbarPanel.getLayout()).marginHeight = 0; this.addPropertyButton = WidgetFactory.createButton(toolbarPanel, GridData.FILL); this.addPropertyButton.setImage(DatatoolsUiPlugin.getDefault().getImage(Images.ADD_PROPERTY_ICON)); this.addPropertyButton.setToolTipText(UTIL.getString("ParametersPanel_addNewParameterButton_tooltip")); //$NON-NLS-1$ this.addPropertyButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { handleAddProperty(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); this.removePropertyButton = WidgetFactory.createButton(toolbarPanel, GridData.FILL); this.removePropertyButton.setImage(DatatoolsUiPlugin.getDefault().getImage(Images.REMOVE_PROPERTY_ICON)); this.removePropertyButton.setToolTipText(UTIL.getString("ParametersPanel_removeParameterButton_tooltip")); //$NON-NLS-1$ this.removePropertyButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { handleRemoveProperty(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); this.removePropertyButton.setEnabled(false); this.upPropertyButton = WidgetFactory.createButton(toolbarPanel, GridData.FILL); this.upPropertyButton.setImage(DatatoolsUiPlugin.getDefault().getImage(Images.UP_PROPERTY_ICON)); this.upPropertyButton.setToolTipText(UTIL.getString("ParametersPanel_upParameterButton_tooltip")); //$NON-NLS-1$ this.upPropertyButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { handleMoveColumnUp(); } }); this.upPropertyButton.setEnabled(false); this.downPropertyButton = WidgetFactory.createButton(toolbarPanel, GridData.FILL); this.downPropertyButton.setImage(DatatoolsUiPlugin.getDefault().getImage(Images.DOWN_PROPERTY_ICON)); this.downPropertyButton.setToolTipText(UTIL.getString("ParametersPanel_downParameterButton_tooltip")); //$NON-NLS-1$ this.downPropertyButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { handleMoveColumnDown(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); this.downPropertyButton.setEnabled(false); this.propertiesViewer = new TableViewerBuilder(panel, (SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION | SWT.BORDER)); GridDataFactory.fillDefaults().grab(true, true).span(3, 1).hint(360, 100).applyTo(propertiesViewer.getTableComposite()); ColumnViewerToolTipSupport.enableFor(this.propertiesViewer.getTableViewer()); this.propertiesViewer.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 ) { if (parameterMap == null || parameterMap.isEmpty()) { return new Object[0]; } Map<String, Parameter> parameterValues = new LinkedHashMap<String, Parameter>(); for (Parameter parameter: parameterMap.values()){ if (!parameter.getType().equals(Parameter.Type.Header)) parameterValues.put(parameter.getPropertyKey(), parameter); } return parameterValues.values().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 } }); // sort the table rows by display name this.propertiesViewer.setComparator(new ViewerComparator() { /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, * java.lang.Object) */ @Override public int compare( Viewer viewer, Object e1, Object e2 ) { return 0; } }); Table table = this.propertiesViewer.getTable(); ((GridData)table.getLayoutData()).heightHint = table.getItemHeight() * this.visibleTableRows; // create columns TableViewerColumn column = propertiesViewer.createColumn(SWT.LEFT, 30, 40, true); column.getColumn().setText(UTIL.getString("ParametersPanel_name") + " "); //$NON-NLS-1$ //$NON-NLS-2$ column.setLabelProvider(new PropertyLabelProvider(0)); //column.setEditingSupport(new PropertyNameEditingSupport(this.propertiesViewer, 0)); column = propertiesViewer.createColumn(SWT.LEFT, 30, 40, true); column.getColumn().setText(UTIL.getString("ParametersPanel_type")); //$NON-NLS-1$ column.getColumn().setToolTipText(UTIL.getString("AddParameterDialog_txtType_toolTip")); column.setLabelProvider(new PropertyLabelProvider(1)); column.setEditingSupport(new ParameterTypeComboEditingSupport(this.propertiesViewer.getTableViewer())); column = propertiesViewer.createColumn(SWT.LEFT, 30, 40, true); column.getColumn().setText(UTIL.getString("ParametersPanel_default_value")); //$NON-NLS-1$ column.getColumn().setToolTipText(UTIL.getString("AddParameterDialog_txtDefaultValue_toolTip")); column.setLabelProvider(new PropertyLabelProvider(2)); column.setEditingSupport(new PropertyNameEditingSupport(this.propertiesViewer.getTableViewer(), 2)); this.propertiesViewer.addSelectionChangedListener(new ISelectionChangedListener() { /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) */ @Override public void selectionChanged( SelectionChangedEvent event ) { handlePropertySelected(); } }); this.propertiesViewer.setInput(this); } void handlePropertySelected() { boolean hasSelection = !this.propertiesViewer.getSelection().isEmpty(); this.removePropertyButton.setEnabled(hasSelection); boolean sel = this.propertiesViewer.getTable().getSelectionIndex()>0; this.upPropertyButton.setEnabled(sel); this.downPropertyButton.setEnabled(this.propertiesViewer.getTable().getSelectionIndex()+1<this.propertiesViewer.getTable().getItemCount()); } public void handleMoveColumnUp() { int startIndex = this.propertiesViewer.getTable().getSelectionIndex(); if( startIndex > 0 ) { // Make Copy of List & get columnInfo of startIndex-1 TableItem[] existingColumns = this.propertiesViewer.getTable().getItems(); TableItem priorColumn = existingColumns[startIndex-1]; existingColumns[startIndex-1] = this.propertiesViewer.getTable().getItem(startIndex); existingColumns[startIndex] = priorColumn; List<TableItem> newColumns = new ArrayList<TableItem>(existingColumns.length); Map<String, Parameter> oldParameterMap = new LinkedHashMap<String, Parameter>(parameterMap); this.parameterMap.clear(); for( TableItem info : existingColumns) { newColumns.add(info); this.parameterMap.put(Parameter.PREFIX+((Parameter)info.getData()).getName(), oldParameterMap.get(Parameter.PREFIX+((Parameter)info.getData()).getName())); } this.propertiesViewer.getTable().setData(newColumns); this.propertiesViewer.refresh(); updatePreviewUrl(); handlePropertySelected(); } } public void handleMoveColumnDown() { int startIndex = this.propertiesViewer.getTable().getSelectionIndex(); if( startIndex < this.propertiesViewer.getTable().getItems().length) { // Make Copy of List & get columnInfo of startIndex+1 TableItem[] existingColumns = this.propertiesViewer.getTable().getItems(); TableItem afterColumn = existingColumns[startIndex+1]; existingColumns[startIndex+1] = this.propertiesViewer.getTable().getItem(startIndex); existingColumns[startIndex] = afterColumn; List<TableItem> newColumns = new ArrayList<TableItem>(existingColumns.length); Map<String, Parameter> oldParameterMap = new LinkedHashMap<String, Parameter>(parameterMap); this.parameterMap.clear(); for( TableItem info : existingColumns) { newColumns.add(info); this.parameterMap.put(Parameter.PREFIX+((Parameter)info.getData()).getName(), oldParameterMap.get(Parameter.PREFIX+((Parameter)info.getData()).getName())); } this.propertiesViewer.getTable().setData(newColumns); this.propertiesViewer.refresh(); updatePreviewUrl(); handlePropertySelected(); } } private Parameter getSelectedProperty() { IStructuredSelection selection = (IStructuredSelection)this.propertiesViewer.getSelection(); if (selection.isEmpty()) { return null; } return (Parameter)selection.getFirstElement(); } void handleAddProperty() { assert (!this.propertiesViewer.getSelection().isEmpty()); if (this.parameterMap == null) this.parameterMap = new LinkedHashMap<String, Parameter>(); Set<String> keys = new HashSet<String>(); for( Object key : parameterMap.keySet() ) { keys.add((String)key); } AddParameterDialog dialog = new AddParameterDialog(propertiesViewer.getControl().getShell(), keys); if (dialog.open() == Window.OK) { // update model String name = dialog.getName(); String type = dialog.getType() != null ? dialog.getType() : IWSProfileConstants.QUERY_STRING; String defaultValue = dialog.getDefaultValue(); Parameter parameter = new Parameter(name, defaultValue, Parameter.Type.fromValue(type)); this.parameterMap.put(Parameter.PREFIX+name, parameter); // update UI from model this.propertiesViewer.refresh(); // select the new property Parameter prop = null; for(TableItem item : this.propertiesViewer.getTable().getItems() ) { if( item.getData() instanceof Parameter && ((Parameter)item.getData()).getName().equals(name) ) { prop = (Parameter)item.getData(); break; } } if( prop != null ) { this.propertiesViewer.setSelection(new StructuredSelection(prop), true); } updatePreviewUrl(); } } /** * */ private void updatePreviewUrl() { if (this.wsProfileDetailsWizardPage!=null){ for( Object key : this.parameterMap.keySet() ) { Parameter para = (Parameter)this.parameterMap.get(key); wsProfileDetailsWizardPage.getProfileProperties().put(para.getPropertyKey(), para.getPropertyValue()); } wsProfileDetailsWizardPage.setParameterMap(this.parameterMap); wsProfileDetailsWizardPage.urlPreviewText.setText(wsProfileDetailsWizardPage.updateUrlPreview().toString()); }else{ for( Object key : this.parameterMap.keySet() ) { Parameter para = (Parameter)this.parameterMap.get(key); propertyPage.getExtraProperties().put(para.getPropertyKey(), para.getPropertyValue()); } propertyPage.setParameterMap(this.parameterMap); propertyPage.urlPreviewText.setText(propertyPage.updateUrlPreview().toString()); } } void handleRemoveProperty() { Parameter selectedProperty = getSelectedProperty(); assert (selectedProperty != null); // update model parameterMap.remove(Parameter.PREFIX+selectedProperty.getName()); // update UI this.propertiesViewer.refresh(); updatePreviewUrl(); } class PropertyLabelProvider extends ColumnLabelProvider { private final int columnID; public PropertyLabelProvider( int columnID ) { this.columnID = columnID; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object) */ @Override public String getText(Object element) { if( element instanceof Parameter ) { if( columnID == 0 ) { return ((Parameter)element).getName(); } else if( columnID == 1 ) { return ((Parameter)element).getType().toString(); } else if( columnID == 2 ) { return ((Parameter)element).getDefaultValue(); } } return super.getText(element); } } class ParameterTypeComboEditingSupport extends ComboBoxEditingSupport { private String[] datatypes = { IWSProfileConstants.QUERY_STRING, IWSProfileConstants.URI }; /** * @param viewer */ public ParameterTypeComboEditingSupport( ColumnViewer viewer ) { super(viewer); } @Override protected String getElementValue( Object element ) { return ((Parameter)element).getType().toString(); } @Override protected String[] refreshItems( Object element ) { return datatypes; } @Override protected void setElementValue( Object element, String newValue ) { Parameter param = (Parameter)element; String key = param.getPropertyKey(); String oldType = param.getType().toString(); String newType = (String)newValue; if( newType != null && newType.length() > 0 && !newType.equalsIgnoreCase(oldType)) { param.setType(Parameter.Type.fromValue(newType)); parameterMap.put(key,param); propertiesViewer.refresh(param); if( wsProfileDetailsWizardPage != null) { wsProfileDetailsWizardPage.setParameterMap(parameterMap); } else { propertyPage.setParameterMap(parameterMap); } } } } class PropertyNameEditingSupport extends EditingSupport { int columnID; private TextCellEditor editor; /** * Create a new instance of the receiver. * * @param viewer the viewer where the editing support is being provided (cannot be <code>null</code>) * @param columnID the column id */ public PropertyNameEditingSupport(ColumnViewer viewer, int columnID) { super(viewer); this.columnID = columnID; this.editor = new TextCellEditor((Composite) viewer.getControl()); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object) */ @Override protected boolean canEdit(Object element) { return true; } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.EditingSupport#getCellEditor(java.lang.Object) */ @Override protected CellEditor getCellEditor(Object element) { return editor; } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object) */ @Override protected Object getValue(Object element) { if( element instanceof Parameter ) { if( columnID == 0 ) { return ((Parameter)element).getName(); } else if( columnID == 1 ) { return ((Parameter)element).getType().toString(); } else if( columnID == 2 ) { return ((Parameter)element).getDefaultValue(); } } return null; } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.EditingSupport#setValue(java.lang.Object, * java.lang.Object) */ @Override protected void setValue(Object element, Object value) { if( element instanceof Parameter ) { String key = ((Parameter)element).getPropertyKey(); if( columnID == 2 ) { String oldDefaultValue = StringConstants.EMPTY_STRING; if( ((Parameter)element).getDefaultValue() != null ) { oldDefaultValue = ((Parameter)element).getDefaultValue(); } String newDefaultValue = (String)value; if( newDefaultValue != null && newDefaultValue.length() > 0 && !newDefaultValue.equalsIgnoreCase(oldDefaultValue)) { ((Parameter)element).setDefaultValue(newDefaultValue); parameterMap.put(key, (Parameter)element); propertiesViewer.refresh(element); } } } if (wsProfileDetailsWizardPage!=null){ for( Object key : parameterMap.keySet() ) { Parameter para = (Parameter)parameterMap.get(key); wsProfileDetailsWizardPage.getProfileProperties().put(para.getPropertyKey(), para.getPropertyValue()); } wsProfileDetailsWizardPage.setParameterMap(parameterMap); wsProfileDetailsWizardPage.urlPreviewText.setText(wsProfileDetailsWizardPage.updateUrlPreview().toString()); }else{ for( Object key : parameterMap.keySet() ) { Parameter para = (Parameter)parameterMap.get(key); propertyPage.getExtraProperties().put(para.getPropertyKey(), para.getPropertyValue()); } propertyPage.setParameterMap(parameterMap); propertyPage.urlPreviewText.setText(propertyPage.updateUrlPreview().toString()); } } } class AddParameterDialog extends MessageDialog { private Button btnOk; private final Set<String> existingNames; private String name; private String type; private String defaultValue; /** * @param parentShell the parent shell (may be <code>null</code>) * @param existingPropertyNames the existing property names (can be <code>null</code>) */ public AddParameterDialog( Shell parentShell, Set<String> existingPropertyNames ) { super(parentShell, UTIL.getString("AddParameterDialog_title"), null, //$NON-NLS-1$ UTIL.getString("AddParameterDialog_message"), MessageDialog.INFORMATION, //$NON-NLS-1$ new String[] { IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL }, 0); if( existingPropertyNames == null ) { this.existingNames = new HashSet<String>(0); } else { this.existingNames = existingPropertyNames; } } /** * {@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; } /** * {@inheritDoc} * * @see org.eclipse.jface.dialogs.MessageDialog#createCustomArea(org.eclipse.swt.widgets.Composite) */ @Override protected Control createCustomArea( Composite parent ) { Composite pnl = new Composite(parent, SWT.NONE); pnl.setLayout(new GridLayout(2, false)); pnl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Label lblName = new Label(pnl, SWT.NONE); lblName.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); lblName.setText(UTIL.getString("AddParameterDialog_lblName_text")); //$NON-NLS-1$ Text txtName = new Text(pnl, SWT.BORDER); txtName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); txtName.setToolTipText(UTIL.getString("AddParameterDialog_txtName_toolTip")); //$NON-NLS-1$ txtName.addModifyListener(new ModifyListener() { /** * {@inheritDoc} * * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent) */ @Override public void modifyText( ModifyEvent e ) { handleNameChanged(((Text)e.widget).getText()); } }); Label lblValue = new Label(pnl, SWT.NONE); lblValue.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); lblValue.setText(UTIL.getString("AddParameterDialog_lblType_text")); //$NON-NLS-1$ Combo txtValue = WidgetFactory.createCombo(pnl, SWT.SIMPLE, GridData.FILL_HORIZONTAL); GridData gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.verticalAlignment = GridData.BEGINNING; gd.grabExcessHorizontalSpace = true; txtValue.setLayoutData(gd); txtValue.add(IWSProfileConstants.QUERY_STRING); txtValue.add(IWSProfileConstants.URI); txtValue.select(0); txtValue.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); txtValue.setToolTipText(UTIL.getString("AddParameterDialog_txtType_toolTip")); //$NON-NLS-1$ txtValue.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { handleTypeChanged(((Combo)e.widget).getText()); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); txtValue.setVisibleItemCount(2); Label lblDefaultValue = new Label(pnl, SWT.NONE); lblDefaultValue.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); lblDefaultValue.setText(UTIL.getString("AddParameterDialog_lblDefaultValue_text")); //$NON-NLS-1$ Text txtDefaultValue = new Text(pnl, SWT.BORDER); txtDefaultValue.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); txtDefaultValue.setToolTipText(UTIL.getString("AddParameterDialog_txtDefaultValue_toolTip")); //$NON-NLS-1$ txtDefaultValue.addModifyListener(new ModifyListener() { /** * {@inheritDoc} * * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent) */ @Override public void modifyText( ModifyEvent e ) { handleDefaultValueChanged((((Text)e.widget).getText())); } }); return pnl; } /** * @return the new property name (never <code>null</code>) * @throws IllegalArgumentException if called when dialog return code is not {@link Window#OK}. */ public String getName() { CoreArgCheck.isEqual(getReturnCode(), Window.OK); return name; } /** * @return the new property value (never <code>null</code>) * @throws IllegalArgumentException if called when dialog return code is not {@link Window#OK}. */ public String getType() { CoreArgCheck.isEqual(getReturnCode(), Window.OK); return type; } /** * @return the defaultValue */ public String getDefaultValue() { return defaultValue; } /** * @param defaultValue the defaultValue to set */ public void setDefaultValue(String defaultValue) { this.defaultValue = defaultValue; } /** * {@inheritDoc} * * @see org.eclipse.jface.window.Window#getShellStyle() */ @Override protected int getShellStyle() { return super.getShellStyle() | SWT.RESIZE; } void handleNameChanged( String newName ) { this.name = newName; updateState(); } void handleDefaultValueChanged( String newDefaultValue ) { this.setDefaultValue(newDefaultValue); updateState(); } void handleTypeChanged(Object type) { this.type = (String)type; updateState(); updatePreviewUrl(); } private void updateState() { // check to see if new name is valid String msg = validateName(); if (StringUtilities.isEmpty(msg)) { // check to see if new default value is valid msg = StringUtilities.isEmpty(this.defaultValue) ? UTIL.getString("AddParameterDialog_emptyDefaultValue") : msg; //$NON-NLS-1$ } // update UI controls if (StringUtilities.isEmpty(msg)) { if (!this.btnOk.isEnabled()) { this.btnOk.setEnabled(true); } if (this.imageLabel.getImage() != null) { this.imageLabel.setImage(null); } this.imageLabel.setImage(getInfoImage()); } else { // value is not valid if (this.btnOk.isEnabled()) { this.btnOk.setEnabled(false); } this.imageLabel.setImage(getErrorImage()); } if (!StringUtilities.isEmpty(msg)) { this.messageLabel.setText(msg); } this.messageLabel.pack(); } private String validateName() { String errorMsg = validateName(this.name); if (errorMsg == null) { // make sure property ID doesn't already exist for (String existingName : this.existingNames) { if (existingName.equals(this.name)) { errorMsg = UTIL.getString("AddParameterDialog_customParameterAlreadyExists", this.name); //$NON-NLS-1$ break; } } } return errorMsg; } /** * @param proposedName the proposed property name * @return an error message or <code>null</code> if name is valid */ public String validateName( String proposedName ) { // must have a name if (StringUtilities.isEmpty(proposedName)) { return UTIL.getString("AddParameterDialog_emptyParameterName"); //$NON-NLS-1$ } // make sure only letters for (char c : proposedName.toCharArray()) { if ( ! isValidChar(c)) { return UTIL.getString("AddParameterDialog_invalidParameterName"); //$NON-NLS-1$ } } // valid name return null; } private boolean isValidChar(char c) { if((Character.isLetter(c) || Character.isDigit(c))) return true; return false; } } }