/* * This software is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this software. If not, see <http://www.gnu.org/licenses/>. * * Copyright 2011 De Bortoli Wines Pty Limited (Australia) */ package org.pentaho.di.ui.trans.steps.openerp.objectinput; import java.util.ArrayList; import java.util.Arrays; import java.util.Hashtable; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; 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.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.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.pentaho.di.core.Const; import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.openerp.core.FieldMapping; import org.pentaho.di.openerp.core.ReadFilter; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.TransPreviewFactory; import org.pentaho.di.trans.step.BaseStepMeta; import org.pentaho.di.trans.step.StepDialogInterface; import org.pentaho.di.trans.step.StepInterface; import org.pentaho.di.trans.steps.openerp.objectinput.OpenERPObjectInputData; import org.pentaho.di.trans.steps.openerp.objectinput.OpenERPObjectInputMeta; import org.pentaho.di.ui.core.dialog.EnterNumberDialog; import org.pentaho.di.ui.core.dialog.EnterTextDialog; import org.pentaho.di.ui.core.dialog.ErrorDialog; import org.pentaho.di.ui.core.dialog.PreviewRowsDialog; import org.pentaho.di.ui.core.gui.GUIResource; import org.pentaho.di.ui.core.widget.ColumnInfo; import org.pentaho.di.ui.core.widget.TableView; import org.pentaho.di.ui.trans.dialog.TransPreviewProgressDialog; import org.pentaho.di.ui.trans.step.BaseStepDialog; import com.debortoliwines.openerp.api.helpers.FilterHelper; public class OpenERPObjectInputDialog extends BaseStepDialog implements StepDialogInterface { private static Class<?> PKG = OpenERPObjectInputMeta.class; // for i18n purposes, needed by Translator2!! private static Class<?> PKGStepInterface = StepInterface.class; // for i18n purposes, needed by Translator2!! ArrayList<FieldMapping> sourceListMapping; private ColumnInfo[] filterViewColinf; private final OpenERPObjectInputMeta meta; private Label labelStepName; private Text textStepName; private CCombo addConnectionLine; private Label labelModelName; private CCombo comboModelName; private Label labelReadBatchSize; private Text textReadBatchSize; private Label labelFilter; private TableView tableViewFilter; private Button buttonHelpFilter; private Label labelFields; private TableView tableViewFields; private Button buttonGetFields; private Button buttonOk; private Button buttonCancel; private Button buttonPreview; public OpenERPObjectInputDialog( Shell parent, Object in, TransMeta transMeta, String sname ) { super( parent, (BaseStepMeta) in, transMeta, sname ); this.meta = (OpenERPObjectInputMeta) in; } @Override public String open() { ModifyListener lsMod = new ModifyListener() { public void modifyText( ModifyEvent e ) { meta.setChanged(); } }; final Display display = getParent().getDisplay(); shell = new Shell( getParent(), SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN ); props.setLook( shell ); setShellImage( shell, meta ); FormLayout formLayout = new FormLayout(); formLayout.marginWidth = Const.FORM_MARGIN; formLayout.marginHeight = Const.FORM_MARGIN; shell.setLayout( formLayout ); int middle = props.getMiddlePct(); int margin = Const.MARGIN; FormData fd; labelStepName = new Label( shell, SWT.RIGHT ); fd = new FormData(); fd.left = new FormAttachment( 0, 0 ); fd.right = new FormAttachment( middle, -margin ); fd.top = new FormAttachment( 0, margin ); labelStepName.setLayoutData( fd ); textStepName = new Text( shell, SWT.BORDER ); fd = new FormData(); fd.left = new FormAttachment( middle, 0 ); fd.right = new FormAttachment( 100, 0 ); fd.top = new FormAttachment( 0, margin ); textStepName.setLayoutData( fd ); addConnectionLine = addConnectionLine( shell, textStepName, Const.MIDDLE_PCT, margin ); labelModelName = new Label( shell, SWT.RIGHT ); fd = new FormData(); fd.left = new FormAttachment( 0, 0 ); fd.right = new FormAttachment( middle, -margin ); fd.top = new FormAttachment( addConnectionLine, margin ); labelModelName.setLayoutData( fd ); comboModelName = new CCombo( shell, SWT.BORDER ); fd = new FormData(); fd.left = new FormAttachment( middle, 0 ); fd.right = new FormAttachment( 100, 0 ); fd.top = new FormAttachment( addConnectionLine, margin ); comboModelName.setLayoutData( fd ); labelReadBatchSize = new Label( shell, SWT.RIGHT ); fd = new FormData(); fd.left = new FormAttachment( 0, 0 ); fd.right = new FormAttachment( middle, -margin ); fd.top = new FormAttachment( comboModelName, margin ); labelReadBatchSize.setLayoutData( fd ); textReadBatchSize = new Text( shell, SWT.BORDER ); fd = new FormData(); fd.left = new FormAttachment( middle, 0 ); fd.right = new FormAttachment( 100, 0 ); fd.top = new FormAttachment( comboModelName, margin ); textReadBatchSize.setLayoutData( fd ); labelFilter = new Label( shell, SWT.NONE ); fd = new FormData(); fd.left = new FormAttachment( 0, 0 ); fd.top = new FormAttachment( textReadBatchSize, margin ); labelFilter.setLayoutData( fd ); filterViewColinf = new ColumnInfo[]{ new ColumnInfo( getLocalizedFilterColumn( 0 ), ColumnInfo.COLUMN_TYPE_CCOMBO, new String[]{ "" }, false ), new ColumnInfo( getLocalizedFilterColumn( 1 ), ColumnInfo.COLUMN_TYPE_CCOMBO, new String[]{ "" }, false ), new ColumnInfo( getLocalizedFilterColumn( 2 ), ColumnInfo.COLUMN_TYPE_CCOMBO, new String[]{ "" }, false ), new ColumnInfo( getLocalizedFilterColumn( 3 ), ColumnInfo.COLUMN_TYPE_TEXT, false, false ) }; tableViewFilter = new TableView( null, shell, SWT.MULTI | SWT.BORDER, filterViewColinf, 0, true, lsMod, props ); tableViewFilter.setReadonly( false ); tableViewFilter.setSortable( false ); fd = new FormData(); fd.left = new FormAttachment( 0, margin ); fd.top = new FormAttachment( labelFilter, 3 * margin ); fd.right = new FormAttachment( 100, -150 ); fd.bottom = new FormAttachment( labelFilter, 200 ); tableViewFilter.setLayoutData( fd ); buttonHelpFilter = new Button( shell, SWT.NONE ); fd = new FormData(); fd.left = new FormAttachment( tableViewFilter, margin ); fd.top = new FormAttachment( labelFilter, 3 * margin ); fd.right = new FormAttachment( 100, 0 ); buttonHelpFilter.setLayoutData( fd ); labelFields = new Label( shell, SWT.NONE ); fd = new FormData(); fd.left = new FormAttachment( 0, 0 ); fd.top = new FormAttachment( tableViewFilter, margin ); labelFields.setLayoutData( fd ); ColumnInfo[] colinf = new ColumnInfo[]{ new ColumnInfo( getLocalizedColumn( 0 ), ColumnInfo.COLUMN_TYPE_TEXT, false, true ), new ColumnInfo( getLocalizedColumn( 1 ), ColumnInfo.COLUMN_TYPE_TEXT, false, true ), new ColumnInfo( getLocalizedColumn( 2 ), ColumnInfo.COLUMN_TYPE_TEXT, false, true ) }; tableViewFields = new TableView( null, shell, SWT.MULTI | SWT.BORDER, colinf, 0, true, lsMod, props ); tableViewFields.setSize( 477, 280 ); tableViewFields.setBounds( 5, 125, 477, 280 ); tableViewFields.setReadonly( false ); tableViewFields.setSortable( true ); fd = new FormData(); fd.left = new FormAttachment( 0, margin ); fd.top = new FormAttachment( labelFields, 3 * margin ); fd.right = new FormAttachment( 100, -150 ); fd.bottom = new FormAttachment( 100, -50 ); tableViewFields.setLayoutData( fd ); buttonGetFields = new Button( shell, SWT.NONE ); fd = new FormData(); fd.left = new FormAttachment( tableViewFields, margin ); fd.top = new FormAttachment( labelFields, 3 * margin ); fd.right = new FormAttachment( 100, 0 ); buttonGetFields.setLayoutData( fd ); buttonOk = new Button( shell, SWT.CENTER ); buttonCancel = new Button( shell, SWT.CENTER ); buttonPreview = new Button( shell, SWT.CENTER ); buttonOk.setText( BaseMessages.getString( "System.Button.OK" ) ); buttonPreview.setText( BaseMessages.getString( "System.Button.Preview" ) ); buttonCancel.setText( BaseMessages.getString( "System.Button.Cancel" ) ); setButtonPositions( new Button[]{ buttonOk, buttonPreview, buttonCancel }, margin, null ); addConnectionLine.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { fillModelCombo(); } } ); comboModelName.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { fillFilterCombos(); } } ); comboModelName.addFocusListener( new FocusListener() { @Override public void focusLost( FocusEvent arg0 ) { fillFilterCombos(); } @Override public void focusGained( FocusEvent arg0 ) { } } ); comboModelName.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { fillFilterCombos(); } } ); buttonHelpFilter.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { showHelp(); } } ); buttonGetFields.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { getFields(); } } ); buttonCancel.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { cancel(); } } ); buttonPreview.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { preview(); } } ); buttonOk.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { ok(); } } ); // // Search the fields in the background // final Runnable runnable = new Runnable() { public void run() { fillModelCombo(); } }; display.asyncExec( runnable ); this.fillLocalizationData(); this.fillStoredData(); props.setLook( labelStepName ); props.setLook( textStepName ); props.setLook( addConnectionLine ); props.setLook( labelModelName ); props.setLook( comboModelName ); props.setLook( labelReadBatchSize ); props.setLook( textReadBatchSize ); props.setLook( labelFilter ); props.setLook( tableViewFilter ); props.setLook( labelFields ); props.setLook( tableViewFields ); meta.setChanged( changed ); setSize(); shell.open(); while ( !shell.isDisposed() ) { if ( !display.readAndDispatch() ) { display.sleep(); } } return stepname; } private String getLocalizedColumn( int columnIndex ) { switch ( columnIndex ) { case 0: return BaseMessages.getString( PKG, "OpenERPObjectInputDialog.TableViewLabel" ); case 1: return BaseMessages.getString( PKG, "OpenERPObjectInputDialog.TableViewModelName" ); case 2: return BaseMessages.getString( PKG, "OpenERPObjectInputDialog.TableViewFieldName" ); default: return ""; } } private String getLocalizedFilterColumn( int columnIndex ) { switch ( columnIndex ) { case 0: return BaseMessages.getString( PKG, "OpenERPObjectInputDialog.TableViewFilterOperator" ); case 1: return BaseMessages.getString( PKG, "OpenERPObjectInputDialog.TableViewFilterField" ); case 2: return BaseMessages.getString( PKG, "OpenERPObjectInputDialog.TableViewFilterComparator" ); case 3: return BaseMessages.getString( PKG, "OpenERPObjectInputDialog.TableViewFilterValue" ); default: return ""; } } private void showHelp() { EnterTextDialog text = new EnterTextDialog( shell, BaseMessages.getString( PKG, "OpenERPObjectInputDialog.FilterHelp.Title" ), "", BaseMessages.getString( PKG, "OpenERPObjectInputDialog.FilterHelp.Text" ) ); text.setReadOnly(); text.open(); } private void getFields() { ArrayList<FieldMapping> mappings = getFieldMappings( false ); if ( mappings != null ) { populateFielsTable( mappings ); } else { // See if the model exists in the database String[] modelList = getModelList(); // Server connect problem if ( modelList == null ) { getFieldMappings( true ); return; } boolean found = false; for ( String model : modelList ) { if ( model.equals( comboModelName.getText() ) ) { found = true; break; } } if ( !found ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "OpenERPObjectInputDialog.ConnectionErrorTitle" ), BaseMessages.getString( PKG, "OpenERPObjectInputDialog.ConnectionErrorString" ), new Exception( BaseMessages.getString( PKG, "OpenERPObjectInputDialog.ModelNotFoundError", comboModelName.getText() ) ) ); return; } } } private void populateFielsTable( ArrayList<FieldMapping> mappings ) { int choice = 0; if ( tableViewFields.table.getItemCount() > 0 ) { // Ask what we should do with the existing data in the step. MessageDialog md = new MessageDialog( tableViewFields.getShell(), BaseMessages.getString( PKGStepInterface, "BaseStepDialog.GetFieldsChoice.Title" ), // "Warning!" null, BaseMessages.getString( PKGStepInterface, "BaseStepDialog.GetFieldsChoice.Message", "" + tableViewFields.table.getItemCount(), "" + mappings.size() ), MessageDialog.WARNING, new String[]{ BaseMessages.getString( PKGStepInterface, "BaseStepDialog.AddNew" ), BaseMessages.getString( PKGStepInterface, "BaseStepDialog.ClearAndAdd" ), BaseMessages.getString( PKGStepInterface, "BaseStepDialog.Cancel" ), }, 0 ); MessageDialog.setDefaultImage( GUIResource.getInstance().getImageSpoon() ); int idx = md.open(); choice = idx & 0xFF; } if ( choice == 2 || choice == 255 /* 255 = escape pressed */ ) { return; // Cancel clicked } if ( choice == 1 ) { tableViewFields.table.removeAll(); } // Make a list of the old elements Hashtable<String, Object> currentMaps = new Hashtable<String, Object>(); for ( int i = 0; i < tableViewFields.table.getItemCount(); i++ ) { currentMaps.put( tableViewFields.table.getItem( i ).getText( 1 ) + tableViewFields.table.getItem( i ).getText( 2 ) + tableViewFields.table.getItem( i ).getText( 3 ), true ); } sourceListMapping = mappings; for ( FieldMapping map : mappings ) { // Only add new elements if ( !currentMaps.containsKey( map.target_field_label + map.target_model + map.target_field ) ) { tableViewFields.add( map.target_field_label, map.target_model, map.target_field, map.source_model, map.source_field, String.valueOf( map.source_index ), String.valueOf( map.target_field_type ) ); } } tableViewFields.setRowNums(); tableViewFields.optWidth( true ); } private void populateFiltersTable( ArrayList<ReadFilter> filters ) { tableViewFilter.table.removeAll(); for ( ReadFilter filter : filters ) { tableViewFilter.add( filter.getOperator(), filter.getFieldName(), filter.getComparator(), filter.getValue() ); } tableViewFilter.add( "", "", "", "" ); tableViewFilter.setRowNums(); tableViewFilter.optWidth( true ); } private void fillModelCombo() { String[] modelList = getModelList(); if ( modelList != null ) { for ( String modelName : modelList ) { if ( comboModelName.indexOf( modelName ) == -1 ) { comboModelName.add( modelName ); } } } } private String[] getModelList() { String[] modelList = null; if ( addConnectionLine.getText() != null ) { DatabaseMeta dbMeta = transMeta.findDatabase( addConnectionLine.getText() ); if ( dbMeta != null ) { OpenERPObjectInputData data = null; try { data = new OpenERPObjectInputData( dbMeta ); data.helper.StartSession(); modelList = data.helper.getModelList(); } catch ( Exception e ) { return null; } } } return modelList; } private void fillFilterCombos( ArrayList<FieldMapping> mappings ) { ArrayList<String> fieldList = new ArrayList<String>(); for ( FieldMapping map : mappings ) { if ( !fieldList.contains( map.source_field ) ) { fieldList.add( map.source_field ); } } String[] fieldStringList = new String[fieldList.size()]; fieldStringList = fieldList.toArray( fieldStringList ); Arrays.sort( fieldStringList, String.CASE_INSENSITIVE_ORDER ); filterViewColinf[0].setComboValues( FilterHelper.getOperators() ); filterViewColinf[1].setComboValues( fieldStringList ); filterViewColinf[2].setComboValues( FilterHelper.getComparators() ); tableViewFilter.optWidth( true ); } private void fillFilterCombos() { ArrayList<FieldMapping> mappings = getFieldMappings( false ); if ( mappings != null ) { fillFilterCombos( mappings ); } } private ArrayList<FieldMapping> getFieldMappings( boolean showError ) { if ( addConnectionLine.getText() != null ) { DatabaseMeta dbMeta = transMeta.findDatabase( addConnectionLine.getText() ); if ( dbMeta != null ) { try { OpenERPObjectInputData data = new OpenERPObjectInputData( dbMeta ); data.helper.StartSession(); ArrayList<FieldMapping> mappings = data.helper.getDefaultFieldMappings( comboModelName.getText() ); return mappings; } catch ( Exception e ) { if ( showError ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "OpenERPObjectInputDialog.ConnectionErrorTitle" ), BaseMessages.getString( PKG, "OpenERPObjectInputDialog.ConnectionErrorString" ), e ); } return null; } } } return null; } private void fillStoredData() { if ( stepname != null ) { textStepName.setText( stepname ); } int index = addConnectionLine.indexOf( meta.getDatabaseMeta() != null ? meta.getDatabaseMeta().getName() : "" ); if ( index >= 0 ) { addConnectionLine.select( index ); } if ( meta.getModelName() != null ) { comboModelName.add( meta.getModelName() ); comboModelName.select( 0 ); } textReadBatchSize.setText( String.valueOf( meta.getReadBatchSize() ) ); tableViewFields.table.removeAll(); tableViewFilter.table.removeAll(); populateFielsTable( meta.getMappings() ); populateFiltersTable( meta.getFilterList() ); fillFilterCombos(); } private void fillLocalizationData() { shell.setText( BaseMessages.getString( PKG, "OpenERPObjectInputDialog.Title" ) ); labelStepName.setText( BaseMessages.getString( PKG, "OpenERPObjectInputDialog.StepName" ) ); labelModelName.setText( BaseMessages.getString( PKG, "OpenERPObjectInputDialog.ModelName" ) ); labelReadBatchSize.setText( BaseMessages.getString( PKG, "OpenERPObjectInputDialog.ReadBatchSize" ) ); labelFilter.setText( BaseMessages.getString( PKG, "OpenERPObjectInputDialog.LabelFilterSpecify" ) ); labelFields.setText( BaseMessages.getString( PKG, "OpenERPObjectInputDialog.LabelSpecifyFields" ) ); buttonHelpFilter.setText( BaseMessages.getString( PKG, "OpenERPObjectInputDialog.ButtonFilterHelp" ) ); buttonGetFields.setText( BaseMessages.getString( PKG, "OpenERPObjectInputDialog.ButtonGetFields" ) ); } private void cancel() { stepname = null; meta.setChanged( changed ); dispose(); } private void ok() { if ( SaveToMeta( meta ) ) { dispose(); } } private boolean SaveToMeta( OpenERPObjectInputMeta targetMeta ) { stepname = textStepName.getText(); DatabaseMeta dbMeta = transMeta.findDatabase( addConnectionLine.getText() ); if ( dbMeta != null ) { try { new OpenERPObjectInputData( dbMeta ); } catch ( KettleException e ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "OpenERPObjectInputDialog.ConnectionTypeErrorTitle" ), BaseMessages.getString( PKG, "OpenERPObjectInputDialog.ConnectionTypeErrorString" ), e ); return false; } } int readBatchSize = 0; try { readBatchSize = Integer.parseInt( textReadBatchSize.getText() ); } catch ( NumberFormatException e ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "OpenERPObjectInputDialog.ParseErrorTitle" ), BaseMessages .getString( PKG, "OpenERPObjectInputDialog.ParseErrorString", textReadBatchSize.getText() ), e ); return false; } ArrayList<FieldMapping> mappings = new ArrayList<FieldMapping>(); for ( int i = 0; i < tableViewFields.table.getItemCount(); i++ ) { FieldMapping map = null; for ( FieldMapping sourceMap : sourceListMapping ) { if ( sourceMap.target_field_label.equals( tableViewFields.table.getItem( i ).getText( 1 ) ) && sourceMap.target_model.equals( tableViewFields.table.getItem( i ).getText( 2 ) ) && sourceMap.target_field.equals( tableViewFields.table.getItem( i ).getText( 3 ) ) ) { map = sourceMap.Clone(); } } if ( map == null ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "OpenERPObjectInputDialog.MappingErrorTitle" ), BaseMessages.getString( PKG, "OpenERPObjectInputDialog.MappingErrorTitle" ), new Exception( BaseMessages .getString( PKG, "OpenERPObjectInputDialog.MappingErrorString", tableViewFields.table.getItem( i ) .getText( 2 ) ) ) ); return false; } mappings.add( map ); } ArrayList<ReadFilter> filters = new ArrayList<ReadFilter>(); for ( int i = 0; i < tableViewFilter.table.getItemCount(); i++ ) { ReadFilter filter = new ReadFilter(); filter.setOperator( tableViewFilter.table.getItem( i ).getText( 1 ) ); filter.setFieldName( tableViewFilter.table.getItem( i ).getText( 2 ) ); filter.setComparator( tableViewFilter.table.getItem( i ).getText( 3 ) ); filter.setValue( tableViewFilter.table.getItem( i ).getText( 4 ) ); if ( filter.getFieldName() != "" ) { filters.add( filter ); } } targetMeta.setDatabaseMeta( transMeta.findDatabase( addConnectionLine.getText() ) ); targetMeta.setModelName( comboModelName.getText() ); targetMeta.setReadBatchSize( readBatchSize ); targetMeta.setMappings( mappings ); targetMeta.setFilterList( filters ); targetMeta.setChanged( true ); return true; } private void preview() { OpenERPObjectInputMeta testMeta = new OpenERPObjectInputMeta(); if ( !SaveToMeta( testMeta ) ) { return; } TransMeta previewMeta = TransPreviewFactory.generatePreviewTransformation( transMeta, testMeta, textStepName.getText() ); EnterNumberDialog numberDialog = new EnterNumberDialog( shell, 500, BaseMessages.getString( "System.Dialog.EnterPreviewSize.Title" ), BaseMessages.getString( "System.Dialog.EnterPreviewSize.Message" ) ); int previewSize = numberDialog.open(); if ( previewSize > 0 ) { TransPreviewProgressDialog progressDialog = new TransPreviewProgressDialog( shell, previewMeta, new String[]{ textStepName.getText() }, new int[]{ previewSize } ); progressDialog.open(); Trans trans = progressDialog.getTrans(); String loggingText = progressDialog.getLoggingText(); if ( !progressDialog.isCancelled() ) { if ( trans.getResult() != null && trans.getResult().getNrErrors() > 0 ) { EnterTextDialog etd = new EnterTextDialog( shell, BaseMessages.getString( "System.Dialog.PreviewError.Title" ), BaseMessages .getString( "System.Dialog.PreviewError.Message" ), loggingText, true ); etd.setReadOnly(); etd.open(); } } PreviewRowsDialog prd = new PreviewRowsDialog( shell, transMeta, SWT.NONE, textStepName.getText(), progressDialog .getPreviewRowsMeta( textStepName.getText() ), progressDialog.getPreviewRows( textStepName.getText() ), loggingText ); prd.open(); } } }