/*! ******************************************************************************
*
* 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.changefileencoding;
import java.nio.charset.Charset;
import java.util.ArrayList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
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.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.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
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.core.util.Utils;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.row.RowMetaInterface;
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.steps.changefileencoding.ChangeFileEncoding;
import org.pentaho.di.trans.steps.changefileencoding.ChangeFileEncodingMeta;
import org.pentaho.di.ui.core.dialog.ErrorDialog;
import org.pentaho.di.ui.core.widget.ComboVar;
import org.pentaho.di.ui.trans.step.BaseStepDialog;
public class ChangeFileEncodingDialog extends BaseStepDialog implements StepDialogInterface {
private static Class<?> PKG = ChangeFileEncoding.class; // for i18n purposes, needed by Translator2!!
private Label wlFileName;
private CCombo wFileName;
private FormData fdlFileName, fdfileName;
private Label wlTargetFileName;
private CCombo wTargetFileName;
private FormData fdlTargetFileName, fdTargetFileName;
private Label wlTargetEncoding;
private ComboVar wTargetEncoding;
private FormData fdlTargetEncoding, fdTargetEncoding;
private Label wlSourceEncoding;
private ComboVar wSourceEncoding;
private FormData fdlSourceEncoding, fdSourceEncoding;
private Button wSourceAddResult;
private FormData fdSourceAddResult, fdlSourceAddResult;
private Label wlSourceAddResult;
private Button wTargetAddResult;
private FormData fdTargetAddResult, fdlTargetAddResult;
private Label wlTargetAddResult;
private Button wCreateParentFolder;
private FormData fdCreateParentFolder, fdlCreateParentFolder;
private Label wlCreateParentFolder;
private ChangeFileEncodingMeta input;
private boolean gotPreviousFields = false;
private Group wSourceFileGroup;
private FormData fdSourceFileGroup;
private Group wTargetFileGroup;
private FormData fdTargetFileGroup;
public ChangeFileEncodingDialog( Shell parent, Object in, TransMeta transMeta, String sname ) {
super( parent, (BaseStepMeta) in, transMeta, sname );
input = (ChangeFileEncodingMeta) in;
}
public String open() {
Shell parent = getParent();
Display display = parent.getDisplay();
shell = new Shell( parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN );
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, "ChangeFileEncodingDialog.Shell.Title" ) );
int middle = props.getMiddlePct();
int margin = Const.MARGIN;
// Stepname line
wlStepname = new Label( shell, SWT.RIGHT );
wlStepname.setText( BaseMessages.getString( PKG, "ChangeFileEncodingDialog.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 );
// /////////////////////////////////
// START OF SourceFile GROUP
// /////////////////////////////////
wSourceFileGroup = new Group( shell, SWT.SHADOW_NONE );
props.setLook( wSourceFileGroup );
wSourceFileGroup
.setText( BaseMessages.getString( PKG, "ChangeFileEncodingDialog.Group.SourceFileGroup.Label" ) );
FormLayout SourceFilegroupLayout = new FormLayout();
SourceFilegroupLayout.marginWidth = 10;
SourceFilegroupLayout.marginHeight = 10;
wSourceFileGroup.setLayout( SourceFilegroupLayout );
// filename field
wlFileName = new Label( wSourceFileGroup, SWT.RIGHT );
wlFileName.setText( BaseMessages.getString( PKG, "ChangeFileEncodingDialog.FileName.Label" ) );
props.setLook( wlFileName );
fdlFileName = new FormData();
fdlFileName.left = new FormAttachment( 0, 0 );
fdlFileName.right = new FormAttachment( middle, -margin );
fdlFileName.top = new FormAttachment( wStepname, margin );
wlFileName.setLayoutData( fdlFileName );
wFileName = new CCombo( wSourceFileGroup, SWT.BORDER | SWT.READ_ONLY );
wFileName.setEditable( true );
props.setLook( wFileName );
wFileName.addModifyListener( lsMod );
fdfileName = new FormData();
fdfileName.left = new FormAttachment( middle, 0 );
fdfileName.top = new FormAttachment( wStepname, margin );
fdfileName.right = new FormAttachment( 100, -margin );
wFileName.setLayoutData( fdfileName );
wFileName.addFocusListener( new FocusListener() {
public void focusLost( org.eclipse.swt.events.FocusEvent e ) {
}
public void focusGained( org.eclipse.swt.events.FocusEvent e ) {
get();
}
} );
wlSourceEncoding = new Label( wSourceFileGroup, SWT.RIGHT );
wlSourceEncoding
.setText( BaseMessages.getString( PKG, "ChangeFileSourceEncodingDialog.SourceEncoding.Label" ) );
props.setLook( wlSourceEncoding );
fdlSourceEncoding = new FormData();
fdlSourceEncoding.left = new FormAttachment( 0, 0 );
fdlSourceEncoding.top = new FormAttachment( wFileName, margin );
fdlSourceEncoding.right = new FormAttachment( middle, -margin );
wlSourceEncoding.setLayoutData( fdlSourceEncoding );
wSourceEncoding = new ComboVar( transMeta, wSourceFileGroup, SWT.BORDER | SWT.READ_ONLY );
wSourceEncoding.setEditable( true );
props.setLook( wSourceEncoding );
wSourceEncoding.addModifyListener( lsMod );
fdSourceEncoding = new FormData();
fdSourceEncoding.left = new FormAttachment( middle, 0 );
fdSourceEncoding.top = new FormAttachment( wFileName, margin );
fdSourceEncoding.right = new FormAttachment( 100, 0 );
wSourceEncoding.setLayoutData( fdSourceEncoding );
wSourceEncoding.addFocusListener( new FocusListener() {
public void focusLost( org.eclipse.swt.events.FocusEvent e ) {
}
public void focusGained( org.eclipse.swt.events.FocusEvent e ) {
setEncodings( wSourceEncoding );
}
} );
// Add filename to result filenames?
wlSourceAddResult = new Label( wSourceFileGroup, SWT.RIGHT );
wlSourceAddResult.setText( BaseMessages.getString( PKG, "ChangeFileEncodingDialog.AddSourceResult.Label" ) );
props.setLook( wlSourceAddResult );
fdlSourceAddResult = new FormData();
fdlSourceAddResult.left = new FormAttachment( 0, 0 );
fdlSourceAddResult.top = new FormAttachment( wSourceEncoding, margin );
fdlSourceAddResult.right = new FormAttachment( middle, -margin );
wlSourceAddResult.setLayoutData( fdlSourceAddResult );
wSourceAddResult = new Button( wSourceFileGroup, SWT.CHECK );
props.setLook( wSourceAddResult );
wSourceAddResult.setToolTipText( BaseMessages.getString(
PKG, "ChangeFileEncodingDialog.AddSourceResult.Tooltip" ) );
fdSourceAddResult = new FormData();
fdSourceAddResult.left = new FormAttachment( middle, 0 );
fdSourceAddResult.top = new FormAttachment( wSourceEncoding, margin );
wSourceAddResult.setLayoutData( fdSourceAddResult );
fdSourceFileGroup = new FormData();
fdSourceFileGroup.left = new FormAttachment( 0, margin );
fdSourceFileGroup.top = new FormAttachment( wStepname, margin );
fdSourceFileGroup.right = new FormAttachment( 100, -margin );
wSourceFileGroup.setLayoutData( fdSourceFileGroup );
// ///////////////////////////////////////////////////////////
// / END OF SourceFile GROUP
// ///////////////////////////////////////////////////////////
// /////////////////////////////////
// START OF TargetFile GROUP
// /////////////////////////////////
wTargetFileGroup = new Group( shell, SWT.SHADOW_NONE );
props.setLook( wTargetFileGroup );
wTargetFileGroup
.setText( BaseMessages.getString( PKG, "ChangeFileEncodingDialog.Group.TargetFileGroup.Label" ) );
FormLayout TargetFilegroupLayout = new FormLayout();
TargetFilegroupLayout.marginWidth = 10;
TargetFilegroupLayout.marginHeight = 10;
wTargetFileGroup.setLayout( TargetFilegroupLayout );
// TargetFileName field
wlTargetFileName = new Label( wTargetFileGroup, SWT.RIGHT );
wlTargetFileName.setText( BaseMessages.getString( PKG, "ChangeFileEncodingDialog.TargetFileName.Label" ) );
props.setLook( wlTargetFileName );
fdlTargetFileName = new FormData();
fdlTargetFileName.left = new FormAttachment( 0, 0 );
fdlTargetFileName.right = new FormAttachment( middle, -margin );
fdlTargetFileName.top = new FormAttachment( wSourceEncoding, margin );
wlTargetFileName.setLayoutData( fdlTargetFileName );
wTargetFileName = new CCombo( wTargetFileGroup, SWT.BORDER | SWT.READ_ONLY );
wTargetFileName.setEditable( true );
props.setLook( wTargetFileName );
wTargetFileName.addModifyListener( lsMod );
fdTargetFileName = new FormData();
fdTargetFileName.left = new FormAttachment( middle, 0 );
fdTargetFileName.top = new FormAttachment( wSourceEncoding, margin );
fdTargetFileName.right = new FormAttachment( 100, -margin );
wTargetFileName.setLayoutData( fdTargetFileName );
wTargetFileName.addFocusListener( new FocusListener() {
public void focusLost( org.eclipse.swt.events.FocusEvent e ) {
}
public void focusGained( org.eclipse.swt.events.FocusEvent e ) {
get();
}
} );
// Create parent folder
wlCreateParentFolder = new Label( wTargetFileGroup, SWT.RIGHT );
wlCreateParentFolder.setText( BaseMessages
.getString( PKG, "ChangeFileEncodingDialog.CreateParentFolder.Label" ) );
props.setLook( wlCreateParentFolder );
fdlCreateParentFolder = new FormData();
fdlCreateParentFolder.left = new FormAttachment( 0, 0 );
fdlCreateParentFolder.top = new FormAttachment( wTargetFileName, margin );
fdlCreateParentFolder.right = new FormAttachment( middle, -margin );
wlCreateParentFolder.setLayoutData( fdlCreateParentFolder );
wCreateParentFolder = new Button( wTargetFileGroup, SWT.CHECK );
props.setLook( wCreateParentFolder );
wCreateParentFolder.setToolTipText( BaseMessages.getString(
PKG, "ChangeFileEncodingDialog.CreateParentFolder.Tooltip" ) );
fdCreateParentFolder = new FormData();
fdCreateParentFolder.left = new FormAttachment( middle, 0 );
fdCreateParentFolder.top = new FormAttachment( wTargetFileName, margin );
wCreateParentFolder.setLayoutData( fdCreateParentFolder );
wlTargetEncoding = new Label( wTargetFileGroup, SWT.RIGHT );
wlTargetEncoding.setText( BaseMessages.getString( PKG, "ChangeFileEncodingDialog.TargetEncoding.Label" ) );
props.setLook( wlTargetEncoding );
fdlTargetEncoding = new FormData();
fdlTargetEncoding.left = new FormAttachment( 0, 0 );
fdlTargetEncoding.top = new FormAttachment( wCreateParentFolder, margin );
fdlTargetEncoding.right = new FormAttachment( middle, -margin );
wlTargetEncoding.setLayoutData( fdlTargetEncoding );
wTargetEncoding = new ComboVar( transMeta, wTargetFileGroup, SWT.BORDER | SWT.READ_ONLY );
wTargetEncoding.setEditable( true );
props.setLook( wTargetEncoding );
wTargetEncoding.addModifyListener( lsMod );
fdTargetEncoding = new FormData();
fdTargetEncoding.left = new FormAttachment( middle, 0 );
fdTargetEncoding.top = new FormAttachment( wCreateParentFolder, margin );
fdTargetEncoding.right = new FormAttachment( 100, 0 );
wTargetEncoding.setLayoutData( fdTargetEncoding );
wTargetEncoding.addFocusListener( new FocusListener() {
public void focusLost( org.eclipse.swt.events.FocusEvent e ) {
}
public void focusGained( org.eclipse.swt.events.FocusEvent e ) {
setEncodings( wTargetEncoding );
}
} );
// Add filename to result filenames?
wlTargetAddResult = new Label( wTargetFileGroup, SWT.RIGHT );
wlTargetAddResult.setText( BaseMessages.getString( PKG, "ChangeFileEncodingDialog.AddTargetResult.Label" ) );
props.setLook( wlTargetAddResult );
fdlTargetAddResult = new FormData();
fdlTargetAddResult.left = new FormAttachment( 0, 0 );
fdlTargetAddResult.top = new FormAttachment( wTargetEncoding, margin );
fdlTargetAddResult.right = new FormAttachment( middle, -margin );
wlTargetAddResult.setLayoutData( fdlTargetAddResult );
wTargetAddResult = new Button( wTargetFileGroup, SWT.CHECK );
props.setLook( wTargetAddResult );
wTargetAddResult.setToolTipText( BaseMessages.getString(
PKG, "ChangeFileEncodingDialog.AddTargetResult.Tooltip" ) );
fdTargetAddResult = new FormData();
fdTargetAddResult.left = new FormAttachment( middle, 0 );
fdTargetAddResult.top = new FormAttachment( wTargetEncoding, margin );
wTargetAddResult.setLayoutData( fdTargetAddResult );
fdTargetFileGroup = new FormData();
fdTargetFileGroup.left = new FormAttachment( 0, margin );
fdTargetFileGroup.top = new FormAttachment( wSourceFileGroup, margin );
fdTargetFileGroup.right = new FormAttachment( 100, -margin );
wTargetFileGroup.setLayoutData( fdTargetFileGroup );
// ///////////////////////////////////////////////////////////
// / END OF TargetFile GROUP
// ///////////////////////////////////////////////////////////
// THE BUTTONS
wOK = new Button( shell, SWT.PUSH );
wOK.setText( BaseMessages.getString( PKG, "System.Button.OK" ) );
wCancel = new Button( shell, SWT.PUSH );
wCancel.setText( BaseMessages.getString( PKG, "System.Button.Cancel" ) );
setButtonPositions( new Button[] { wOK, wCancel }, margin, wTargetFileGroup );
// Add listeners
lsOK = new Listener() {
public void handleEvent( Event e ) {
ok();
}
};
lsCancel = new Listener() {
public void handleEvent( Event e ) {
cancel();
}
};
wOK.addListener( SWT.Selection, lsOK );
wCancel.addListener( SWT.Selection, lsCancel );
lsDef = new SelectionAdapter() {
public void widgetDefaultSelected( SelectionEvent e ) {
ok();
}
};
wStepname.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;
}
/**
* Copy information from the meta-data input to the dialog fields.
*/
public void getData() {
if ( isDebug() ) {
logDebug( BaseMessages.getString( PKG, "ChangeFileEncodingDialog.Log.GettingKeyInfo" ) );
}
if ( input.getDynamicFilenameField() != null ) {
wFileName.setText( input.getDynamicFilenameField() );
}
if ( input.getTargetFilenameField() != null ) {
wTargetFileName.setText( input.getTargetFilenameField() );
}
if ( input.getTargetEncoding() != null ) {
wTargetEncoding.setText( input.getTargetEncoding() );
}
if ( input.getSourceEncoding() != null ) {
wSourceEncoding.setText( input.getSourceEncoding() );
}
wSourceAddResult.setSelection( input.addSourceResultFilenames() );
wTargetAddResult.setSelection( input.addSourceResultFilenames() );
wCreateParentFolder.setSelection( input.isCreateParentFolder() );
wStepname.selectAll();
wStepname.setFocus();
}
private void cancel() {
stepname = null;
input.setChanged( changed );
dispose();
}
private void ok() {
if ( Utils.isEmpty( wStepname.getText() ) ) {
return;
}
input.setDynamicFilenameField( wFileName.getText() );
input.setTargetFilenameField( wTargetFileName.getText() );
input.setSourceEncoding( wSourceEncoding.getText() );
input.setTargetEncoding( wTargetEncoding.getText() );
input.setaddSourceResultFilenames( wSourceAddResult.getSelection() );
input.setaddTargetResultFilenames( wTargetAddResult.getSelection() );
input.setCreateParentFolder( wCreateParentFolder.getSelection() );
stepname = wStepname.getText(); // return value
dispose();
}
private void get() {
if ( !gotPreviousFields ) {
try {
String filefield = wFileName.getText();
String targetfilefield = wTargetFileName.getText();
wFileName.removeAll();
wTargetFileName.removeAll();
RowMetaInterface r = transMeta.getPrevStepFields( stepname );
if ( r != null ) {
wFileName.setItems( r.getFieldNames() );
wTargetFileName.setItems( r.getFieldNames() );
}
if ( filefield != null ) {
wFileName.setText( filefield );
}
if ( targetfilefield != null ) {
wTargetFileName.setText( targetfilefield );
}
} catch ( KettleException ke ) {
new ErrorDialog( shell,
BaseMessages.getString( PKG, "ChangeFileEncodingDialog.FailedToGetFields.DialogTitle" ),
BaseMessages.getString( PKG, "ChangeFileEncodingDialog.FailedToGetFields.DialogMessage" ), ke );
}
gotPreviousFields = true;
}
}
private void setEncodings( ComboVar var ) {
// Encoding of the text file:
String encoding = Const.NVL( var.getText(), Const.getEnvironmentVariable( "file.encoding", "UTF-8" ) );
var.removeAll();
ArrayList<Charset> values = new ArrayList<Charset>( Charset.availableCharsets().values() );
for ( int i = 0; i < values.size(); i++ ) {
Charset charSet = values.get( i );
var.add( charSet.displayName() );
}
// Now select the default!
int idx = Const.indexOfString( encoding, var.getItems() );
if ( idx >= 0 ) {
var.select( idx );
}
}
}