/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2016 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ package org.pentaho.di.ui.trans.steps.validator; import java.util.ArrayList; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.FocusAdapter; 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.ShellAdapter; import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; 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.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.pentaho.di.core.Const; import org.pentaho.di.core.util.Utils; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.exception.KettleStepException; import org.pentaho.di.core.row.RowMetaInterface; import org.pentaho.di.core.row.ValueMetaInterface; import org.pentaho.di.core.row.value.ValueMetaFactory; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.step.BaseStepMeta; import org.pentaho.di.trans.step.StepDialogInterface; import org.pentaho.di.trans.step.errorhandling.StreamInterface; import org.pentaho.di.trans.steps.validator.Validation; import org.pentaho.di.trans.steps.validator.ValidatorMeta; import org.pentaho.di.ui.core.dialog.EnterStringDialog; import org.pentaho.di.ui.core.dialog.ErrorDialog; import org.pentaho.di.ui.core.gui.GUIResource; import org.pentaho.di.ui.core.widget.warning.SimpleWarningMessage; import org.pentaho.di.ui.core.widget.warning.SupportsWarningInterface; import org.pentaho.di.ui.core.widget.warning.TextVarWarning; import org.pentaho.di.ui.core.widget.warning.WarningInterface; import org.pentaho.di.ui.core.widget.warning.WarningMessageInterface; import org.pentaho.di.ui.trans.step.BaseStepDialog; public class ValidatorDialog extends BaseStepDialog implements StepDialogInterface { private static Class<?> PKG = ValidatorMeta.class; // for i18n purposes, needed by Translator2!! private ValidatorMeta input; private List wValidationsList; private RowMetaInterface inputFields; private Button wValidateAll; private Validation selectedField; private Label wlDescription; private Text wDescription; private Label wlFieldName; private CCombo wFieldName; private Label wlNullAllowed; private Button wNullAllowed; private Label wlOnlyNullAllowed; private Button wOnlyNullAllowed; private Label wlOnlyNumeric; private Button wOnlyNumeric; private java.util.List<Validation> selectionList; private Label wlMaxLength; private TextVarWarning wMaxLength; private Label wlMinLength; private TextVarWarning wMinLength; private Group wgData; private Group wgType; private Label wlDataTypeVerified; private Button wDataTypeVerified; private Label wlDataType; private Combo wDataType; private Label wlConversionMask; private TextVarWarning wConversionMask; private Label wlDecimalSymbol; private TextVarWarning wDecimalSymbol; private Label wlGroupingSymbol; private TextVarWarning wGroupingSymbol; private Label wlMaxValue; private TextVarWarning wMaxValue; private Label wlMinValue; private TextVarWarning wMinValue; private Label wlAllowedValues; private List wAllowedValues; private Label wlSourceValues; private Button wSourceValues; private Label wlSourceStep; private Combo wSourceStep; private Label wlSourceField; private Combo wSourceField; private Button wbAddAllowed; private Button wbRemoveAllowed; private Button wClear; private Button wNew; private Label wlStartStringExpected; private TextVarWarning wStartStringExpected; private Label wlEndStringExpected; private TextVarWarning wEndStringExpected; private Label wlStartStringDisallowed; private TextVarWarning wStartStringDisallowed; private Label wlEndStringDisallowed; private TextVarWarning wEndStringDisallowed; private Label wlRegExpExpected; private TextVarWarning wRegExpExpected; private Label wlRegExpDisallowed; private TextVarWarning wRegExpDisallowed; private Label wlErrorCode; private TextVarWarning wErrorCode; private Label wlErrorDescription; private TextVarWarning wErrorDescription; private Button wConcatErrors; private TextVarWarning wConcatSeparator; public ValidatorDialog( Shell parent, Object in, TransMeta tr, String sname ) { super( parent, (BaseStepMeta) in, tr, sname ); input = (ValidatorMeta) in; // Just to make sure everything is nicely in sync... // java.util.List<StreamInterface> infoStreams = input.getStepIOMeta().getInfoStreams(); for ( int i = 0; i < infoStreams.size(); i++ ) { input.getValidations().get( i ).setSourcingStepName( infoStreams.get( i ).getStepname() ); } selectedField = null; selectionList = new ArrayList<Validation>(); // Copy the data from the input into the map... // for ( Validation field : input.getValidations() ) { selectionList.add( field.clone() ); } } public String open() { Shell parent = getParent(); Display display = parent.getDisplay(); shell = new Shell( parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MIN | SWT.MAX ); props.setLook( shell ); setShellImage( shell, input ); ModifyListener lsMod = new ModifyListener() { public void modifyText( ModifyEvent e ) { input.setChanged(); } }; changed = input.hasChanged(); FormLayout formLayout = new FormLayout(); formLayout.marginWidth = Const.FORM_MARGIN; formLayout.marginHeight = Const.FORM_MARGIN; shell.setLayout( formLayout ); shell.setText( BaseMessages.getString( PKG, "ValidatorDialog.Shell.Title" ) ); int middle = props.getMiddlePct(); int margin = Const.MARGIN; Rectangle imageBounds = GUIResource.getInstance().getImageInfoHop().getBounds(); // Stepname line // wlStepname = new Label( shell, SWT.RIGHT ); wlStepname.setText( BaseMessages.getString( PKG, "ValidatorDialog.Stepname.Label" ) ); props.setLook( wlStepname ); fdlStepname = new FormData(); fdlStepname.left = new FormAttachment( 0, 0 ); fdlStepname.right = new FormAttachment( middle, -margin ); fdlStepname.top = new FormAttachment( 0, margin ); wlStepname.setLayoutData( fdlStepname ); wStepname = new Text( shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wStepname.setText( stepname ); props.setLook( wStepname ); wStepname.addModifyListener( lsMod ); fdStepname = new FormData(); fdStepname.left = new FormAttachment( middle, 0 ); fdStepname.top = new FormAttachment( 0, margin ); fdStepname.right = new FormAttachment( 100, 0 ); wStepname.setLayoutData( fdStepname ); // Some buttons wOK = new Button( shell, SWT.PUSH ); wOK.setText( BaseMessages.getString( PKG, "System.Button.OK" ) ); wNew = new Button( shell, SWT.PUSH ); wNew.setText( BaseMessages.getString( PKG, "ValidatorDialog.NewButton.Label" ) ); wClear = new Button( shell, SWT.PUSH ); wClear.setText( BaseMessages.getString( PKG, "ValidatorDialog.ClearButton.Label" ) ); wCancel = new Button( shell, SWT.PUSH ); wCancel.setText( BaseMessages.getString( PKG, "System.Button.Cancel" ) ); setButtonPositions( new Button[] { wOK, wNew, wClear, wCancel }, margin, null ); // List of fields to the left... // Label wlFieldList = new Label( shell, SWT.LEFT ); wlFieldList.setText( BaseMessages.getString( PKG, "ValidatorDialog.FieldList.Label" ) ); props.setLook( wlFieldList ); FormData fdlFieldList = new FormData(); fdlFieldList.left = new FormAttachment( 0, 0 ); fdlFieldList.right = new FormAttachment( middle, -margin ); fdlFieldList.top = new FormAttachment( wStepname, margin ); wlFieldList.setLayoutData( fdlFieldList ); wValidationsList = new List( shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL ); props.setLook( wValidationsList ); wValidationsList.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent event ) { showSelectedValidatorField( wValidationsList.getSelection()[0] ); } } ); FormData fdFieldList = new FormData(); fdFieldList.left = new FormAttachment( 0, 0 ); fdFieldList.top = new FormAttachment( wlFieldList, margin ); fdFieldList.right = new FormAttachment( middle, -margin ); fdFieldList.bottom = new FormAttachment( wOK, -margin * 2 ); wValidationsList.setLayoutData( fdFieldList ); // General: an option to allow ALL the options to be checked. // wValidateAll = new Button( shell, SWT.CHECK ); wValidateAll.setText( BaseMessages.getString( PKG, "ValidatorDialog.ValidateAll.Label" ) ); props.setLook( wValidateAll ); FormData fdValidateAll = new FormData(); fdValidateAll.left = new FormAttachment( middle, 0 ); fdValidateAll.right = new FormAttachment( 100, 0 ); fdValidateAll.top = new FormAttachment( wStepname, margin ); wValidateAll.setLayoutData( fdValidateAll ); wValidateAll.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent arg0 ) { setFlags(); } } ); // General: When validating all options, still output a single row, errors concatenated // wConcatErrors = new Button( shell, SWT.CHECK ); wConcatErrors.setText( BaseMessages.getString( PKG, "ValidatorDialog.ConcatErrors.Label" ) ); props.setLook( wConcatErrors ); FormData fdConcatErrors = new FormData(); fdConcatErrors.left = new FormAttachment( middle, 0 ); fdConcatErrors.top = new FormAttachment( wValidateAll, margin ); wConcatErrors.setLayoutData( fdConcatErrors ); wConcatErrors.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent arg0 ) { setFlags(); } } ); // The separator // wConcatSeparator = new TextVarWarning( transMeta, shell, SWT.LEFT | SWT.SINGLE | SWT.BORDER ); props.setLook( wConcatSeparator ); FormData fdConcatSeparator = new FormData(); fdConcatSeparator.left = new FormAttachment( wConcatErrors, margin ); fdConcatSeparator.right = new FormAttachment( 100, 0 ); fdConcatSeparator.top = new FormAttachment( wValidateAll, margin ); wConcatSeparator.setLayoutData( fdConcatSeparator ); // Create a scrolled composite on the right side... // ScrolledComposite wSComp = new ScrolledComposite( shell, SWT.H_SCROLL | SWT.V_SCROLL ); props.setLook( wSComp ); wSComp.setLayout( new FillLayout() ); FormData fdComp = new FormData(); fdComp.left = new FormAttachment( middle, 0 ); fdComp.top = new FormAttachment( wConcatSeparator, 2 * margin ); fdComp.right = new FormAttachment( 100, 0 ); fdComp.bottom = new FormAttachment( wOK, -margin * 2 ); wSComp.setLayoutData( fdComp ); Composite wComp = new Composite( wSComp, SWT.BORDER ); props.setLook( wComp ); FormLayout compLayout = new FormLayout(); compLayout.marginWidth = 3; compLayout.marginHeight = 3; wComp.setLayout( compLayout ); int extra = imageBounds.width; // Description (list key) // wlDescription = new Label( wComp, SWT.RIGHT ); wlDescription.setText( BaseMessages.getString( PKG, "ValidatorDialog.Description.Label" ) ); props.setLook( wlDescription ); FormData fdlDescription = new FormData(); fdlDescription.left = new FormAttachment( 0, 0 ); fdlDescription.right = new FormAttachment( middle, -margin ); fdlDescription.top = new FormAttachment( 0, 0 ); wlDescription.setLayoutData( fdlDescription ); wDescription = new Text( wComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wDescription ); FormData fdDescription = new FormData(); fdDescription.left = new FormAttachment( middle, margin + extra ); fdDescription.right = new FormAttachment( 100, 0 ); fdDescription.top = new FormAttachment( 0, 0 ); wDescription.setLayoutData( fdDescription ); wDescription.addModifyListener( new ModifyListener() { public void modifyText( ModifyEvent event ) { // See if there is a selected Validation // if ( wValidationsList != null && wValidationsList.getItemCount() > 0 && wValidationsList.getSelection().length == 1 ) { int index = wValidationsList.getSelectionIndex(); String description = wValidationsList.getItem( index ); Validation validation = Validation.findValidation( selectionList, description ); String newDescription = wDescription.getText(); validation.setName( newDescription ); wValidationsList.setItem( index, newDescription ); wValidationsList.select( index ); } } } ); // The name of the field to validate // wlFieldName = new Label( wComp, SWT.RIGHT ); wlFieldName.setText( BaseMessages.getString( PKG, "ValidatorDialog.FieldName.Label" ) ); props.setLook( wlFieldName ); FormData fdlFieldName = new FormData(); fdlFieldName.left = new FormAttachment( 0, 0 ); fdlFieldName.right = new FormAttachment( middle, -margin ); fdlFieldName.top = new FormAttachment( wDescription, margin ); wlFieldName.setLayoutData( fdlFieldName ); wFieldName = new CCombo( wComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wFieldName ); FormData fdFieldName = new FormData(); fdFieldName.left = new FormAttachment( middle, margin + extra ); fdFieldName.right = new FormAttachment( 100, 0 ); fdFieldName.top = new FormAttachment( wDescription, margin ); wFieldName.setLayoutData( fdFieldName ); // TODO: grab field list in thread in the background... // try { inputFields = transMeta.getPrevStepFields( stepMeta ); wFieldName.setItems( inputFields.getFieldNames() ); } catch ( KettleStepException ex ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "ValidatorDialog.Exception.CantGetFieldsFromPreviousSteps.Title" ), BaseMessages.getString( PKG, "ValidatorDialog.Exception.CantGetFieldsFromPreviousSteps.Message" ), ex ); } // ErrorCode // wlErrorCode = new Label( wComp, SWT.RIGHT ); wlErrorCode.setText( BaseMessages.getString( PKG, "ValidatorDialog.ErrorCode.Label" ) ); props.setLook( wlErrorCode ); FormData fdlErrorCode = new FormData(); fdlErrorCode.left = new FormAttachment( 0, 0 ); fdlErrorCode.right = new FormAttachment( middle, -margin ); fdlErrorCode.top = new FormAttachment( wFieldName, margin ); wlErrorCode.setLayoutData( fdlErrorCode ); wErrorCode = new TextVarWarning( transMeta, wComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wErrorCode ); FormData fdErrorCode = new FormData(); fdErrorCode.left = new FormAttachment( middle, margin ); fdErrorCode.right = new FormAttachment( 100, 0 ); fdErrorCode.top = new FormAttachment( wFieldName, margin ); wErrorCode.setLayoutData( fdErrorCode ); addSpacesWarning( wErrorCode ); // ErrorDescription // wlErrorDescription = new Label( wComp, SWT.RIGHT ); wlErrorDescription.setText( BaseMessages.getString( PKG, "ValidatorDialog.ErrorDescription.Label" ) ); props.setLook( wlErrorDescription ); FormData fdlErrorDescription = new FormData(); fdlErrorDescription.left = new FormAttachment( 0, 0 ); fdlErrorDescription.right = new FormAttachment( middle, -margin ); fdlErrorDescription.top = new FormAttachment( wErrorCode, margin ); wlErrorDescription.setLayoutData( fdlErrorDescription ); wErrorDescription = new TextVarWarning( transMeta, wComp, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wErrorDescription ); FormData fdErrorDescription = new FormData(); fdErrorDescription.left = new FormAttachment( middle, margin ); fdErrorDescription.right = new FormAttachment( 100, 0 ); fdErrorDescription.top = new FormAttachment( wErrorCode, margin ); wErrorDescription.setLayoutData( fdErrorDescription ); addSpacesWarning( wErrorDescription ); // Data type validations & constants masks... // wgType = new Group( wComp, SWT.NONE ); props.setLook( wgType ); wgType.setText( BaseMessages.getString( PKG, "ValidatorDialog.TypeGroup.Label" ) ); FormLayout typeGroupLayout = new FormLayout(); typeGroupLayout.marginHeight = Const.FORM_MARGIN; typeGroupLayout.marginWidth = Const.FORM_MARGIN; wgType.setLayout( typeGroupLayout ); FormData fdType = new FormData(); fdType.left = new FormAttachment( 0, 0 ); fdType.right = new FormAttachment( 100, 0 ); fdType.top = new FormAttachment( wErrorDescription, margin * 2 ); wgType.setLayoutData( fdType ); // Check for data type correctness? // wlDataTypeVerified = new Label( wgType, SWT.RIGHT ); wlDataTypeVerified.setText( BaseMessages.getString( PKG, "ValidatorDialog.DataTypeVerified.Label" ) ); props.setLook( wlDataTypeVerified ); FormData fdldataTypeVerified = new FormData(); fdldataTypeVerified.left = new FormAttachment( 0, 0 ); fdldataTypeVerified.right = new FormAttachment( middle, -margin ); fdldataTypeVerified.top = new FormAttachment( 0, 0 ); wlDataTypeVerified.setLayoutData( fdldataTypeVerified ); wDataTypeVerified = new Button( wgType, SWT.CHECK ); props.setLook( wDataTypeVerified ); FormData fddataTypeVerified = new FormData(); fddataTypeVerified.left = new FormAttachment( middle, margin + extra ); fddataTypeVerified.right = new FormAttachment( 100, 0 ); fddataTypeVerified.top = new FormAttachment( 0, 0 ); wDataTypeVerified.setLayoutData( fddataTypeVerified ); // Data type // wlDataType = new Label( wgType, SWT.RIGHT ); wlDataType.setText( BaseMessages.getString( PKG, "ValidatorDialog.DataType.Label" ) ); props.setLook( wlDataType ); FormData fdlDataType = new FormData(); fdlDataType.left = new FormAttachment( 0, 0 ); fdlDataType.right = new FormAttachment( middle, -margin ); fdlDataType.top = new FormAttachment( wDataTypeVerified, margin ); wlDataType.setLayoutData( fdlDataType ); wDataType = new Combo( wgType, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); wDataType.setItems( ValueMetaFactory.getValueMetaNames() ); props.setLook( wDataType ); FormData fdDataType = new FormData(); fdDataType.left = new FormAttachment( middle, margin + extra ); fdDataType.right = new FormAttachment( 100, 0 ); fdDataType.top = new FormAttachment( wDataTypeVerified, margin ); wDataType.setLayoutData( fdDataType ); // Conversion mask // wlConversionMask = new Label( wgType, SWT.RIGHT ); wlConversionMask.setText( BaseMessages.getString( PKG, "ValidatorDialog.ConversionMask.Label" ) ); props.setLook( wlConversionMask ); FormData fdlConversionMask = new FormData(); fdlConversionMask.left = new FormAttachment( 0, 0 ); fdlConversionMask.right = new FormAttachment( middle, -margin ); fdlConversionMask.top = new FormAttachment( wDataType, margin ); wlConversionMask.setLayoutData( fdlConversionMask ); wConversionMask = new TextVarWarning( transMeta, wgType, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wConversionMask ); FormData fdConversionMask = new FormData(); fdConversionMask.left = new FormAttachment( middle, margin ); fdConversionMask.right = new FormAttachment( 100, 0 ); fdConversionMask.top = new FormAttachment( wDataType, margin ); wConversionMask.setLayoutData( fdConversionMask ); addSpacesWarning( wConversionMask ); // Decimal Symbol // wlDecimalSymbol = new Label( wgType, SWT.RIGHT ); wlDecimalSymbol.setText( BaseMessages.getString( PKG, "ValidatorDialog.DecimalSymbol.Label" ) ); props.setLook( wlDecimalSymbol ); FormData fdlDecimalSymbol = new FormData(); fdlDecimalSymbol.left = new FormAttachment( 0, 0 ); fdlDecimalSymbol.right = new FormAttachment( middle, -margin ); fdlDecimalSymbol.top = new FormAttachment( wConversionMask, margin ); wlDecimalSymbol.setLayoutData( fdlDecimalSymbol ); wDecimalSymbol = new TextVarWarning( transMeta, wgType, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wDecimalSymbol ); FormData fdDecimalSymbol = new FormData(); fdDecimalSymbol.left = new FormAttachment( middle, margin ); fdDecimalSymbol.right = new FormAttachment( 100, 0 ); fdDecimalSymbol.top = new FormAttachment( wConversionMask, margin ); wDecimalSymbol.setLayoutData( fdDecimalSymbol ); addSpacesWarning( wDecimalSymbol ); // Grouping Symbol // wlGroupingSymbol = new Label( wgType, SWT.RIGHT ); wlGroupingSymbol.setText( BaseMessages.getString( PKG, "ValidatorDialog.GroupingSymbol.Label" ) ); props.setLook( wlGroupingSymbol ); FormData fdlGroupingSymbol = new FormData(); fdlGroupingSymbol.left = new FormAttachment( 0, 0 ); fdlGroupingSymbol.right = new FormAttachment( middle, -margin ); fdlGroupingSymbol.top = new FormAttachment( wDecimalSymbol, margin ); wlGroupingSymbol.setLayoutData( fdlGroupingSymbol ); wGroupingSymbol = new TextVarWarning( transMeta, wgType, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wGroupingSymbol ); FormData fdGroupingSymbol = new FormData(); fdGroupingSymbol.left = new FormAttachment( middle, margin ); fdGroupingSymbol.right = new FormAttachment( 100, 0 ); fdGroupingSymbol.top = new FormAttachment( wDecimalSymbol, margin ); wGroupingSymbol.setLayoutData( fdGroupingSymbol ); addSpacesWarning( wGroupingSymbol ); // ///////////////////////////////////////////////////////////////////////////////////////////////// // // The data group... // // wgData = new Group( wComp, SWT.NONE ); props.setLook( wgData ); wgData.setText( BaseMessages.getString( PKG, "ValidatorDialog.DataGroup.Label" ) ); FormLayout dataGroupLayout = new FormLayout(); dataGroupLayout.marginHeight = Const.FORM_MARGIN; dataGroupLayout.marginWidth = Const.FORM_MARGIN; wgData.setLayout( dataGroupLayout ); FormData fdData = new FormData(); fdData.left = new FormAttachment( 0, 0 ); fdData.right = new FormAttachment( 100, 0 ); fdData.top = new FormAttachment( wgType, margin ); wgData.setLayoutData( fdData ); // Check for null? // wlNullAllowed = new Label( wgData, SWT.RIGHT ); wlNullAllowed.setText( BaseMessages.getString( PKG, "ValidatorDialog.NullAllowed.Label" ) ); props.setLook( wlNullAllowed ); FormData fdlNullAllowed = new FormData(); fdlNullAllowed.left = new FormAttachment( 0, 0 ); fdlNullAllowed.right = new FormAttachment( middle, -margin ); fdlNullAllowed.top = new FormAttachment( 0, 0 ); wlNullAllowed.setLayoutData( fdlNullAllowed ); wNullAllowed = new Button( wgData, SWT.CHECK ); props.setLook( wNullAllowed ); FormData fdNullAllowed = new FormData(); fdNullAllowed.left = new FormAttachment( middle, margin + extra ); fdNullAllowed.right = new FormAttachment( 100, 0 ); fdNullAllowed.top = new FormAttachment( 0, 0 ); wNullAllowed.setLayoutData( fdNullAllowed ); // Only null allowed? // wlOnlyNullAllowed = new Label( wgData, SWT.RIGHT ); wlOnlyNullAllowed.setText( BaseMessages.getString( PKG, "ValidatorDialog.OnlyNullAllowed.Label" ) ); props.setLook( wlOnlyNullAllowed ); FormData fdlOnlyNullAllowed = new FormData(); fdlOnlyNullAllowed.left = new FormAttachment( 0, 0 ); fdlOnlyNullAllowed.right = new FormAttachment( middle, -margin ); fdlOnlyNullAllowed.top = new FormAttachment( wNullAllowed, margin ); wlOnlyNullAllowed.setLayoutData( fdlOnlyNullAllowed ); wOnlyNullAllowed = new Button( wgData, SWT.CHECK ); props.setLook( wOnlyNullAllowed ); FormData fdOnlyNullAllowed = new FormData(); fdOnlyNullAllowed.left = new FormAttachment( middle, margin + extra ); fdOnlyNullAllowed.right = new FormAttachment( 100, 0 ); fdOnlyNullAllowed.top = new FormAttachment( wNullAllowed, margin ); wOnlyNullAllowed.setLayoutData( fdOnlyNullAllowed ); // Only numeric allowed? // wlOnlyNumeric = new Label( wgData, SWT.RIGHT ); wlOnlyNumeric.setText( BaseMessages.getString( PKG, "ValidatorDialog.OnlyNumeric.Label" ) ); props.setLook( wlOnlyNumeric ); FormData fdlOnlyNumeric = new FormData(); fdlOnlyNumeric.left = new FormAttachment( 0, 0 ); fdlOnlyNumeric.right = new FormAttachment( middle, -margin ); fdlOnlyNumeric.top = new FormAttachment( wOnlyNullAllowed, margin ); wlOnlyNumeric.setLayoutData( fdlOnlyNumeric ); wOnlyNumeric = new Button( wgData, SWT.CHECK ); props.setLook( wOnlyNumeric ); FormData fdOnlyNumeric = new FormData(); fdOnlyNumeric.left = new FormAttachment( middle, margin + extra ); fdOnlyNumeric.right = new FormAttachment( 100, 0 ); fdOnlyNumeric.top = new FormAttachment( wOnlyNullAllowed, margin ); wOnlyNumeric.setLayoutData( fdOnlyNumeric ); // Maximum length // wlMaxLength = new Label( wgData, SWT.RIGHT ); wlMaxLength.setText( BaseMessages.getString( PKG, "ValidatorDialog.MaxLength.Label" ) ); props.setLook( wlMaxLength ); FormData fdlMaxLength = new FormData(); fdlMaxLength.left = new FormAttachment( 0, 0 ); fdlMaxLength.right = new FormAttachment( middle, -margin ); fdlMaxLength.top = new FormAttachment( wOnlyNumeric, margin ); wlMaxLength.setLayoutData( fdlMaxLength ); wMaxLength = new TextVarWarning( transMeta, wgData, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wMaxLength ); FormData fdMaxLength = new FormData(); fdMaxLength.left = new FormAttachment( middle, margin ); fdMaxLength.right = new FormAttachment( 100, 0 ); fdMaxLength.top = new FormAttachment( wOnlyNumeric, margin ); wMaxLength.setLayoutData( fdMaxLength ); addSpacesWarning( wMaxLength ); // Minimum length // wlMinLength = new Label( wgData, SWT.RIGHT ); wlMinLength.setText( BaseMessages.getString( PKG, "ValidatorDialog.MinLength.Label" ) ); props.setLook( wlMinLength ); FormData fdlMinLength = new FormData(); fdlMinLength.left = new FormAttachment( 0, 0 ); fdlMinLength.right = new FormAttachment( middle, -margin ); fdlMinLength.top = new FormAttachment( wMaxLength, margin ); wlMinLength.setLayoutData( fdlMinLength ); wMinLength = new TextVarWarning( transMeta, wgData, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wMinLength ); FormData fdMinLength = new FormData(); fdMinLength.left = new FormAttachment( middle, margin ); fdMinLength.right = new FormAttachment( 100, 0 ); fdMinLength.top = new FormAttachment( wMaxLength, margin ); wMinLength.setLayoutData( fdMinLength ); addSpacesWarning( wMinLength ); // Maximum value // wlMaxValue = new Label( wgData, SWT.RIGHT ); wlMaxValue.setText( BaseMessages.getString( PKG, "ValidatorDialog.MaxValue.Label" ) ); props.setLook( wlMaxValue ); FormData fdlMaxValue = new FormData(); fdlMaxValue.left = new FormAttachment( 0, 0 ); fdlMaxValue.right = new FormAttachment( middle, -margin ); fdlMaxValue.top = new FormAttachment( wMinLength, margin ); wlMaxValue.setLayoutData( fdlMaxValue ); wMaxValue = new TextVarWarning( transMeta, wgData, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wMaxValue ); FormData fdMaxValue = new FormData(); fdMaxValue.left = new FormAttachment( middle, margin ); fdMaxValue.right = new FormAttachment( 100, 0 ); fdMaxValue.top = new FormAttachment( wMinLength, margin ); wMaxValue.setLayoutData( fdMaxValue ); addSpacesWarning( wMaxValue ); // Minimum value // wlMinValue = new Label( wgData, SWT.RIGHT ); wlMinValue.setText( BaseMessages.getString( PKG, "ValidatorDialog.MinValue.Label" ) ); props.setLook( wlMinValue ); FormData fdlMinValue = new FormData(); fdlMinValue.left = new FormAttachment( 0, 0 ); fdlMinValue.right = new FormAttachment( middle, -margin ); fdlMinValue.top = new FormAttachment( wMaxValue, margin ); wlMinValue.setLayoutData( fdlMinValue ); wMinValue = new TextVarWarning( transMeta, wgData, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wMinValue ); FormData fdMinValue = new FormData(); fdMinValue.left = new FormAttachment( middle, margin ); fdMinValue.right = new FormAttachment( 100, 0 ); fdMinValue.top = new FormAttachment( wMaxValue, margin ); wMinValue.setLayoutData( fdMinValue ); addSpacesWarning( wMinValue ); // Expected start string // wlStartStringExpected = new Label( wgData, SWT.RIGHT ); wlStartStringExpected.setText( BaseMessages.getString( PKG, "ValidatorDialog.StartStringExpected.Label" ) ); props.setLook( wlStartStringExpected ); FormData fdlStartStringExpected = new FormData(); fdlStartStringExpected.left = new FormAttachment( 0, 0 ); fdlStartStringExpected.right = new FormAttachment( middle, -margin ); fdlStartStringExpected.top = new FormAttachment( wMinValue, margin ); wlStartStringExpected.setLayoutData( fdlStartStringExpected ); wStartStringExpected = new TextVarWarning( transMeta, wgData, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wStartStringExpected ); FormData fdStartStringExpected = new FormData(); fdStartStringExpected.left = new FormAttachment( middle, margin ); fdStartStringExpected.right = new FormAttachment( 100, 0 ); fdStartStringExpected.top = new FormAttachment( wMinValue, margin ); wStartStringExpected.setLayoutData( fdStartStringExpected ); addSpacesWarning( wStartStringExpected ); // Expected End string // wlEndStringExpected = new Label( wgData, SWT.RIGHT ); wlEndStringExpected.setText( BaseMessages.getString( PKG, "ValidatorDialog.EndStringExpected.Label" ) ); props.setLook( wlEndStringExpected ); FormData fdlEndStringExpected = new FormData(); fdlEndStringExpected.left = new FormAttachment( 0, 0 ); fdlEndStringExpected.right = new FormAttachment( middle, -margin ); fdlEndStringExpected.top = new FormAttachment( wStartStringExpected, margin ); wlEndStringExpected.setLayoutData( fdlEndStringExpected ); wEndStringExpected = new TextVarWarning( transMeta, wgData, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wEndStringExpected ); FormData fdEndStringExpected = new FormData(); fdEndStringExpected.left = new FormAttachment( middle, margin ); fdEndStringExpected.right = new FormAttachment( 100, 0 ); fdEndStringExpected.top = new FormAttachment( wStartStringExpected, margin ); wEndStringExpected.setLayoutData( fdEndStringExpected ); addSpacesWarning( wEndStringExpected ); // Disallowed start string // wlStartStringDisallowed = new Label( wgData, SWT.RIGHT ); wlStartStringDisallowed.setText( BaseMessages.getString( PKG, "ValidatorDialog.StartStringDisallowed.Label" ) ); props.setLook( wlStartStringDisallowed ); FormData fdlStartStringDisallowed = new FormData(); fdlStartStringDisallowed.left = new FormAttachment( 0, 0 ); fdlStartStringDisallowed.right = new FormAttachment( middle, -margin ); fdlStartStringDisallowed.top = new FormAttachment( wEndStringExpected, margin ); wlStartStringDisallowed.setLayoutData( fdlStartStringDisallowed ); wStartStringDisallowed = new TextVarWarning( transMeta, wgData, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wStartStringDisallowed ); FormData fdStartStringDisallowed = new FormData(); fdStartStringDisallowed.left = new FormAttachment( middle, margin ); fdStartStringDisallowed.right = new FormAttachment( 100, 0 ); fdStartStringDisallowed.top = new FormAttachment( wEndStringExpected, margin ); wStartStringDisallowed.setLayoutData( fdStartStringDisallowed ); addSpacesWarning( wStartStringDisallowed ); // Disallowed End string // wlEndStringDisallowed = new Label( wgData, SWT.RIGHT ); wlEndStringDisallowed.setText( BaseMessages.getString( PKG, "ValidatorDialog.EndStringDisallowed.Label" ) ); props.setLook( wlEndStringDisallowed ); FormData fdlEndStringDisallowed = new FormData(); fdlEndStringDisallowed.left = new FormAttachment( 0, 0 ); fdlEndStringDisallowed.right = new FormAttachment( middle, -margin ); fdlEndStringDisallowed.top = new FormAttachment( wStartStringDisallowed, margin ); wlEndStringDisallowed.setLayoutData( fdlEndStringDisallowed ); wEndStringDisallowed = new TextVarWarning( transMeta, wgData, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wEndStringDisallowed ); FormData fdEndStringDisallowed = new FormData(); fdEndStringDisallowed.left = new FormAttachment( middle, margin ); fdEndStringDisallowed.right = new FormAttachment( 100, 0 ); fdEndStringDisallowed.top = new FormAttachment( wStartStringDisallowed, margin ); wEndStringDisallowed.setLayoutData( fdEndStringDisallowed ); addSpacesWarning( wEndStringDisallowed ); // Expected regular expression // wlRegExpExpected = new Label( wgData, SWT.RIGHT ); wlRegExpExpected.setText( BaseMessages.getString( PKG, "ValidatorDialog.RegExpExpected.Label" ) ); props.setLook( wlRegExpExpected ); FormData fdlRegExpExpected = new FormData(); fdlRegExpExpected.left = new FormAttachment( 0, 0 ); fdlRegExpExpected.right = new FormAttachment( middle, -margin ); fdlRegExpExpected.top = new FormAttachment( wEndStringDisallowed, margin ); wlRegExpExpected.setLayoutData( fdlRegExpExpected ); wRegExpExpected = new TextVarWarning( transMeta, wgData, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wRegExpExpected ); FormData fdRegExpExpected = new FormData(); fdRegExpExpected.left = new FormAttachment( middle, margin ); fdRegExpExpected.right = new FormAttachment( 100, 0 ); fdRegExpExpected.top = new FormAttachment( wEndStringDisallowed, margin ); wRegExpExpected.setLayoutData( fdRegExpExpected ); addSpacesWarning( wRegExpExpected ); // Disallowed regular expression // wlRegExpDisallowed = new Label( wgData, SWT.RIGHT ); wlRegExpDisallowed.setText( BaseMessages.getString( PKG, "ValidatorDialog.RegExpDisallowed.Label" ) ); props.setLook( wlRegExpDisallowed ); FormData fdlRegExpDisallowed = new FormData(); fdlRegExpDisallowed.left = new FormAttachment( 0, 0 ); fdlRegExpDisallowed.right = new FormAttachment( middle, -margin ); fdlRegExpDisallowed.top = new FormAttachment( wRegExpExpected, margin ); wlRegExpDisallowed.setLayoutData( fdlRegExpDisallowed ); wRegExpDisallowed = new TextVarWarning( transMeta, wgData, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wRegExpDisallowed ); FormData fdRegExpDisallowed = new FormData(); fdRegExpDisallowed.left = new FormAttachment( middle, margin ); fdRegExpDisallowed.right = new FormAttachment( 100, 0 ); fdRegExpDisallowed.top = new FormAttachment( wRegExpExpected, margin ); wRegExpDisallowed.setLayoutData( fdRegExpDisallowed ); addSpacesWarning( wRegExpDisallowed ); // Allowed values: a list box. // // Add an entry // wbAddAllowed = new Button( wgData, SWT.PUSH ); wbAddAllowed.setText( BaseMessages.getString( PKG, "ValidatorDialog.ButtonAddAllowed.Label" ) ); FormData fdbAddAllowed = new FormData(); fdbAddAllowed.right = new FormAttachment( 100, 0 ); fdbAddAllowed.top = new FormAttachment( wRegExpDisallowed, margin ); wbAddAllowed.setLayoutData( fdbAddAllowed ); wbAddAllowed.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { addAllowedValue(); } } ); // Remove an entry // wbRemoveAllowed = new Button( wgData, SWT.PUSH ); wbRemoveAllowed.setText( BaseMessages.getString( PKG, "ValidatorDialog.ButtonRemoveAllowed.Label" ) ); FormData fdbRemoveAllowed = new FormData(); fdbRemoveAllowed.right = new FormAttachment( 100, 0 ); fdbRemoveAllowed.top = new FormAttachment( wbAddAllowed, margin ); wbRemoveAllowed.setLayoutData( fdbRemoveAllowed ); wbRemoveAllowed.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { removeAllowedValue(); } } ); wlAllowedValues = new Label( wgData, SWT.RIGHT ); wlAllowedValues.setText( BaseMessages.getString( PKG, "ValidatorDialog.AllowedValues.Label" ) ); props.setLook( wlAllowedValues ); FormData fdlAllowedValues = new FormData(); fdlAllowedValues.left = new FormAttachment( 0, 0 ); fdlAllowedValues.right = new FormAttachment( middle, -margin ); fdlAllowedValues.top = new FormAttachment( wRegExpDisallowed, margin ); wlAllowedValues.setLayoutData( fdlAllowedValues ); wAllowedValues = new List( wgData, SWT.MULTI | SWT.LEFT | SWT.BORDER ); props.setLook( wAllowedValues ); FormData fdAllowedValues = new FormData(); fdAllowedValues.left = new FormAttachment( middle, margin + extra ); fdAllowedValues.right = new FormAttachment( wbRemoveAllowed, -20 ); fdAllowedValues.top = new FormAttachment( wRegExpDisallowed, margin ); fdAllowedValues.bottom = new FormAttachment( wRegExpDisallowed, 150 ); wAllowedValues.setLayoutData( fdAllowedValues ); // Source allowed values from another step? // wlSourceValues = new Label( wgData, SWT.RIGHT ); wlSourceValues.setText( BaseMessages.getString( PKG, "ValidatorDialog.SourceValues.Label" ) ); props.setLook( wlSourceValues ); FormData fdlSourceValues = new FormData(); fdlSourceValues.left = new FormAttachment( 0, 0 ); fdlSourceValues.right = new FormAttachment( middle, -margin ); fdlSourceValues.top = new FormAttachment( wAllowedValues, margin ); wlSourceValues.setLayoutData( fdlSourceValues ); wSourceValues = new Button( wgData, SWT.CHECK ); props.setLook( wSourceValues ); FormData fdSourceValues = new FormData(); fdSourceValues.left = new FormAttachment( middle, margin + extra ); fdSourceValues.right = new FormAttachment( 100, 0 ); fdSourceValues.top = new FormAttachment( wAllowedValues, margin ); wSourceValues.setLayoutData( fdSourceValues ); wSourceValues.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent arg0 ) { enableFields(); } } ); // Source allowed values : source step // wlSourceStep = new Label( wgData, SWT.RIGHT ); wlSourceStep.setText( BaseMessages.getString( PKG, "ValidatorDialog.SourceStep.Label" ) ); props.setLook( wlSourceStep ); FormData fdlSourceStep = new FormData(); fdlSourceStep.left = new FormAttachment( 0, margin ); fdlSourceStep.right = new FormAttachment( middle, -margin ); fdlSourceStep.top = new FormAttachment( wSourceValues, margin ); wlSourceStep.setLayoutData( fdlSourceStep ); wSourceStep = new Combo( wgData, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wSourceStep ); FormData fdSourceStep = new FormData(); fdSourceStep.left = new FormAttachment( middle, margin + extra ); fdSourceStep.right = new FormAttachment( 100, 0 ); fdSourceStep.top = new FormAttachment( wSourceValues, margin ); wSourceStep.setLayoutData( fdSourceStep ); wSourceStep.addFocusListener( new FocusAdapter() { public void focusGained( org.eclipse.swt.events.FocusEvent e ) { getSteps(); } } ); wSourceStep.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent arg0 ) { getSteps(); } } ); // Source allowed values : source field // wlSourceField = new Label( wgData, SWT.RIGHT ); wlSourceField.setText( BaseMessages.getString( PKG, "ValidatorDialog.SourceField.Label" ) ); props.setLook( wlSourceField ); FormData fdlSourceField = new FormData(); fdlSourceField.left = new FormAttachment( 0, margin ); fdlSourceField.right = new FormAttachment( middle, -margin ); fdlSourceField.top = new FormAttachment( wSourceStep, margin ); wlSourceField.setLayoutData( fdlSourceField ); wSourceField = new Combo( wgData, SWT.SINGLE | SWT.LEFT | SWT.BORDER ); props.setLook( wSourceField ); FormData fdSourceField = new FormData(); fdSourceField.left = new FormAttachment( middle, margin + extra ); fdSourceField.right = new FormAttachment( 100, 0 ); fdSourceField.top = new FormAttachment( wSourceStep, margin ); wSourceField.setLayoutData( fdSourceField ); wSourceField.addFocusListener( new FocusAdapter() { public void focusGained( org.eclipse.swt.events.FocusEvent e ) { getFields(); } } ); wSourceField.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent arg0 ) { getFields(); } } ); wComp.layout(); wComp.pack(); Rectangle bounds = wComp.getBounds(); wSComp.setContent( wComp ); wSComp.setExpandHorizontal( true ); wSComp.setExpandVertical( true ); wSComp.setMinWidth( bounds.width ); wSComp.setMinHeight( bounds.height ); // Add listeners lsCancel = new Listener() { public void handleEvent( Event e ) { cancel(); } }; lsOK = new Listener() { public void handleEvent( Event e ) { ok(); } }; wCancel.addListener( SWT.Selection, lsCancel ); wOK.addListener( SWT.Selection, lsOK ); wClear.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { // Clear the validation rules for a certain field... // int index = wValidationsList.getSelectionIndex(); if ( index >= 0 ) { selectionList.remove( index ); selectedField = null; wValidationsList.remove( index ); enableFields(); } } } ); wNew.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { // Create a new validation rule page ... // EnterStringDialog enterStringDialog = new EnterStringDialog( shell, "", BaseMessages.getString( PKG, "ValidatorDialog.EnterValidationRuleName.Title" ), BaseMessages.getString( PKG, "ValidatorDialog.EnterValidationRuleName.Message" ) ); String description = enterStringDialog.open(); if ( description != null ) { if ( Validation.findValidation( selectionList, description ) != null ) { MessageBox messageBox = new MessageBox( shell, SWT.ICON_ERROR ); //CHECKSTYLE:LineLength:OFF messageBox.setText( BaseMessages.getString( PKG, "ValidatorDialog.ValidationRuleNameAlreadyExists.Title" ) ); messageBox.setMessage( BaseMessages.getString( PKG, "ValidatorDialog.ValidationRuleNameAlreadyExists.Message" ) ); messageBox.open(); return; } saveChanges(); Validation validation = new Validation(); validation.setName( description ); selectionList.add( validation ); selectedField = validation; refreshValidationsList(); wValidationsList.select( selectionList.size() - 1 ); getValidatorFieldData( validation ); } } } ); lsDef = new SelectionAdapter() { public void widgetDefaultSelected( SelectionEvent e ) { ok(); } }; wStepname.addSelectionListener( lsDef ); wConversionMask.addSelectionListener( lsDef ); wGroupingSymbol.addSelectionListener( lsDef ); wDecimalSymbol.addSelectionListener( lsDef ); wMaxLength.addSelectionListener( lsDef ); wMinLength.addSelectionListener( lsDef ); wMaxValue.addSelectionListener( lsDef ); wMinValue.addSelectionListener( lsDef ); // Detect X or ALT-F4 or something that kills this window... shell.addShellListener( new ShellAdapter() { public void shellClosed( ShellEvent e ) { cancel(); } } ); // Set the shell size, based upon previous time... setSize(); getData(); input.setChanged( changed ); shell.open(); while ( !shell.isDisposed() ) { if ( !display.readAndDispatch() ) { display.sleep(); } } return stepname; } protected void setFlags() { wConcatErrors.setEnabled( wValidateAll.getSelection() ); wConcatSeparator.setEnabled( wConcatErrors.getSelection() ); } private void addSpacesWarning( SupportsWarningInterface warningText ) { warningText.addWarningInterface( new WarningInterface() { public WarningMessageInterface getWarningSituation( String text, Control widget, Object subject ) { return new SimpleWarningMessage( spacesValidation( text ), BaseMessages.getString( PKG, "System.Warning.OnlySpaces" ) ); } } ); warningText.addWarningInterface( new WarningInterface() { public WarningMessageInterface getWarningSituation( String text, Control widget, Object subject ) { return new SimpleWarningMessage( text != null && text.endsWith( " " ), BaseMessages.getString( PKG, "System.Warning.TrailingSpaces" ) ); } } ); } public boolean spacesValidation( String text ) { return Const.onlySpaces( text ) && !Utils.isEmpty( text ); } /** * Remove the selected entries from the allowed entries */ protected void removeAllowedValue() { String[] selection = wAllowedValues.getSelection(); for ( String string : selection ) { wAllowedValues.remove( string ); } } /** * Add one entry to the list of allowed values... */ protected void addAllowedValue() { EnterStringDialog dialog = new EnterStringDialog( shell, "", BaseMessages.getString( PKG, "ValidatorDialog.Dialog.AddAllowedValue.Title" ), BaseMessages.getString( PKG, "ValidatorDialog.Dialog.AddAllowedValue.Message" ), true, transMeta ); String value = dialog.open(); if ( !Utils.isEmpty( value ) ) { wAllowedValues.add( value ); } } private void getValidatorFieldData( Validation field ) { wDescription.setText( Const.NVL( field.getName(), "" ) ); wFieldName.setText( Const.NVL( field.getFieldName(), "" ) ); wErrorCode.setText( Const.NVL( field.getErrorCode(), "" ) ); wErrorDescription.setText( Const.NVL( field.getErrorDescription(), "" ) ); wDataTypeVerified.setSelection( field.isDataTypeVerified() ); wDataType.setText( ValueMetaFactory.getValueMetaName( field.getDataType() ) ); wConversionMask.setText( Const.NVL( field.getConversionMask(), "" ) ); wDecimalSymbol.setText( Const.NVL( field.getDecimalSymbol(), "" ) ); wGroupingSymbol.setText( Const.NVL( field.getGroupingSymbol(), "" ) ); wNullAllowed.setSelection( field.isNullAllowed() ); wOnlyNullAllowed.setSelection( field.isOnlyNullAllowed() ); wOnlyNumeric.setSelection( field.isOnlyNumericAllowed() ); wMaxLength.setText( Const.NVL( field.getMaximumLength(), "" ) ); wMinLength.setText( Const.NVL( field.getMinimumLength(), "" ) ); wMaxValue.setText( Const.NVL( field.getMaximumValue(), "" ) ); wMinValue.setText( Const.NVL( field.getMinimumValue(), "" ) ); wStartStringExpected.setText( Const.NVL( field.getStartString(), "" ) ); wEndStringExpected.setText( Const.NVL( field.getEndString(), "" ) ); wStartStringDisallowed.setText( Const.NVL( field.getStartStringNotAllowed(), "" ) ); wEndStringDisallowed.setText( Const.NVL( field.getEndStringNotAllowed(), "" ) ); wRegExpExpected.setText( Const.NVL( field.getRegularExpression(), "" ) ); wRegExpDisallowed.setText( Const.NVL( field.getRegularExpressionNotAllowed(), "" ) ); wAllowedValues.removeAll(); if ( field.getAllowedValues() != null ) { for ( String allowedValue : field.getAllowedValues() ) { wAllowedValues.add( Const.NVL( allowedValue, "" ) ); } } wSourceValues.setSelection( field.isSourcingValues() ); wSourceStep.setText( Const.NVL( field.getSourcingStepName(), "" ) ); wSourceField.setText( Const.NVL( field.getSourcingField(), "" ) ); } private void enableFields() { boolean visible = selectedField != null; wgType.setVisible( visible ); wgData.setVisible( visible ); wlFieldName.setVisible( visible ); wFieldName.setVisible( visible ); wlDescription.setVisible( visible ); wDescription.setVisible( visible ); wlErrorCode.setVisible( visible ); wErrorCode.setVisible( visible ); wlErrorDescription.setVisible( visible ); wErrorDescription.setVisible( visible ); wlSourceStep.setEnabled( wSourceValues.getSelection() ); wSourceStep.setEnabled( wSourceValues.getSelection() ); wlSourceField.setEnabled( wSourceValues.getSelection() ); wSourceField.setEnabled( wSourceValues.getSelection() ); wlAllowedValues.setEnabled( !wSourceValues.getSelection() ); wAllowedValues.setEnabled( !wSourceValues.getSelection() ); wbAddAllowed.setEnabled( !wSourceValues.getSelection() ); wbRemoveAllowed.setEnabled( !wSourceValues.getSelection() ); } private void showSelectedValidatorField( String selection ) { // Someone hit a field... // saveChanges(); Validation field = Validation.findValidation( selectionList, selection ); if ( field == null ) { field = new Validation( selection ); ValueMetaInterface valueMeta = inputFields.searchValueMeta( selection ); if ( valueMeta != null ) { // Set the default data type // field.setDataType( valueMeta.getType() ); } } selectedField = field; getValidatorFieldData( selectedField ); enableFields(); } private void saveChanges() { if ( selectedField != null ) { // First grab the info from the dialog... // selectedField.setFieldName( wFieldName.getText() ); selectedField.setErrorCode( wErrorCode.getText() ); selectedField.setErrorDescription( wErrorDescription.getText() ); selectedField.setDataTypeVerified( wDataTypeVerified.getSelection() ); selectedField.setDataType( ValueMetaFactory.getIdForValueMeta( wDataType.getText() ) ); selectedField.setConversionMask( wConversionMask.getText() ); selectedField.setDecimalSymbol( wDecimalSymbol.getText() ); selectedField.setGroupingSymbol( wGroupingSymbol.getText() ); selectedField.setNullAllowed( wNullAllowed.getSelection() ); selectedField.setOnlyNullAllowed( wOnlyNullAllowed.getSelection() ); selectedField.setOnlyNumericAllowed( wOnlyNumeric.getSelection() ); selectedField.setMaximumLength( wMaxLength.getText() ); selectedField.setMinimumLength( wMinLength.getText() ); selectedField.setMaximumValue( wMaxValue.getText() ); selectedField.setMinimumValue( wMinValue.getText() ); selectedField.setStartString( wStartStringExpected.getText() ); selectedField.setEndString( wEndStringExpected.getText() ); selectedField.setStartStringNotAllowed( wStartStringDisallowed.getText() ); selectedField.setEndStringNotAllowed( wEndStringDisallowed.getText() ); selectedField.setRegularExpression( wRegExpExpected.getText() ); selectedField.setRegularExpressionNotAllowed( wRegExpDisallowed.getText() ); selectedField.setAllowedValues( wAllowedValues.getItems() ); selectedField.setSourcingValues( wSourceValues.getSelection() ); selectedField.setSourcingField( wSourceField.getText() ); selectedField.setSourcingStep( transMeta.findStep( wSourceStep.getText() ) ); // Save the old info in the map // // selectionList.add(selectedField); } } /** * Copy information from the meta-data input to the dialog fields. */ public void getData() { // Populate the list of validations... // refreshValidationsList(); enableFields(); wValidateAll.setSelection( input.isValidatingAll() ); wConcatErrors.setSelection( input.isConcatenatingErrors() ); wConcatSeparator.setText( Const.NVL( input.getConcatenationSeparator(), "" ) ); // Select the first available field... // if ( input.getValidations().size() > 0 ) { Validation validatorField = input.getValidations().get( 0 ); String description = validatorField.getName(); int index = wValidationsList.indexOf( description ); if ( index >= 0 ) { wValidationsList.select( index ); showSelectedValidatorField( description ); } } setFlags(); wStepname.selectAll(); wStepname.setFocus(); } private void refreshValidationsList() { wValidationsList.removeAll(); for ( Validation validation : selectionList ) { wValidationsList.add( validation.getName() ); } } private void cancel() { stepname = null; input.setChanged( changed ); dispose(); } private void ok() { if ( Utils.isEmpty( wStepname.getText() ) ) { return; } stepname = wStepname.getText(); // return value saveChanges(); input.setChanged(); input.setValidatingAll( wValidateAll.getSelection() ); input.setConcatenatingErrors( wConcatErrors.getSelection() ); input.setConcatenationSeparator( wConcatSeparator.getText() ); input.setValidations( selectionList ); dispose(); } private void getSteps() { Cursor busy = new Cursor( shell.getDisplay(), SWT.CURSOR_WAIT ); shell.setCursor( busy ); String fieldStep = wSourceStep.getText(); wSourceStep.removeAll(); wSourceStep.setItems( transMeta.getPrevStepNames( stepMeta ) ); wSourceStep.setText( fieldStep ); shell.setCursor( null ); busy.dispose(); } private void getFields() { Cursor busy = new Cursor( shell.getDisplay(), SWT.CURSOR_WAIT ); shell.setCursor( busy ); try { String sourceStepName = wSourceStep.getText(); if ( !Utils.isEmpty( sourceStepName ) ) { String fieldName = wSourceField.getText(); RowMetaInterface r = transMeta.getStepFields( sourceStepName ); if ( r != null ) { wSourceField.setItems( r.getFieldNames() ); } wSourceField.setText( fieldName ); } shell.setCursor( null ); busy.dispose(); } catch ( KettleException ke ) { shell.setCursor( null ); busy.dispose(); new ErrorDialog( shell, BaseMessages.getString( PKG, "ValidatorDialog.FailedToGetFields.DialogTitle" ), BaseMessages .getString( PKG, "ValidatorDialog.FailedToGetFields.DialogMessage" ), ke ); } } }