/*! ****************************************************************************** * * 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.regexeval; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.SashForm; 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.SelectionListener; import org.eclipse.swt.graphics.Cursor; 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.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.TableItem; import org.eclipse.swt.widgets.Text; import org.pentaho.di.core.Const; import org.pentaho.di.core.util.Utils; import org.pentaho.di.core.Props; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.row.RowMetaInterface; import org.pentaho.di.core.row.value.ValueMetaFactory; import org.pentaho.di.core.row.value.ValueMetaString; 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.regexeval.RegexEvalMeta; import org.pentaho.di.ui.core.dialog.ErrorDialog; import org.pentaho.di.ui.core.widget.ColumnInfo; import org.pentaho.di.ui.core.widget.LabelTextVar; import org.pentaho.di.ui.core.widget.StyledTextComp; import org.pentaho.di.ui.core.widget.TableView; import org.pentaho.di.ui.trans.step.BaseStepDialog; public class RegexEvalDialog extends BaseStepDialog implements StepDialogInterface { private static Class<?> PKG = RegexEvalMeta.class; // for i18n purposes, needed by Translator2!! private Label wlScript; private StyledTextComp wScript; private FormData fdlScript, fdScript, fdResultField, fdlfieldevaluate, fdfieldevaluate; private LabelTextVar wResultField; private CCombo wfieldevaluate; private Label wlfieldevaluate; private RegexEvalMeta input; private Group wStepSettings, wRegexSettings; private FormData fdStepSettings, fdRegexSettings; private Label wlCanonEq, wlCaseInsensitive, wlComment, wlDotAll, wlMultiline; private Label wlUnicode, wlUnix, wlUseVar, wlAllowCaptureGroups, wlReplaceFields; private Button wCanonEq, wCaseInsensitive, wComment, wDotAll, wMultiline; private Button wUnicode, wUnix, wUseVar, wAllowCaptureGroups, wReplaceFields; private CTabFolder wTabFolder; private FormData fdTabFolder; private CTabItem wGeneralTab, wContentTab; private Composite wGeneralComp, wContentComp, wBottom; private FormData fdGeneralComp, fdContentComp, fdBottom; private SashForm wSash; private FormData fdSash; private Label wSeparator; private FormData fdSeparator; private Label wlFields; private TableView wFields; private FormData fdlFields, fdFields; private Button wbTestRegExScript; private FormData fdbTestRegExScript; private Listener lsbTestRegExScript; public RegexEvalDialog( Shell parent, Object in, TransMeta tr, String sname ) { super( parent, (BaseStepMeta) in, tr, sname ); input = (RegexEvalMeta) 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(); } }; SelectionListener lsSel = new SelectionAdapter() { public void widgetSelected( SelectionEvent 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, "RegexEvalDialog.Shell.Title" ) ); int middle = props.getMiddlePct(); int margin = Const.MARGIN; // Filename line wlStepname = new Label( shell, SWT.RIGHT ); wlStepname.setText( BaseMessages.getString( PKG, "RegexEvalDialog.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 ); wSash = new SashForm( shell, SWT.VERTICAL ); wTabFolder = new CTabFolder( wSash, SWT.BORDER ); props.setLook( wTabFolder, Props.WIDGET_STYLE_TAB ); // //////////////////////// // START OF GENERAL TAB /// // //////////////////////// wGeneralTab = new CTabItem( wTabFolder, SWT.NONE ); wGeneralTab.setText( BaseMessages.getString( PKG, "RegexEvalDialog.GeneralTab.TabTitle" ) ); wGeneralComp = new Composite( wTabFolder, SWT.NONE ); props.setLook( wGeneralComp ); FormLayout generalLayout = new FormLayout(); generalLayout.marginWidth = 3; generalLayout.marginHeight = 3; wGeneralComp.setLayout( generalLayout ); // Step Settings grouping? // //////////////////////// // START OF Step Settings GROUP // wStepSettings = new Group( wGeneralComp, SWT.SHADOW_NONE ); props.setLook( wStepSettings ); wStepSettings.setText( BaseMessages.getString( PKG, "RegexEvalDialog.Group.StepSettings.Label" ) ); FormLayout groupLayout = new FormLayout(); groupLayout.marginWidth = 10; groupLayout.marginHeight = 10; wStepSettings.setLayout( groupLayout ); // fieldevaluate wlfieldevaluate = new Label( wStepSettings, SWT.RIGHT ); wlfieldevaluate.setText( BaseMessages.getString( PKG, "RegexEvalDialog.Matcher.Label" ) ); props.setLook( wlfieldevaluate ); fdlfieldevaluate = new FormData(); fdlfieldevaluate.left = new FormAttachment( 0, 0 ); fdlfieldevaluate.top = new FormAttachment( wStepname, margin ); fdlfieldevaluate.right = new FormAttachment( middle, -margin ); wlfieldevaluate.setLayoutData( fdlfieldevaluate ); wfieldevaluate = new CCombo( wStepSettings, SWT.BORDER | SWT.READ_ONLY ); wfieldevaluate.setEditable( true ); props.setLook( wfieldevaluate ); wfieldevaluate.addModifyListener( lsMod ); fdfieldevaluate = new FormData(); fdfieldevaluate.left = new FormAttachment( middle, margin ); fdfieldevaluate.top = new FormAttachment( wStepname, margin ); fdfieldevaluate.right = new FormAttachment( 100, -margin ); wfieldevaluate.setLayoutData( fdfieldevaluate ); wfieldevaluate.addSelectionListener( lsSel ); wfieldevaluate.addFocusListener( new FocusListener() { public void focusLost( org.eclipse.swt.events.FocusEvent e ) { } public void focusGained( org.eclipse.swt.events.FocusEvent e ) { Cursor busy = new Cursor( shell.getDisplay(), SWT.CURSOR_WAIT ); shell.setCursor( busy ); getPreviousFields(); shell.setCursor( null ); busy.dispose(); } } ); // Output Fieldame wResultField = new LabelTextVar( transMeta, wStepSettings, BaseMessages.getString( PKG, "RegexEvalDialog.ResultField.Label" ), BaseMessages.getString( PKG, "RegexEvalDialog.ResultField.Tooltip" ) ); props.setLook( wResultField ); wResultField.addModifyListener( lsMod ); fdResultField = new FormData(); fdResultField.left = new FormAttachment( 0, 0 ); fdResultField.top = new FormAttachment( wfieldevaluate, margin ); fdResultField.right = new FormAttachment( 100, 0 ); wResultField.setLayoutData( fdResultField ); // Allow capture groups? wlAllowCaptureGroups = new Label( wStepSettings, SWT.RIGHT ); wlAllowCaptureGroups.setText( BaseMessages.getString( PKG, "RegexEvalDialog.AllowCaptureGroups.Label" ) ); props.setLook( wlAllowCaptureGroups ); FormData fdlAllowCaptureGroups = new FormData(); fdlAllowCaptureGroups.left = new FormAttachment( 0, 0 ); fdlAllowCaptureGroups.top = new FormAttachment( wResultField, margin ); fdlAllowCaptureGroups.right = new FormAttachment( middle, -margin ); wlAllowCaptureGroups.setLayoutData( fdlAllowCaptureGroups ); wAllowCaptureGroups = new Button( wStepSettings, SWT.CHECK ); wAllowCaptureGroups .setToolTipText( BaseMessages.getString( PKG, "RegexEvalDialog.AllowCaptureGroups.Tooltip" ) ); props.setLook( wAllowCaptureGroups ); FormData fdAllowCaptureGroups = new FormData(); fdAllowCaptureGroups.left = new FormAttachment( middle, margin ); fdAllowCaptureGroups.top = new FormAttachment( wResultField, margin ); fdAllowCaptureGroups.right = new FormAttachment( 100, 0 ); wAllowCaptureGroups.setLayoutData( fdAllowCaptureGroups ); wAllowCaptureGroups.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { setFieldsEnabledStatus(); input.setChanged(); } } ); // Replace fields? wlReplaceFields = new Label( wStepSettings, SWT.RIGHT ); wlReplaceFields.setText( BaseMessages.getString( PKG, "RegexEvalDialog.ReplaceFields.Label" ) ); props.setLook( wlReplaceFields ); FormData fdlReplaceFields = new FormData(); fdlReplaceFields.left = new FormAttachment( 0, 0 ); fdlReplaceFields.top = new FormAttachment( wAllowCaptureGroups, margin ); fdlReplaceFields.right = new FormAttachment( middle, -margin ); wlReplaceFields.setLayoutData( fdlReplaceFields ); wReplaceFields = new Button( wStepSettings, SWT.CHECK ); wReplaceFields.setToolTipText( BaseMessages.getString( PKG, "RegexEvalDialog.ReplaceFields.Tooltip" ) ); props.setLook( wReplaceFields ); FormData fdReplaceFields = new FormData(); fdReplaceFields.left = new FormAttachment( middle, margin ); fdReplaceFields.top = new FormAttachment( wAllowCaptureGroups, margin ); fdReplaceFields.right = new FormAttachment( 100, 0 ); wReplaceFields.setLayoutData( fdReplaceFields ); wReplaceFields.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { input.setChanged(); } } ); // settings layout fdStepSettings = new FormData(); fdStepSettings.left = new FormAttachment( 0, margin ); fdStepSettings.top = new FormAttachment( wStepname, margin ); fdStepSettings.right = new FormAttachment( 100, -margin ); wStepSettings.setLayoutData( fdStepSettings ); // /////////////////////////////////////////////////////////// // / END OF STEP SETTINGS GROUP // /////////////////////////////////////////////////////////// // Script line wlScript = new Label( wGeneralComp, SWT.NONE ); wlScript.setText( BaseMessages.getString( PKG, "RegexEvalDialog.Javascript.Label" ) ); props.setLook( wlScript ); fdlScript = new FormData(); fdlScript.left = new FormAttachment( 0, 0 ); fdlScript.top = new FormAttachment( wStepSettings, margin ); wlScript.setLayoutData( fdlScript ); wbTestRegExScript = new Button( wGeneralComp, SWT.PUSH | SWT.CENTER ); props.setLook( wbTestRegExScript ); wbTestRegExScript.setText( BaseMessages.getString( PKG, "RegexEvalDialog.TestScript.Label" ) ); fdbTestRegExScript = new FormData(); fdbTestRegExScript.right = new FormAttachment( 100, -margin ); fdbTestRegExScript.top = new FormAttachment( wStepSettings, margin ); wbTestRegExScript.setLayoutData( fdbTestRegExScript ); wScript = new StyledTextComp( transMeta, wGeneralComp, SWT.MULTI | SWT.LEFT | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL, "" ); wScript.setText( BaseMessages.getString( PKG, "RegexEvalDialog.Script.Label" ) ); props.setLook( wScript, Props.WIDGET_STYLE_FIXED ); wScript.addModifyListener( lsMod ); fdScript = new FormData(); fdScript.left = new FormAttachment( 0, 0 ); fdScript.top = new FormAttachment( wbTestRegExScript, margin ); fdScript.right = new FormAttachment( 100, -10 ); fdScript.bottom = new FormAttachment( 100, -25 ); wScript.setLayoutData( fdScript ); // SelectionAdapter lsVar = VariableButtonListenerFactory.getSelectionAdapter(shell, wScript); // wScript.addKeyListener(TextVar.getControlSpaceKeyListener(wScript, lsVar)); // Variable substitution? wlUseVar = new Label( wGeneralComp, SWT.NONE ); wlUseVar.setText( BaseMessages.getString( PKG, "RegexEvalDialog.UseVar.Label" ) ); props.setLook( wlUseVar ); FormData fdlUseVar = new FormData(); fdlUseVar.left = new FormAttachment( 0, margin ); fdlUseVar.top = new FormAttachment( wScript, margin ); wlUseVar.setLayoutData( fdlUseVar ); wUseVar = new Button( wGeneralComp, SWT.CHECK ); wUseVar.setToolTipText( BaseMessages.getString( PKG, "RegexEvalDialog.UseVar.Tooltip" ) ); props.setLook( wUseVar ); FormData fdUseVar = new FormData(); fdUseVar.left = new FormAttachment( wlUseVar, margin ); fdUseVar.top = new FormAttachment( wScript, margin ); wUseVar.setLayoutData( fdUseVar ); wUseVar.addSelectionListener( lsSel ); wBottom = new Composite( wSash, SWT.NONE ); props.setLook( wBottom ); FormLayout bottomLayout = new FormLayout(); bottomLayout.marginWidth = Const.FORM_MARGIN; bottomLayout.marginHeight = Const.FORM_MARGIN; wBottom.setLayout( bottomLayout ); wSeparator = new Label( wBottom, SWT.SEPARATOR | SWT.HORIZONTAL ); fdSeparator = new FormData(); fdSeparator.left = new FormAttachment( 0, 0 ); fdSeparator.right = new FormAttachment( 100, 0 ); fdSeparator.top = new FormAttachment( 0, -margin + 2 ); wSeparator.setLayoutData( fdSeparator ); wlFields = new Label( wBottom, SWT.NONE ); wlFields.setText( BaseMessages.getString( PKG, "RegexEvalDialog.Fields.Label" ) ); wlFields.setToolTipText( BaseMessages.getString( PKG, "RegexEvalDialog.Fields.Tooltip" ) ); props.setLook( wlFields ); fdlFields = new FormData(); fdlFields.left = new FormAttachment( 0, 0 ); fdlFields.top = new FormAttachment( wSeparator, 0 ); wlFields.setLayoutData( fdlFields ); final int fieldsRows = input.getFieldName().length; ColumnInfo[] columnInfo = new ColumnInfo[] { new ColumnInfo( BaseMessages.getString( PKG, "RegexEvalDialog.ColumnInfo.NewField" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), new ColumnInfo( BaseMessages.getString( PKG, "RegexEvalDialog.ColumnInfo.Type" ), ColumnInfo.COLUMN_TYPE_CCOMBO, ValueMetaFactory.getValueMetaNames() ), new ColumnInfo( BaseMessages.getString( PKG, "RegexEvalDialog.ColumnInfo.Length" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), new ColumnInfo( BaseMessages.getString( PKG, "RegexEvalDialog.ColumnInfo.Precision" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), new ColumnInfo( BaseMessages.getString( PKG, "RegexEvalDialog.ColumnInfo.Format" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), new ColumnInfo( BaseMessages.getString( PKG, "RegexEvalDialog.ColumnInfo.Group" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), new ColumnInfo( BaseMessages.getString( PKG, "RegexEvalDialog.ColumnInfo.Decimal" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), new ColumnInfo( BaseMessages.getString( PKG, "RegexEvalDialog.ColumnInfo.Currency" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), new ColumnInfo( BaseMessages.getString( PKG, "RegexEvalDialog.ColumnInfo.Nullif" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), new ColumnInfo( BaseMessages.getString( PKG, "RegexEvalDialog.ColumnInfo.IfNull" ), ColumnInfo.COLUMN_TYPE_TEXT, false ), new ColumnInfo( BaseMessages.getString( PKG, "RegexEvalDialog.ColumnInfo.TrimType" ), ColumnInfo.COLUMN_TYPE_CCOMBO, ValueMetaString.trimTypeDesc, true ), }; wFields = new TableView( transMeta, wBottom, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI, columnInfo, fieldsRows, lsMod, props ); fdFields = new FormData(); fdFields.left = new FormAttachment( 0, 0 ); fdFields.top = new FormAttachment( wlFields, margin ); fdFields.right = new FormAttachment( 100, 0 ); fdFields.bottom = new FormAttachment( 100, 0 ); wFields.setLayoutData( fdFields ); fdGeneralComp = new FormData(); fdGeneralComp.left = new FormAttachment( 0, 0 ); fdGeneralComp.top = new FormAttachment( 0, 0 ); fdGeneralComp.right = new FormAttachment( 100, 0 ); fdGeneralComp.bottom = new FormAttachment( 100, 0 ); wGeneralComp.setLayoutData( fdGeneralComp ); wGeneralComp.layout(); wGeneralTab.setControl( wGeneralComp ); props.setLook( wGeneralComp ); // /////////////////////////////////////////////////////////// // / END OF GENERAL TAB // /////////////////////////////////////////////////////////// // //////////////////////// // START OF CONTENT TAB/// // / wContentTab = new CTabItem( wTabFolder, SWT.NONE ); wContentTab.setText( BaseMessages.getString( PKG, "RegexEvalDialog.ContentTab.TabTitle" ) ); FormLayout contentLayout = new FormLayout(); contentLayout.marginWidth = 3; contentLayout.marginHeight = 3; wContentComp = new Composite( wTabFolder, SWT.NONE ); props.setLook( wContentComp ); wContentComp.setLayout( contentLayout ); // Step RegexSettings grouping? // //////////////////////// // START OF RegexSettings GROUP // wRegexSettings = new Group( wContentComp, SWT.SHADOW_NONE ); props.setLook( wRegexSettings ); wRegexSettings.setText( "Regex Settings" ); FormLayout regexLayout = new FormLayout(); regexLayout.marginWidth = 10; regexLayout.marginHeight = 10; wRegexSettings.setLayout( regexLayout ); // Canon_Eq? wlCanonEq = new Label( wRegexSettings, SWT.RIGHT ); wlCanonEq.setText( BaseMessages.getString( PKG, "RegexEvalDialog.CanonEq.Label" ) ); props.setLook( wlCanonEq ); FormData fdlCanonEq = new FormData(); fdlCanonEq.left = new FormAttachment( 0, 0 ); fdlCanonEq.top = new FormAttachment( wStepSettings, margin ); fdlCanonEq.right = new FormAttachment( middle, -margin ); wlCanonEq.setLayoutData( fdlCanonEq ); wCanonEq = new Button( wRegexSettings, SWT.CHECK ); wCanonEq.setToolTipText( BaseMessages.getString( PKG, "RegexEvalDialog.CanonEq.Tooltip" ) ); props.setLook( wCanonEq ); FormData fdCanonEq = new FormData(); fdCanonEq.left = new FormAttachment( middle, 0 ); fdCanonEq.top = new FormAttachment( wStepSettings, margin ); fdCanonEq.right = new FormAttachment( 100, 0 ); wCanonEq.setLayoutData( fdCanonEq ); wCanonEq.addSelectionListener( lsSel ); // CASE_INSENSITIVE? wlCaseInsensitive = new Label( wRegexSettings, SWT.RIGHT ); wlCaseInsensitive.setText( BaseMessages.getString( PKG, "RegexEvalDialog.CaseInsensitive.Label" ) ); props.setLook( wlCaseInsensitive ); FormData fdlCaseInsensitive = new FormData(); fdlCaseInsensitive.left = new FormAttachment( 0, 0 ); fdlCaseInsensitive.top = new FormAttachment( wCanonEq, margin ); fdlCaseInsensitive.right = new FormAttachment( middle, -margin ); wlCaseInsensitive.setLayoutData( fdlCaseInsensitive ); wCaseInsensitive = new Button( wRegexSettings, SWT.CHECK ); wCaseInsensitive.setToolTipText( BaseMessages.getString( PKG, "RegexEvalDialog.CaseInsensitive.Tooltip" ) ); props.setLook( wCaseInsensitive ); FormData fdCaseInsensitive = new FormData(); fdCaseInsensitive.left = new FormAttachment( middle, 0 ); fdCaseInsensitive.top = new FormAttachment( wCanonEq, margin ); fdCaseInsensitive.right = new FormAttachment( 100, 0 ); wCaseInsensitive.setLayoutData( fdCaseInsensitive ); wCaseInsensitive.addSelectionListener( lsSel ); // COMMENT? wlComment = new Label( wRegexSettings, SWT.RIGHT ); wlComment.setText( BaseMessages.getString( PKG, "RegexEvalDialog.Comment.Label" ) ); props.setLook( wlComment ); FormData fdlComment = new FormData(); fdlComment.left = new FormAttachment( 0, 0 ); fdlComment.top = new FormAttachment( wCaseInsensitive, margin ); fdlComment.right = new FormAttachment( middle, -margin ); wlComment.setLayoutData( fdlComment ); wComment = new Button( wRegexSettings, SWT.CHECK ); wComment.setToolTipText( BaseMessages.getString( PKG, "RegexEvalDialog.Comment.Tooltip" ) ); props.setLook( wComment ); FormData fdComment = new FormData(); fdComment.left = new FormAttachment( middle, 0 ); fdComment.top = new FormAttachment( wCaseInsensitive, margin ); fdComment.right = new FormAttachment( 100, 0 ); wComment.setLayoutData( fdComment ); wComment.addSelectionListener( lsSel ); // DOTALL? wlDotAll = new Label( wRegexSettings, SWT.RIGHT ); wlDotAll.setText( BaseMessages.getString( PKG, "RegexEvalDialog.DotAll.Label" ) ); props.setLook( wlDotAll ); FormData fdlDotAll = new FormData(); fdlDotAll.left = new FormAttachment( 0, 0 ); fdlDotAll.top = new FormAttachment( wComment, margin ); fdlDotAll.right = new FormAttachment( middle, -margin ); wlDotAll.setLayoutData( fdlDotAll ); wDotAll = new Button( wRegexSettings, SWT.CHECK ); wDotAll.setToolTipText( BaseMessages.getString( PKG, "RegexEvalDialog.DotAll.Tooltip" ) ); props.setLook( wDotAll ); FormData fdDotAll = new FormData(); fdDotAll.left = new FormAttachment( middle, 0 ); fdDotAll.top = new FormAttachment( wComment, margin ); fdDotAll.right = new FormAttachment( 100, 0 ); wDotAll.setLayoutData( fdDotAll ); wDotAll.addSelectionListener( lsSel ); // MULTILINE? wlMultiline = new Label( wRegexSettings, SWT.RIGHT ); wlMultiline.setText( BaseMessages.getString( PKG, "RegexEvalDialog.Multiline.Label" ) ); props.setLook( wlMultiline ); FormData fdlMultiline = new FormData(); fdlMultiline.left = new FormAttachment( 0, 0 ); fdlMultiline.top = new FormAttachment( wDotAll, margin ); fdlMultiline.right = new FormAttachment( middle, -margin ); wlMultiline.setLayoutData( fdlMultiline ); wMultiline = new Button( wRegexSettings, SWT.CHECK ); wMultiline.setToolTipText( BaseMessages.getString( PKG, "RegexEvalDialog.Multiline.Tooltip" ) ); props.setLook( wMultiline ); FormData fdMultiline = new FormData(); fdMultiline.left = new FormAttachment( middle, 0 ); fdMultiline.top = new FormAttachment( wDotAll, margin ); fdMultiline.right = new FormAttachment( 100, 0 ); wMultiline.setLayoutData( fdMultiline ); wMultiline.addSelectionListener( lsSel ); // UNICODE? wlUnicode = new Label( wRegexSettings, SWT.RIGHT ); wlUnicode.setText( BaseMessages.getString( PKG, "RegexEvalDialog.Unicode.Label" ) ); props.setLook( wlUnicode ); FormData fdlUnicode = new FormData(); fdlUnicode.left = new FormAttachment( 0, 0 ); fdlUnicode.top = new FormAttachment( wMultiline, margin ); fdlUnicode.right = new FormAttachment( middle, -margin ); wlUnicode.setLayoutData( fdlUnicode ); wUnicode = new Button( wRegexSettings, SWT.CHECK ); wUnicode.setToolTipText( BaseMessages.getString( PKG, "RegexEvalDialog.Unicode.Tooltip" ) ); props.setLook( wUnicode ); FormData fdUnicode = new FormData(); fdUnicode.left = new FormAttachment( middle, 0 ); fdUnicode.top = new FormAttachment( wMultiline, margin ); fdUnicode.right = new FormAttachment( 100, 0 ); wUnicode.setLayoutData( fdUnicode ); wUnicode.addSelectionListener( lsSel ); // UNIX? wlUnix = new Label( wRegexSettings, SWT.RIGHT ); wlUnix.setText( BaseMessages.getString( PKG, "RegexEvalDialog.Unix.Label" ) ); props.setLook( wlUnix ); FormData fdlUnix = new FormData(); fdlUnix.left = new FormAttachment( 0, 0 ); fdlUnix.top = new FormAttachment( wUnicode, margin ); fdlUnix.right = new FormAttachment( middle, -margin ); wlUnix.setLayoutData( fdlUnix ); wUnix = new Button( wRegexSettings, SWT.CHECK ); wUnix.setToolTipText( BaseMessages.getString( PKG, "RegexEvalDialog.Unix.Tooltip" ) ); props.setLook( wUnix ); FormData fdUnix = new FormData(); fdUnix.left = new FormAttachment( middle, 0 ); fdUnix.top = new FormAttachment( wUnicode, margin ); fdUnix.right = new FormAttachment( 100, 0 ); wUnix.setLayoutData( fdUnix ); wUnix.addSelectionListener( lsSel ); fdRegexSettings = new FormData(); fdRegexSettings.left = new FormAttachment( 0, margin ); fdRegexSettings.top = new FormAttachment( wStepSettings, margin ); fdRegexSettings.right = new FormAttachment( 100, -margin ); wRegexSettings.setLayoutData( fdRegexSettings ); // /////////////////////////////////////////////////////////// // / END OF RegexSettings GROUP // /////////////////////////////////////////////////////////// fdContentComp = new FormData(); fdContentComp.left = new FormAttachment( 0, 0 ); fdContentComp.top = new FormAttachment( 0, 0 ); fdContentComp.right = new FormAttachment( 100, 0 ); fdContentComp.bottom = new FormAttachment( 100, 0 ); wContentComp.setLayoutData( wContentComp ); wContentComp.layout(); wContentTab.setControl( wContentComp ); // /////////////////////////////////////////////////////////// // / END OF CONTENT TAB // /////////////////////////////////////////////////////////// fdTabFolder = new FormData(); fdTabFolder.left = new FormAttachment( 0, 0 ); fdTabFolder.top = new FormAttachment( wStepname, margin ); fdTabFolder.right = new FormAttachment( 100, 0 ); fdTabFolder.bottom = new FormAttachment( 100, -50 ); wTabFolder.setLayoutData( fdTabFolder ); fdBottom = new FormData(); fdBottom.left = new FormAttachment( 0, 0 ); fdBottom.top = new FormAttachment( 0, 0 ); fdBottom.right = new FormAttachment( 100, 0 ); fdBottom.bottom = new FormAttachment( 100, 0 ); wBottom.setLayoutData( fdBottom ); fdSash = new FormData(); fdSash.left = new FormAttachment( 0, 0 ); fdSash.top = new FormAttachment( wStepname, 0 ); fdSash.right = new FormAttachment( 100, 0 ); fdSash.bottom = new FormAttachment( 100, -50 ); wSash.setLayoutData( fdSash ); wSash.setWeights( new int[] { 60, 40 } ); 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" ) ); lsbTestRegExScript = new Listener() { public void handleEvent( Event e ) { testRegExScript(); } }; wbTestRegExScript.addListener( SWT.Selection, lsbTestRegExScript ); setButtonPositions( new Button[] { wOK, wCancel }, margin, null ); // 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 ); lsDef = new SelectionAdapter() { public void widgetDefaultSelected( SelectionEvent e ) { ok(); } }; wStepname.addSelectionListener( lsDef ); wTabFolder.setSelection( 0 ); // Set the shell size, based upon previous time... setSize(); getData(); setFieldsEnabledStatus(); input.setChanged( changed ); shell.open(); while ( !shell.isDisposed() ) { if ( !display.readAndDispatch() ) { display.sleep(); } } return stepname; } private void getPreviousFields() { // Save user-selected value, if applicable String selectedValue = wfieldevaluate.getText(); // Clear the existing list, and reload wfieldevaluate.removeAll(); try { RowMetaInterface r = transMeta.getPrevStepFields( stepname ); if ( r != null ) { for ( String item : r.getFieldNames() ) { wfieldevaluate.add( item ); } } // Re-select the user-selected value, if applicable if ( !Utils.isEmpty( selectedValue ) ) { wfieldevaluate.select( wfieldevaluate.indexOf( selectedValue ) ); } else { wfieldevaluate.select( 0 ); } } catch ( KettleException ke ) { new ErrorDialog( shell, BaseMessages.getString( PKG, "RegexEvalDialog.FailedToGetFields.DialogTitle" ), BaseMessages .getString( PKG, "RegexEvalDialog.FailedToGetFields.DialogMessage" ), ke ); } } /** * Copy information from the meta-data input to the dialog fields. */ public void getData() { if ( input.getScript() != null ) { wScript.setText( input.getScript() ); } if ( input.getResultFieldName() != null ) { wResultField.setText( input.getResultFieldName() ); } if ( input.getMatcher() != null ) { wfieldevaluate.setText( input.getMatcher() ); } wUseVar.setSelection( input.isUseVariableInterpolationFlagSet() ); wReplaceFields.setSelection( input.isReplacefields() ); wAllowCaptureGroups.setSelection( input.isAllowCaptureGroupsFlagSet() ); wCanonEq.setSelection( input.isCanonicalEqualityFlagSet() ); wCaseInsensitive.setSelection( input.isCaseInsensitiveFlagSet() ); wComment.setSelection( input.isCommentFlagSet() ); wDotAll.setSelection( input.isDotAllFlagSet() ); wMultiline.setSelection( input.isMultilineFlagSet() ); wUnicode.setSelection( input.isUnicodeFlagSet() ); wUnix.setSelection( input.isUnixLineEndingsFlagSet() ); for ( int i = 0; i < input.getFieldName().length; i++ ) { TableItem ti = wFields.table.getItem( i ); if ( input.getFieldName()[i] != null ) { ti.setText( 1, input.getFieldName()[i] ); } ti.setText( 2, ValueMetaFactory.getValueMetaName( input.getFieldType()[i] ) ); ti.setText( 3, input.getFieldLength()[i] >= 0 ? "" + input.getFieldLength()[i] : "" ); ti.setText( 4, input.getFieldPrecision()[i] >= 0 ? ( "" + input.getFieldPrecision()[i] ) : "" ); if ( input.getFieldFormat()[i] != null ) { ti.setText( 5, input.getFieldFormat()[i] ); } if ( input.getFieldGroup()[i] != null ) { ti.setText( 6, input.getFieldGroup()[i] ); } if ( input.getFieldDecimal()[i] != null ) { ti.setText( 7, input.getFieldDecimal()[i] ); } if ( input.getFieldCurrency()[i] != null ) { ti.setText( 8, input.getFieldCurrency()[i] ); } if ( input.getFieldNullIf()[i] != null ) { ti.setText( 9, input.getFieldNullIf()[i] ); } if ( input.getFieldIfNull()[i] != null ) { ti.setText( 10, input.getFieldIfNull()[i] ); } ti.setText( 11, ValueMetaString.getTrimTypeDesc( input.getFieldTrimType()[i] ) ); } wFields.setRowNums(); wFields.optWidth( true ); wStepname.selectAll(); wStepname.setFocus(); } private void cancel() { stepname = null; input.setChanged( changed ); dispose(); } private void ok() { if ( Utils.isEmpty( wStepname.getText() ) ) { return; } stepname = wStepname.getText(); // return value setRegexOptions( input ); int nrfields = wFields.nrNonEmpty(); input.allocate( nrfields ); //CHECKSTYLE:Indentation:OFF for ( int i = 0; i < input.getFieldName().length; i++ ) { TableItem ti = wFields.getNonEmpty( i ); input.getFieldName()[i] = ti.getText( 1 ); input.getFieldType()[i] = ValueMetaFactory.getIdForValueMeta( ti.getText( 2 ) ); input.getFieldLength()[i] = Const.toInt( ti.getText( 3 ), -1 ); input.getFieldPrecision()[i] = Const.toInt( ti.getText( 4 ), -1 ); input.getFieldFormat()[i] = ti.getText( 5 ); input.getFieldGroup()[i] = ti.getText( 6 ); input.getFieldDecimal()[i] = ti.getText( 7 ); input.getFieldCurrency()[i] = ti.getText( 8 ); input.getFieldNullIf()[i] = ti.getText( 9 ); input.getFieldIfNull()[i] = ti.getText( 10 ); input.getFieldTrimType()[i] = ValueMetaString.getTrimTypeByDesc( ti.getText( 11 ) ); } dispose(); } private void setFieldsEnabledStatus() { wlFields.setEnabled( wAllowCaptureGroups.getSelection() ); wFields.setEnabled( wAllowCaptureGroups.getSelection() ); wlReplaceFields.setEnabled( wAllowCaptureGroups.getSelection() ); wReplaceFields.setEnabled( wAllowCaptureGroups.getSelection() ); } private void setRegexOptions( RegexEvalMeta input ) { input.setScript( wScript.getText() ); input.setResultFieldName( wResultField.getText() ); input.setMatcher( wfieldevaluate.getText() ); input.setUseVariableInterpolationFlag( wUseVar.getSelection() ); input.setAllowCaptureGroupsFlag( wAllowCaptureGroups.getSelection() ); input.setReplacefields( wReplaceFields.getSelection() ); input.setCanonicalEqualityFlag( wCanonEq.getSelection() ); input.setCaseInsensitiveFlag( wCaseInsensitive.getSelection() ); input.setCommentFlag( wComment.getSelection() ); input.setDotAllFlag( wDotAll.getSelection() ); input.setMultilineFlag( wMultiline.getSelection() ); input.setUnicodeFlag( wUnicode.getSelection() ); input.setUnixLineEndingsFlag( wUnix.getSelection() ); } private void testRegExScript() { RegexEvalMeta meta = new RegexEvalMeta(); setRegexOptions( meta ); RegexEvalHelperDialog d = new RegexEvalHelperDialog( shell, transMeta, meta.getScript(), meta.getRegexOptions(), meta .isCanonicalEqualityFlagSet() ); wScript.setText( d.open() ); } }