/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2013 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.step;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
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.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.Composite;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.pentaho.di.core.Const;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.StepErrorMeta;
import org.pentaho.di.trans.step.StepInterface;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.ui.core.PropsUI;
import org.pentaho.di.ui.core.gui.GUIResource;
import org.pentaho.di.ui.core.gui.WindowProperty;
import org.pentaho.di.ui.core.widget.TextVar;
/**
*
* Dialog that allows you to edit the step error handling meta-data
*
* @author Matt
* @since 31-10-2006
*
*/
public class StepErrorMetaDialog extends Dialog {
private static Class<?> PKG = StepInterface.class; // for i18n purposes, needed by Translator2!!
private StepErrorMeta stepErrorMeta;
private List<StepMeta> targetSteps;
private Composite composite;
private Shell shell;
// Service
private Text wSourceStep;
private CCombo wTargetStep;
private Button wEnabled;
private TextVar wNrErrors, wErrDesc, wErrFields, wErrCodes;
private TextVar wMaxErrors, wMaxPct, wMinPctRows;
private Button wOK, wCancel;
private ModifyListener lsMod;
private PropsUI props;
private int middle;
private int margin;
private StepErrorMeta originalStepErrorMeta;
private boolean ok;
private TransMeta transMeta;
public StepErrorMetaDialog( Shell par, StepErrorMeta stepErrorMeta, TransMeta transMeta,
List<StepMeta> targetSteps ) {
super( par, SWT.NONE );
this.stepErrorMeta = stepErrorMeta.clone();
this.originalStepErrorMeta = stepErrorMeta;
this.targetSteps = targetSteps;
this.transMeta = transMeta;
props = PropsUI.getInstance();
ok = false;
}
public boolean open() {
Shell parent = getParent();
shell = new Shell( parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN );
props.setLook( shell );
lsMod = new ModifyListener() {
public void modifyText( ModifyEvent e ) {
stepErrorMeta.setChanged();
}
};
middle = props.getMiddlePct();
margin = Const.MARGIN;
FormLayout formLayout = new FormLayout();
formLayout.marginWidth = Const.FORM_MARGIN;
formLayout.marginHeight = Const.FORM_MARGIN;
shell.setText( BaseMessages.getString( PKG, "BaseStepDialog.ErrorHandling.Title.Label" ) );
shell.setImage( GUIResource.getInstance().getImageTransGraph() );
shell.setLayout( formLayout );
// First, add the buttons...
// Buttons
wOK = new Button( shell, SWT.PUSH );
wOK.setText( " &OK " );
wCancel = new Button( shell, SWT.PUSH );
wCancel.setText( " &Cancel " );
Button[] buttons = new Button[] { wOK, wCancel };
BaseStepDialog.positionBottomButtons( shell, buttons, margin, null );
// The rest stays above the buttons...
composite = new Composite( shell, SWT.NONE );
props.setLook( composite );
composite.setLayout( new FormLayout() );
// What's the source step
Label wlSourceStep = new Label( composite, SWT.RIGHT );
props.setLook( wlSourceStep );
wlSourceStep.setText( BaseMessages.getString( PKG, "BaseStepDialog.ErrorHandling.StepName.Label" ) );
FormData fdlSourceStep = new FormData();
fdlSourceStep.top = new FormAttachment( 0, 0 );
fdlSourceStep.left = new FormAttachment( 0, 0 ); // First one in the left top corner
fdlSourceStep.right = new FormAttachment( middle, -margin );
wlSourceStep.setLayoutData( fdlSourceStep );
wSourceStep = new Text( composite, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wSourceStep );
wSourceStep.addModifyListener( lsMod );
FormData fdSourceStep = new FormData();
fdSourceStep.top = new FormAttachment( 0, 0 );
fdSourceStep.left = new FormAttachment( middle, 0 ); // To the right of the label
fdSourceStep.right = new FormAttachment( 95, 0 );
wSourceStep.setLayoutData( fdSourceStep );
wSourceStep.setEnabled( false );
// What's the target step
Label wlTargetStep = new Label( composite, SWT.RIGHT );
props.setLook( wlTargetStep );
wlTargetStep.setText( BaseMessages.getString( PKG, "BaseStepDialog.ErrorHandling.TargetStep.Label" ) );
FormData fdlTargetStep = new FormData();
fdlTargetStep.top = new FormAttachment( wSourceStep, margin );
fdlTargetStep.left = new FormAttachment( 0, 0 ); // First one in the left top corner
fdlTargetStep.right = new FormAttachment( middle, -margin );
wlTargetStep.setLayoutData( fdlTargetStep );
wTargetStep = new CCombo( composite, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wTargetStep );
wTargetStep.addModifyListener( lsMod );
FormData fdTargetStep = new FormData();
fdTargetStep.top = new FormAttachment( wSourceStep, margin );
fdTargetStep.left = new FormAttachment( middle, 0 ); // To the right of the label
fdTargetStep.right = new FormAttachment( 95, 0 );
wTargetStep.setLayoutData( fdTargetStep );
for ( int i = 0; i < targetSteps.size(); i++ ) {
wTargetStep.add( targetSteps.get( i ).getName() );
}
// is the error handling enabled?
Label wlEnabled = new Label( composite, SWT.RIGHT );
props.setLook( wlEnabled );
wlEnabled.setText( BaseMessages.getString( PKG, "BaseStepDialog.ErrorHandling.Enable.Label" ) );
FormData fdlEnabled = new FormData();
fdlEnabled.top = new FormAttachment( wTargetStep, margin );
fdlEnabled.left = new FormAttachment( 0, 0 ); // First one in the left top corner
fdlEnabled.right = new FormAttachment( middle, -margin );
wlEnabled.setLayoutData( fdlEnabled );
wEnabled = new Button( composite, SWT.CHECK );
props.setLook( wEnabled );
FormData fdEnabled = new FormData();
fdEnabled.top = new FormAttachment( wTargetStep, margin );
fdEnabled.left = new FormAttachment( middle, 0 ); // To the right of the label
wEnabled.setLayoutData( fdEnabled );
// What's the field for the nr of errors
Label wlNrErrors = new Label( composite, SWT.RIGHT );
props.setLook( wlNrErrors );
wlNrErrors.setText( BaseMessages.getString( PKG, "BaseStepDialog.ErrorHandling.NrErrField.Label" ) );
FormData fdlNrErrors = new FormData();
fdlNrErrors.top = new FormAttachment( wEnabled, margin * 2 );
fdlNrErrors.left = new FormAttachment( 0, 0 ); // First one in the left top corner
fdlNrErrors.right = new FormAttachment( middle, -margin );
wlNrErrors.setLayoutData( fdlNrErrors );
wNrErrors = new TextVar( transMeta, composite, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wNrErrors );
wNrErrors.addModifyListener( lsMod );
FormData fdNrErrors = new FormData();
fdNrErrors.top = new FormAttachment( wEnabled, margin * 2 );
fdNrErrors.left = new FormAttachment( middle, 0 ); // To the right of the label
fdNrErrors.right = new FormAttachment( 95, 0 );
wNrErrors.setLayoutData( fdNrErrors );
// What's the field for the error descriptions
Label wlErrDesc = new Label( composite, SWT.RIGHT );
props.setLook( wlErrDesc );
wlErrDesc.setText( BaseMessages.getString( PKG, "BaseStepDialog.ErrorHandling.ErrDescField.Label" ) );
FormData fdlErrDesc = new FormData();
fdlErrDesc.top = new FormAttachment( wNrErrors, margin );
fdlErrDesc.left = new FormAttachment( 0, 0 ); // First one in the left top corner
fdlErrDesc.right = new FormAttachment( middle, -margin );
wlErrDesc.setLayoutData( fdlErrDesc );
wErrDesc = new TextVar( transMeta, composite, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wErrDesc );
wErrDesc.addModifyListener( lsMod );
FormData fdErrDesc = new FormData();
fdErrDesc.top = new FormAttachment( wNrErrors, margin );
fdErrDesc.left = new FormAttachment( middle, 0 ); // To the right of the label
fdErrDesc.right = new FormAttachment( 95, 0 );
wErrDesc.setLayoutData( fdErrDesc );
// What's the field for the error fields
Label wlErrFields = new Label( composite, SWT.RIGHT );
wlErrFields.setText( BaseMessages.getString( PKG, "BaseStepDialog.ErrorHandling.ErrFieldName.Label" ) );
props.setLook( wlErrFields );
FormData fdlErrFields = new FormData();
fdlErrFields.top = new FormAttachment( wErrDesc, margin );
fdlErrFields.left = new FormAttachment( 0, 0 );
fdlErrFields.right = new FormAttachment( middle, -margin );
wlErrFields.setLayoutData( fdlErrFields );
wErrFields = new TextVar( transMeta, composite, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wErrFields );
wErrFields.addModifyListener( lsMod );
FormData fdErrFields = new FormData();
fdErrFields.top = new FormAttachment( wErrDesc, margin );
fdErrFields.left = new FormAttachment( middle, 0 );
fdErrFields.right = new FormAttachment( 95, 0 );
wErrFields.setLayoutData( fdErrFields );
// What's the fieldname for the error codes field
Label wlErrCodes = new Label( composite, SWT.RIGHT );
wlErrCodes.setText( BaseMessages.getString( PKG, "BaseStepDialog.ErrorHandling.ErrCodeFieldName.Label" ) );
props.setLook( wlErrCodes );
FormData fdlErrCodes = new FormData();
fdlErrCodes.top = new FormAttachment( wErrFields, margin );
fdlErrCodes.left = new FormAttachment( 0, 0 );
fdlErrCodes.right = new FormAttachment( middle, -margin );
wlErrCodes.setLayoutData( fdlErrCodes );
wErrCodes = new TextVar( transMeta, composite, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wErrCodes );
wErrCodes.addModifyListener( lsMod );
FormData fdErrCodes = new FormData();
fdErrCodes.top = new FormAttachment( wErrFields, margin );
fdErrCodes.left = new FormAttachment( middle, 0 );
fdErrCodes.right = new FormAttachment( 95, 0 );
wErrCodes.setLayoutData( fdErrCodes );
// What's the maximum number of errors allowed before we stop?
Label wlMaxErrors = new Label( composite, SWT.RIGHT );
wlMaxErrors.setText( BaseMessages.getString( PKG, "BaseStepDialog.ErrorHandling.MaxErr.Label" ) );
props.setLook( wlMaxErrors );
FormData fdlMaxErrors = new FormData();
fdlMaxErrors.top = new FormAttachment( wErrCodes, margin );
fdlMaxErrors.left = new FormAttachment( 0, 0 );
fdlMaxErrors.right = new FormAttachment( middle, -margin );
wlMaxErrors.setLayoutData( fdlMaxErrors );
wMaxErrors = new TextVar( transMeta, composite, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wMaxErrors );
wMaxErrors.addModifyListener( lsMod );
FormData fdMaxErrors = new FormData();
fdMaxErrors.top = new FormAttachment( wErrCodes, margin );
fdMaxErrors.left = new FormAttachment( middle, 0 );
fdMaxErrors.right = new FormAttachment( 95, 0 );
wMaxErrors.setLayoutData( fdMaxErrors );
// What's the maximum % of errors allowed?
Label wlMaxPct = new Label( composite, SWT.RIGHT );
wlMaxPct.setText( BaseMessages.getString( PKG, "BaseStepDialog.ErrorHandling.MaxPctErr.Label" ) );
props.setLook( wlMaxPct );
FormData fdlMaxPct = new FormData();
fdlMaxPct.top = new FormAttachment( wMaxErrors, margin );
fdlMaxPct.left = new FormAttachment( 0, 0 );
fdlMaxPct.right = new FormAttachment( middle, -margin );
wlMaxPct.setLayoutData( fdlMaxPct );
wMaxPct = new TextVar( transMeta, composite, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wMaxPct );
wMaxPct.addModifyListener( lsMod );
FormData fdMaxPct = new FormData();
fdMaxPct.top = new FormAttachment( wMaxErrors, margin );
fdMaxPct.left = new FormAttachment( middle, 0 );
fdMaxPct.right = new FormAttachment( 95, 0 );
wMaxPct.setLayoutData( fdMaxPct );
// What's the min nr of rows to read before doing % evaluation
Label wlMinPctRows = new Label( composite, SWT.RIGHT );
wlMinPctRows.setText( BaseMessages.getString( PKG, "BaseStepDialog.ErrorHandling.MinErr.Label" ) );
props.setLook( wlMinPctRows );
FormData fdlMinPctRows = new FormData();
fdlMinPctRows.top = new FormAttachment( wMaxPct, margin );
fdlMinPctRows.left = new FormAttachment( 0, 0 );
fdlMinPctRows.right = new FormAttachment( middle, -margin );
wlMinPctRows.setLayoutData( fdlMinPctRows );
wMinPctRows = new TextVar( transMeta, composite, SWT.SINGLE | SWT.LEFT | SWT.BORDER );
props.setLook( wMinPctRows );
wMinPctRows.addModifyListener( lsMod );
FormData fdMinPctRows = new FormData();
fdMinPctRows.top = new FormAttachment( wMaxPct, margin );
fdMinPctRows.left = new FormAttachment( middle, 0 );
fdMinPctRows.right = new FormAttachment( 95, 0 );
wMinPctRows.setLayoutData( fdMinPctRows );
FormData fdComposite = new FormData();
fdComposite.left = new FormAttachment( 0, 0 );
fdComposite.top = new FormAttachment( 0, 0 );
fdComposite.right = new FormAttachment( 100, 0 );
fdComposite.bottom = new FormAttachment( wOK, -margin );
composite.setLayoutData( fdComposite );
// Add listeners
wOK.addListener( SWT.Selection, new Listener() {
public void handleEvent( Event e ) {
ok();
}
} );
wCancel.addListener( SWT.Selection, new Listener() {
public void handleEvent( Event e ) {
cancel();
}
} );
SelectionAdapter selAdapter = new SelectionAdapter() {
public void widgetDefaultSelected( SelectionEvent e ) {
ok();
}
};
wErrFields.addSelectionListener( selAdapter );
wErrCodes.addSelectionListener( selAdapter );
wNrErrors.addSelectionListener( selAdapter );
wErrDesc.addSelectionListener( selAdapter );
wMaxErrors.addSelectionListener( selAdapter );
wMaxPct.addSelectionListener( selAdapter );
wMinPctRows.addSelectionListener( selAdapter );
// Detect X or ALT-F4 or something that kills this window...
shell.addShellListener( new ShellAdapter() {
public void shellClosed( ShellEvent e ) {
cancel();
}
} );
getData();
BaseStepDialog.setSize( shell );
shell.open();
Display display = parent.getDisplay();
while ( !shell.isDisposed() ) {
if ( !display.readAndDispatch() ) {
display.sleep();
}
}
return ok;
}
public void dispose() {
props.setScreen( new WindowProperty( shell ) );
shell.dispose();
}
public void getData() {
wSourceStep.setText( stepErrorMeta.getSourceStep() != null ? stepErrorMeta.getSourceStep().getName() : "" );
wTargetStep.setText( stepErrorMeta.getTargetStep() != null ? stepErrorMeta.getTargetStep().getName() : "" );
wEnabled.setSelection( stepErrorMeta.isEnabled() );
wNrErrors.setText( Const.NVL( stepErrorMeta.getNrErrorsValuename(), "" ) );
wErrDesc.setText( Const.NVL( stepErrorMeta.getErrorDescriptionsValuename(), "" ) );
wErrFields.setText( Const.NVL( stepErrorMeta.getErrorFieldsValuename(), "" ) );
wErrCodes.setText( Const.NVL( stepErrorMeta.getErrorCodesValuename(), "" ) );
wMaxErrors.setText( stepErrorMeta.getMaxErrors() != null ? stepErrorMeta.getMaxErrors() : "" );
wMaxPct.setText( stepErrorMeta.getMaxPercentErrors() != null ? stepErrorMeta.getMaxPercentErrors() : "" );
wMinPctRows.setText( stepErrorMeta.getMinPercentRows() != null ? stepErrorMeta.getMinPercentRows() : "" );
wSourceStep.setFocus();
}
private void cancel() {
originalStepErrorMeta = null;
dispose();
}
public void ok() {
getInfo();
originalStepErrorMeta.setTargetStep( stepErrorMeta.getTargetStep() );
originalStepErrorMeta.setEnabled( stepErrorMeta.isEnabled() );
originalStepErrorMeta.setNrErrorsValuename( stepErrorMeta.getNrErrorsValuename() );
originalStepErrorMeta.setErrorDescriptionsValuename( stepErrorMeta.getErrorDescriptionsValuename() );
originalStepErrorMeta.setErrorFieldsValuename( stepErrorMeta.getErrorFieldsValuename() );
originalStepErrorMeta.setErrorCodesValuename( stepErrorMeta.getErrorCodesValuename() );
originalStepErrorMeta.setMaxErrors( stepErrorMeta.getMaxErrors() );
originalStepErrorMeta.setMaxPercentErrors( stepErrorMeta.getMaxPercentErrors() );
originalStepErrorMeta.setMinPercentRows( stepErrorMeta.getMinPercentRows() );
originalStepErrorMeta.setChanged();
ok = true;
dispose();
}
// Get dialog info in securityService
private void getInfo() {
stepErrorMeta.setTargetStep( StepMeta.findStep( targetSteps, wTargetStep.getText() ) );
stepErrorMeta.setEnabled( wEnabled.getSelection() );
stepErrorMeta.setNrErrorsValuename( wNrErrors.getText() );
stepErrorMeta.setErrorDescriptionsValuename( wErrDesc.getText() );
stepErrorMeta.setErrorFieldsValuename( wErrFields.getText() );
stepErrorMeta.setErrorCodesValuename( wErrCodes.getText() );
stepErrorMeta.setMaxErrors( wMaxErrors.getText() );
stepErrorMeta.setMaxPercentErrors( Const.replace( wMaxPct.getText(), "%", "" ) );
stepErrorMeta.setMinPercentRows( wMinPctRows.getText() );
}
}