/* * This file is part of PaloKettlePlugin. * * PaloKettlePlugin 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. * * PaloKettlePlugin 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 PaloKettlePlugin. If not, see <http://www.gnu.org/licenses/>. * * Portions Copyright 2008 Stratebi Business Solutions, S.L. * Portions Copyright 2011 De Bortoli Wines Pty Limited (Australia) * Portions Copyright 2011 - 2013 Pentaho Corporation */ package org.pentaho.di.ui.trans.steps.palo.diminput; import java.util.ArrayList; import java.util.Collections; 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.Combo; 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.palo.core.PaloDimensionLevel; import org.pentaho.di.palo.core.PaloNameComparator; 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.steps.palo.diminput.PaloDimInputData; import org.pentaho.di.trans.steps.palo.diminput.PaloDimInputMeta; 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.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 org.pentaho.di.ui.trans.steps.palo.cellinput.PaloCellInputDialog; public class PaloDimInputDialog extends BaseStepDialog implements StepDialogInterface { private static Class<?> PKG = PaloDimInputMeta.class; // for i18n // purposes, // needed by // Translator2!! private final PaloDimInputMeta meta; private TableView tableViewFields; private Combo comboDimension; private Text textStepName; private Button buttonClearLevels; private Button buttonGetLevels; private Label labelStepName; private Label labelDimension; private Button buttonOk; private Button buttonCancel; private Button buttonPreview; private CCombo addConnectionLine; private Label labelBaseElementsOnly; private Button buttonBaseElementsOnly; public PaloDimInputDialog( Shell parent, Object in, TransMeta transMeta, String sname ) { super( parent, (BaseStepMeta) in, transMeta, sname ); this.meta = (PaloDimInputMeta) in; } public String open() { 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 ); labelDimension = 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 ); labelDimension.setLayoutData( fd ); comboDimension = new Combo( shell, SWT.READ_ONLY ); fd = new FormData(); fd.left = new FormAttachment( middle, 0 ); fd.right = new FormAttachment( 100, 0 ); fd.top = new FormAttachment( addConnectionLine, margin ); comboDimension.setLayoutData( fd ); labelBaseElementsOnly = new Label( shell, SWT.RIGHT ); fd = new FormData(); fd.left = new FormAttachment( 0, 0 ); fd.right = new FormAttachment( middle, -margin ); fd.top = new FormAttachment( comboDimension, margin ); labelBaseElementsOnly.setLayoutData( fd ); buttonBaseElementsOnly = new Button( shell, SWT.CHECK ); fd = new FormData(); fd.left = new FormAttachment( middle, 0 ); fd.right = new FormAttachment( 100, 0 ); fd.top = new FormAttachment( comboDimension, margin ); buttonBaseElementsOnly.setLayoutData( fd ); ModifyListener lsMod = new ModifyListener() { public void modifyText( ModifyEvent e ) { meta.setChanged(); } }; 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, false ), new ColumnInfo( getLocalizedColumn( 3 ), ColumnInfo.COLUMN_TYPE_CCOMBO, new String[]{ "String", "Number" }, true ) }; tableViewFields = new TableView( null, shell, SWT.FILL | SWT.BORDER, colinf, 10, true, lsMod, props ); tableViewFields.setSize( 477, 280 ); tableViewFields.setBounds( 5, 125, 477, 280 ); tableViewFields.setReadonly( true ); tableViewFields.setSortable( false ); fd = new FormData(); fd.left = new FormAttachment( 0, margin ); fd.top = new FormAttachment( buttonBaseElementsOnly, 3 * margin ); fd.right = new FormAttachment( 100, -150 ); fd.bottom = new FormAttachment( 100, -50 ); tableViewFields.setLayoutData( fd ); buttonGetLevels = new Button( shell, SWT.NONE ); fd = new FormData(); fd.left = new FormAttachment( tableViewFields, margin ); fd.top = new FormAttachment( buttonBaseElementsOnly, 3 * margin ); fd.right = new FormAttachment( 100, 0 ); buttonGetLevels.setLayoutData( fd ); buttonClearLevels = new Button( shell, SWT.NONE ); fd = new FormData(); fd.left = new FormAttachment( tableViewFields, margin ); fd.top = new FormAttachment( buttonGetLevels, margin ); fd.right = new FormAttachment( 100, 0 ); buttonClearLevels.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 ); 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(); } } ); buttonClearLevels.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { doClearLevels(); } } ); buttonGetLevels.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { doGetLevels(); } } ); comboDimension.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { doSelectDimension(); } } ); addConnectionLine.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { doSelectConnection( false ); } } ); this.fillLocalizationData(); this.fillStoredData(); this.doSelectConnection( false ); props.setLook( tableViewFields ); props.setLook( comboDimension ); props.setLook( textStepName ); props.setLook( buttonClearLevels ); props.setLook( buttonGetLevels ); props.setLook( labelStepName ); props.setLook( labelDimension ); props.setLook( buttonOk ); props.setLook( buttonCancel ); props.setLook( buttonPreview ); props.setLook( addConnectionLine ); props.setLook( labelBaseElementsOnly ); props.setLook( buttonBaseElementsOnly ); shell.addShellListener( new ShellAdapter() { public void shellClosed( ShellEvent e ) { cancel(); } } ); meta.setChanged( changed ); setSize(); shell.open(); PaloCellInputDialog.showPaloLibWarningDialog( shell ); while ( !shell.isDisposed() ) { if ( !display.readAndDispatch() ) { display.sleep(); } } return stepname; } private String getLocalizedColumn( int columnIndex ) { switch ( columnIndex ) { case 0: return BaseMessages.getString( PKG, "PaloDimInputDialog.ColumnLevelName" ); case 1: return BaseMessages.getString( PKG, "PaloDimInputDialog.ColumnLevelNumber" ); case 2: return BaseMessages.getString( PKG, "PaloDimInputDialog.ColumnField" ); case 3: return BaseMessages.getString( PKG, "PaloDimInputDialog.ColumnType" ); default: return ""; } } private void fillLocalizationData() { labelDimension.setText( BaseMessages.getString( PKG, "PaloDimInputDialog.SelectDimension" ) ); labelStepName.setText( BaseMessages.getString( PKG, "PaloDimInputDialog.StepName" ) ); shell.setText( BaseMessages.getString( PKG, "PaloDimInputDialog.PaloDimInput" ) ); buttonGetLevels.setText( BaseMessages.getString( PKG, "PaloDimInputDialog.GetLevels" ) ); buttonClearLevels.setText( BaseMessages.getString( PKG, "PaloDimInputDialog.ClearLevels" ) ); labelBaseElementsOnly.setText( BaseMessages.getString( PKG, "PaloDimInputDialog.BaseElementsOnly" ) ); } 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.getDimension() != null ) { comboDimension.add( meta.getDimension() ); comboDimension.select( 0 ); } buttonBaseElementsOnly.setSelection( meta.getBaseElementsOnly() ); tableViewFields.table.removeAll(); if ( meta.getLevels().size() > 0 ) { for ( PaloDimensionLevel level : meta.getLevels() ) { tableViewFields.add( level.getLevelName(), String.valueOf( level.getLevelNumber() ), level.getFieldName(), level.getFieldType() ); } tableViewFields.setRowNums(); tableViewFields.optWidth( true ); } } private void doSelectConnection( boolean clearCurrentData ) { try { if ( clearCurrentData ) { tableViewFields.table.removeAll(); comboDimension.removeAll(); } if ( addConnectionLine.getText() != null ) { DatabaseMeta dbMeta = transMeta.findDatabase( addConnectionLine.getText() ); if ( dbMeta != null ) { PaloDimInputData data = new PaloDimInputData( dbMeta ); data.helper.connect(); List<String> dimensions = data.helper.getDimensionsNames(); Collections.sort( dimensions, new PaloNameComparator() ); for ( String dimensionName : dimensions ) { if ( comboDimension.indexOf( dimensionName ) == -1 ) { comboDimension.add( dimensionName ); } } data.helper.disconnect(); } } } catch ( Exception ex ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "PaloDimInputDialog.RetreiveDimensionsErrorTitle" ), BaseMessages.getString( PKG, "PaloDimInputDialog.RetreiveDimensionsError" ), ex ); } } private void doSelectDimension() { // tableViewFields.table.removeAll(); } private void doClearLevels() { tableViewFields.table.removeAll(); } private void doGetLevels() { if ( buttonBaseElementsOnly.getSelection() ) { tableViewFields.table.removeAll(); tableViewFields.add( BaseMessages.getString( PKG, "PaloDimInputDialog.BaseElementName" ), "0", comboDimension .getText(), "String" ); } else if ( comboDimension.getText() != null && comboDimension.getText() != "" ) { try { if ( addConnectionLine.getText() != null ) { DatabaseMeta dbMeta = transMeta.findDatabase( addConnectionLine.getText() ); if ( dbMeta != null ) { PaloDimInputData data = new PaloDimInputData( dbMeta ); tableViewFields.table.removeAll(); data.helper.connect(); List<PaloDimensionLevel> levels = data.helper.getDimensionLevels( comboDimension.getText() ); for ( int i = 0; i < levels.size(); i++ ) { PaloDimensionLevel level = levels.get( i ); tableViewFields .add( level.getLevelName(), String.valueOf( level.getLevelNumber() ), level.getFieldName() ); } tableViewFields.setRowNums(); tableViewFields.optWidth( true ); data.helper.disconnect(); } } } catch ( Exception ex ) { new ErrorDialog( shell, BaseMessages.getString( "System.Dialog.GetFieldsFailed.Title" ), BaseMessages .getString( "System.Dialog.GetFieldsFailed.Message" ), ex ); } } else { new ErrorDialog( shell, BaseMessages.getString( "System.Dialog.GetFieldsFailed.Title" ), BaseMessages .getString( "System.Dialog.GetFieldsFailed.Message" ), new Exception( BaseMessages.getString( PKG, "PaloDimInputDialog.SelectDimensionFirstError" ) ) ); } } private void cancel() { stepname = null; meta.setChanged( changed ); dispose(); } private void ok() { try { getInfo( this.meta ); dispose(); } catch ( KettleException e ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "PaloDimInputDialog.FailedToSaveDataErrorTitle" ), BaseMessages.getString( PKG, "PaloDimInputDialog.FailedToSaveDataError" ), e ); } } private void getInfo( PaloDimInputMeta myMeta ) throws KettleException { stepname = textStepName.getText(); List<PaloDimensionLevel> levels = new ArrayList<PaloDimensionLevel>(); for ( int i = 0; i < tableViewFields.table.getItemCount(); i++ ) { PaloDimensionLevel level = new PaloDimensionLevel( tableViewFields.table.getItem( i ).getText( 1 ), Integer .parseInt( tableViewFields.table.getItem( i ).getText( 2 ) ), tableViewFields.table.getItem( i ).getText( 3 ), tableViewFields.table.getItem( i ).getText( 4 ) ); levels.add( level ); } myMeta.setDatabaseMeta( transMeta.findDatabase( addConnectionLine.getText() ) ); myMeta.setLevels( levels ); myMeta.setDimension( comboDimension.getText() ); myMeta.setBaseElementsOnly( buttonBaseElementsOnly.getSelection() ); myMeta.setChanged( true ); } private void preview() { PaloDimInputMeta oneMeta = new PaloDimInputMeta(); try { getInfo( oneMeta ); } catch ( KettleException e ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "PaloInputDialog.Illegal.Dialog.Settings.Title" ), BaseMessages.getString( PKG, "PaloInputDialog.Illegal.Dialog.Settings.Message" ), e ); return; } TransMeta previewMeta = TransPreviewFactory.generatePreviewTransformation( transMeta, oneMeta, 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(); } } }