org.pentaho.di.ui.trans.steps.enhanced.jsonoutput.JsonOutputDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.di.ui.trans.steps.enhanced.jsonoutput.JsonOutputDialog.java

Source

/*! ******************************************************************************
 *
 * Pentaho Data Integration
 *
 * Copyright (C) 2002-2015 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.enhanced.jsonoutput;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.jface.dialogs.MessageDialog;
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.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.graphics.Cursor;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.*;
import org.pentaho.di.core.Const;
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.ValueMetaInterface;
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.step.StepMeta;
import org.pentaho.di.trans.steps.enhanced.jsonoutput.JsonOutputField;
import org.pentaho.di.trans.steps.enhanced.jsonoutput.JsonOutputKeyField;
import org.pentaho.di.trans.steps.enhanced.jsonoutput.JsonOutputMeta;
import org.pentaho.di.ui.core.dialog.EnterSelectionDialog;
import org.pentaho.di.ui.core.dialog.ErrorDialog;
import org.pentaho.di.ui.core.gui.GUIResource;
import org.pentaho.di.ui.core.widget.ColumnInfo;
import org.pentaho.di.ui.core.widget.ComboVar;
import org.pentaho.di.ui.core.widget.TableView;
import org.pentaho.di.ui.core.widget.TextVar;
import org.pentaho.di.ui.trans.step.BaseStepDialog;
import org.pentaho.di.ui.trans.step.TableItemInsertListener;

public class JsonOutputDialog extends BaseStepDialog implements StepDialogInterface {
    private static Class<?> PKG = JsonOutputMeta.class; // for i18n purposes, needed by Translator2!!

    private CTabFolder wTabFolder;
    private FormData fdTabFolder;

    private CTabItem wGeneralTab, wFieldsTab, wKeyConfigTab, wAdditionalFieldsConfigTab;
    private FormData fdGeneralComp, fdFieldsComp, fdConfigComp;

    private Label wlEncoding;
    private ComboVar wEncoding;
    private FormData fdlEncoding, fdEncoding;

    private Label wlOutputValue;
    private TextVar wOutputValue;
    private FormData fdlOutputValue, fdOutputValue;

    private Label wlUseArrayWithSingleInstance;
    private Button wUseArrayWithSingleInstance;
    private FormData fdlUseArrayWithSingleInstance, fdUseArrayWithSingleInstance;

    private Label wlBlocName;
    private TextVar wBlocName;
    private FormData fdlBlocName, fdBlocName;

    private TableView wFields;
    private FormData fdFields;

    private JsonOutputMeta input;

    private boolean gotEncodings = false;
    private boolean gotPreviousFields = false;

    private ColumnInfo[] colinf;
    private ColumnInfo[] keyColInf;

    private TableView wKeyFields;
    private FormData fdKeyFields;

    private Label wlAddToResult;
    private Button wAddToResult;
    private FormData fdlAddToResult, fdAddToResult;

    private Group wFileName;
    private FormData fdFileName;

    private Label wlFilename;
    private Button wbFilename;
    private TextVar wFilename;
    private FormData fdlFilename, fdbFilename, fdFilename;

    private Label wlExtension;
    private TextVar wExtension;
    private FormData fdlExtension, fdExtension;

    private Label wlServletOutput;
    private Button wServletOutput;
    private FormData fdlServletOutput, fdServletOutput;

    private Label wlCreateParentFolder;
    private Button wCreateParentFolder;
    private FormData fdlCreateParentFolder, fdCreateParentFolder;

    private Label wlDoNotOpenNewFileInit;
    private Button wDoNotOpenNewFileInit;
    private FormData fdlDoNotOpenNewFileInit, fdDoNotOpenNewFileInit;

    private Label wlAddDate;
    private Button wAddDate;
    private FormData fdlAddDate, fdAddDate;

    private Label wlJSONPrittified;
    private Button wJSONPrittified;
    private FormData fdlJSONPrittified, fdJSONPrittified;

    private Label wlSplitOutputAfter;
    private TextVar wSplitOutputAfter;
    private FormData fdlSplitOutputAfter, fdSplitOutputAfter;

    private Label wlAddTime;
    private Button wAddTime;
    private FormData fdlAddTime, fdAddTime;

    private Button wbShowFiles;
    private FormData fdbShowFiles;

    private Label wlAppend;
    private Button wAppend;
    private FormData fdlAppend, fdAppend;

    private Label wlOperation;
    private CCombo wOperation;
    private FormData fdlOperation;
    private FormData fdOperation;

    private Label wlGeneration;
    private CCombo wGeneration;
    private FormData fdlGeneration;
    private FormData fdGeneration;

    private Label wlJSONSizeFieldname;
    private TextVar wJSONSizeFieldname;
    private FormData fdlJSONSizeFieldname, fdJSONSizeFieldname;

    private Label wlJSONPageStartAtFieldname;
    private TextVar wJSONPageStartAtFieldname;
    private FormData fdlJSONPageStartAtFieldname, fdJSONPageStartAtFieldname;

    private Label wlJSONPageEndAtFieldname;
    private TextVar wJSONPageEndAtFieldname;
    private FormData fdlJSONPageEndAtFieldname, fdJSONPageEndAtFieldname;

    private Group wSettings;
    private FormData fdSettings;

    private Map<String, Integer> inputFields;

    public JsonOutputDialog(Shell parent, Object in, TransMeta transMeta, String sname) {
        super(parent, (BaseStepMeta) in, transMeta, sname);
        input = (JsonOutputMeta) in;
        inputFields = new HashMap<String, Integer>();
    }

    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, "JsonOutputDialog.DialogTitle"));

        int middle = props.getMiddlePct();
        int margin = Const.MARGIN;

        // Stepname line
        wlStepname = new Label(shell, SWT.RIGHT);
        wlStepname.setText(BaseMessages.getString(PKG, "System.Label.StepName"));
        props.setLook(wlStepname);
        fdlStepname = new FormData();
        fdlStepname.left = new FormAttachment(0, 0);
        fdlStepname.top = new FormAttachment(0, margin);
        fdlStepname.right = new FormAttachment(middle, -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);

        wTabFolder = new CTabFolder(shell, SWT.BORDER);
        props.setLook(wTabFolder, Props.WIDGET_STYLE_TAB);

        // ////////////////////////
        // START OF General TAB///
        // /
        wGeneralTab = new CTabItem(wTabFolder, SWT.NONE);
        wGeneralTab.setText(BaseMessages.getString(PKG, "JsonOutputDialog.GeneralTab.TabTitle"));

        FormLayout GeneralLayout = new FormLayout();
        GeneralLayout.marginWidth = 3;
        GeneralLayout.marginHeight = 20;

        Composite wGeneralComp = new Composite(wTabFolder, SWT.NONE);
        props.setLook(wGeneralComp);
        wGeneralComp.setLayout(GeneralLayout);

        // Operation
        wlOperation = new Label(wGeneralComp, SWT.RIGHT);
        wlOperation.setText(BaseMessages.getString(PKG, "JsonOutputDialog.Operation.Label"));
        props.setLook(wlOperation);
        fdlOperation = new FormData();
        fdlOperation.left = new FormAttachment(0, 0);
        fdlOperation.right = new FormAttachment(middle, -margin);
        fdlOperation.top = new FormAttachment(wlBlocName, margin);
        wlOperation.setLayoutData(fdlOperation);

        wOperation = new CCombo(wGeneralComp, SWT.BORDER | SWT.READ_ONLY);
        props.setLook(wOperation);
        wOperation.addModifyListener(lsMod);
        fdOperation = new FormData();
        fdOperation.left = new FormAttachment(middle, 0);
        fdOperation.top = new FormAttachment(wlBlocName, margin);
        fdOperation.right = new FormAttachment(100, -margin);
        wOperation.setLayoutData(fdOperation);
        wOperation.setItems(JsonOutputMeta.operationTypeDesc);
        wOperation.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                updateOperation();

            }
        });

        createSettingsGroup(lsMod, middle, margin, wGeneralComp);
        createFilenameGroup(lsMod, middle, margin, wGeneralComp);

        fdGeneralComp = new FormData();
        fdGeneralComp.left = new FormAttachment(0, 0);
        fdGeneralComp.top = new FormAttachment(wStepname, margin);
        fdGeneralComp.right = new FormAttachment(100, 0);
        fdGeneralComp.bottom = new FormAttachment(100, 0);
        wGeneralComp.setLayoutData(fdGeneralComp);

        wGeneralComp.layout();
        wGeneralTab.setControl(wGeneralComp);

        // ///////////////////////////////////////////////////////////
        // / END OF General TAB
        // ///////////////////////////////////////////////////////////

        // ///////////////////////////////////////////////////////////
        // START OF Key Configuration TAB///
        // ///////////////////////////////////////////////////////////
        wKeyConfigTab = new CTabItem(wTabFolder, SWT.NONE);
        wKeyConfigTab.setText(BaseMessages.getString(PKG, "JsonOutputDialog.KeyConfigTab.TabTitle"));

        FormLayout keyConfigLayout = new FormLayout();
        keyConfigLayout.marginWidth = 3;
        keyConfigLayout.marginHeight = 3;

        Composite wKeyConfigComp = new Composite(wTabFolder, SWT.NONE);
        props.setLook(wKeyConfigComp);

        /* wGet = new Button(wKeyConfigComp, SWT.PUSH);
        wGet.setText(BaseMessages.getString(PKG, "JsonOutputDialog.Get.Button"));
        wGet.setToolTipText(BaseMessages.getString(PKG, "JsonOutputDialog.Get.Tooltip"));
            
        setButtonPositions(new Button[]{wGet}, margin, null);*/

        final int keyFieldsRows = input.getKeyFields().length;

        keyColInf = new ColumnInfo[] {
                new ColumnInfo(BaseMessages.getString(PKG, "JsonOutputDialog.Fieldname.Column"),
                        ColumnInfo.COLUMN_TYPE_CCOMBO, new String[] { "" }, false), };
        wKeyFields = new TableView(transMeta, wKeyConfigComp, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI,
                keyColInf, keyFieldsRows, lsMod, props);

        fdKeyFields = new FormData();
        fdKeyFields.left = new FormAttachment(0, 0);
        fdKeyFields.top = new FormAttachment(0, 0);
        fdKeyFields.right = new FormAttachment(100, 0);
        fdKeyFields.bottom = new FormAttachment(100, 0);
        // fdKeyFields.bottom = new FormAttachment(wGet, -margin);
        wKeyFields.setLayoutData(fdKeyFields);

        wKeyConfigComp.setLayout(keyConfigLayout);
        wKeyConfigComp.layout();
        wKeyConfigTab.setControl(wKeyConfigComp);

        // ///////////////////////////////////////////////////////////
        // END OF Key Configuration TAB
        // ///////////////////////////////////////////////////////////

        // ///////////////////////////////////////////////////////////
        // Fields tab...
        // ///////////////////////////////////////////////////////////
        wFieldsTab = new CTabItem(wTabFolder, SWT.NONE);
        wFieldsTab.setText(BaseMessages.getString(PKG, "JsonOutputDialog.FieldsTab.TabTitle"));

        FormLayout fieldsLayout = new FormLayout();
        fieldsLayout.marginWidth = Const.FORM_MARGIN;
        fieldsLayout.marginHeight = Const.FORM_MARGIN;

        Composite wFieldsComp = new Composite(wTabFolder, SWT.NONE);
        wFieldsComp.setLayout(fieldsLayout);
        props.setLook(wFieldsComp);

        wGet = new Button(wFieldsComp, SWT.PUSH);
        wGet.setText(BaseMessages.getString(PKG, "JsonOutputDialog.Get.Button"));
        wGet.setToolTipText(BaseMessages.getString(PKG, "JsonOutputDialog.Get.Tooltip"));

        setButtonPositions(new Button[] { wGet }, margin, null);

        final int fieldsRows = input.getOutputFields().length;

        colinf = new ColumnInfo[] {
                new ColumnInfo(BaseMessages.getString(PKG, "JsonOutputDialog.Fieldname.Column"),
                        ColumnInfo.COLUMN_TYPE_CCOMBO, new String[] { "" }, false),
                new ColumnInfo(BaseMessages.getString(PKG, "JsonOutputDialog.ElementName.Column"),
                        ColumnInfo.COLUMN_TYPE_TEXT, false),
                new ColumnInfo(BaseMessages.getString(PKG, "JsonOutputDialog.JSONFragment.Column"),
                        ColumnInfo.COLUMN_TYPE_CCOMBO,
                        new String[] { BaseMessages.getString(PKG, "System.Combo.Yes"),
                                BaseMessages.getString(PKG, "System.Combo.No") },
                        true),
                new ColumnInfo(BaseMessages.getString(PKG, "JsonOutputDialog.RemoveIfBlank.Column"),
                        ColumnInfo.COLUMN_TYPE_CCOMBO,
                        new String[] { BaseMessages.getString(PKG, "System.Combo.Yes"),
                                BaseMessages.getString(PKG, "System.Combo.No") },
                        true), };
        colinf[1].setUsingVariables(true);
        wFields = new TableView(transMeta, wFieldsComp, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI, colinf,
                fieldsRows, lsMod, props);

        fdFields = new FormData();
        fdFields.left = new FormAttachment(0, 0);
        fdFields.top = new FormAttachment(0, 0);
        fdFields.right = new FormAttachment(100, 0);
        fdFields.bottom = new FormAttachment(wGet, -margin);
        wFields.setLayoutData(fdFields);

        // ///////////////////////////////////////////////////////////
        // START OF Additional Fields Configuration TAB///
        // ///////////////////////////////////////////////////////////
        wAdditionalFieldsConfigTab = new CTabItem(wTabFolder, SWT.NONE);
        wAdditionalFieldsConfigTab
                .setText(BaseMessages.getString(PKG, "JsonOutputDialog.AdditionalFieldsConfigTab.TabTitle"));

        FormLayout additionalFieldsConfigLayout = new FormLayout();
        additionalFieldsConfigLayout.marginWidth = 3;
        additionalFieldsConfigLayout.marginHeight = 3;

        Composite wAdditionalFieldsConfigComp = new Composite(wTabFolder, SWT.NONE);
        props.setLook(wAdditionalFieldsConfigComp);

        // JSON Size field
        wlJSONSizeFieldname = new Label(wAdditionalFieldsConfigComp, SWT.RIGHT);
        wlJSONSizeFieldname.setText(BaseMessages.getString(PKG, "JsonOutputDialog.JSONSize.Label"));
        props.setLook(wlJSONSizeFieldname);
        fdlJSONSizeFieldname = new FormData();
        fdlJSONSizeFieldname.left = new FormAttachment(0, 0);
        fdlJSONSizeFieldname.right = new FormAttachment(middle, -margin);
        fdlJSONSizeFieldname.top = new FormAttachment(wlBlocName, margin);
        wlJSONSizeFieldname.setLayoutData(fdlJSONSizeFieldname);
        wJSONSizeFieldname = new TextVar(transMeta, wAdditionalFieldsConfigComp, SWT.BORDER | SWT.READ_ONLY);
        wJSONSizeFieldname.setEditable(true);
        props.setLook(wJSONSizeFieldname);
        wJSONSizeFieldname.addModifyListener(lsMod);
        fdJSONSizeFieldname = new FormData();
        fdJSONSizeFieldname.left = new FormAttachment(middle, 0);
        fdJSONSizeFieldname.top = new FormAttachment(wBlocName, margin);
        fdJSONSizeFieldname.right = new FormAttachment(100, 0);
        wJSONSizeFieldname.setLayoutData(fdJSONSizeFieldname);

        // JSON page starts ad field
        wlJSONPageStartAtFieldname = new Label(wAdditionalFieldsConfigComp, SWT.RIGHT);
        wlJSONPageStartAtFieldname.setText(BaseMessages.getString(PKG, "JsonOutputDialog.JSONPageStartsAt.Label"));
        props.setLook(wlJSONPageStartAtFieldname);
        fdlJSONPageStartAtFieldname = new FormData();
        fdlJSONPageStartAtFieldname.left = new FormAttachment(0, 0);
        fdlJSONPageStartAtFieldname.right = new FormAttachment(middle, -margin);
        fdlJSONPageStartAtFieldname.top = new FormAttachment(wlJSONSizeFieldname, margin);
        wlJSONPageStartAtFieldname.setLayoutData(fdlJSONPageStartAtFieldname);
        wJSONPageStartAtFieldname = new TextVar(transMeta, wAdditionalFieldsConfigComp, SWT.BORDER | SWT.READ_ONLY);
        wJSONPageStartAtFieldname.setEditable(true);
        props.setLook(wJSONPageStartAtFieldname);
        wJSONPageStartAtFieldname.addModifyListener(lsMod);
        fdJSONPageStartAtFieldname = new FormData();
        fdJSONPageStartAtFieldname.left = new FormAttachment(middle, 0);
        fdJSONPageStartAtFieldname.top = new FormAttachment(wJSONSizeFieldname, margin);
        fdJSONPageStartAtFieldname.right = new FormAttachment(100, 0);
        wJSONPageStartAtFieldname.setLayoutData(fdJSONPageStartAtFieldname);

        // JSON ends at field
        wlJSONPageEndAtFieldname = new Label(wAdditionalFieldsConfigComp, SWT.RIGHT);
        wlJSONPageEndAtFieldname.setText(BaseMessages.getString(PKG, "JsonOutputDialog.JSONPageEndsAt.Label"));
        props.setLook(wlJSONPageEndAtFieldname);
        fdlJSONPageEndAtFieldname = new FormData();
        fdlJSONPageEndAtFieldname.left = new FormAttachment(0, 0);
        fdlJSONPageEndAtFieldname.right = new FormAttachment(middle, -margin);
        fdlJSONPageEndAtFieldname.top = new FormAttachment(wJSONPageStartAtFieldname, margin);
        wlJSONPageEndAtFieldname.setLayoutData(fdlJSONPageEndAtFieldname);
        wJSONPageEndAtFieldname = new TextVar(transMeta, wAdditionalFieldsConfigComp, SWT.BORDER | SWT.READ_ONLY);
        wJSONPageEndAtFieldname.setEditable(true);
        props.setLook(wJSONPageEndAtFieldname);
        wJSONPageEndAtFieldname.addModifyListener(lsMod);
        fdJSONPageEndAtFieldname = new FormData();
        fdJSONPageEndAtFieldname.left = new FormAttachment(middle, 0);
        fdJSONPageEndAtFieldname.top = new FormAttachment(wJSONPageStartAtFieldname, margin);
        fdJSONPageEndAtFieldname.right = new FormAttachment(100, 0);
        wJSONPageEndAtFieldname.setLayoutData(fdJSONPageEndAtFieldname);

        wAdditionalFieldsConfigComp.setLayout(additionalFieldsConfigLayout);
        wAdditionalFieldsConfigComp.layout();
        wAdditionalFieldsConfigTab.setControl(wAdditionalFieldsConfigComp);

        // ///////////////////////////////////////////////////////////
        // END OF Additional Fields Configuration TAB
        // ///////////////////////////////////////////////////////////

        //
        // Search the fields in the background

        final Runnable runnable = new Runnable() {
            public void run() {
                StepMeta stepMeta = transMeta.findStep(stepname);
                if (stepMeta != null) {
                    try {
                        RowMetaInterface row = transMeta.getPrevStepFields(stepMeta);

                        // Remember these fields...
                        for (int i = 0; i < row.size(); i++) {
                            inputFields.put(row.getValueMeta(i).getName(), Integer.valueOf(i));
                        }
                        setFieldListComboBoxes();
                    } catch (KettleException e) {
                        logError(BaseMessages.getString(PKG, "System.Dialog.GetFieldsFailed.Message"));
                    }
                }
            }
        };
        new Thread(runnable).start();

        fdFieldsComp = new FormData();
        fdFieldsComp.left = new FormAttachment(0, 0);
        fdFieldsComp.top = new FormAttachment(0, 0);
        fdFieldsComp.right = new FormAttachment(100, 0);
        fdFieldsComp.bottom = new FormAttachment(100, 0);
        wFieldsComp.setLayoutData(fdFieldsComp);

        wFieldsComp.layout();
        wFieldsTab.setControl(wFieldsComp);

        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);

        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, wTabFolder);

        // Add listeners
        lsOK = new Listener() {
            public void handleEvent(Event e) {
                ok();
            }
        };
        lsGet = new Listener() {
            public void handleEvent(Event e) {
                get();
            }
        };
        lsCancel = new Listener() {
            public void handleEvent(Event e) {
                cancel();
            }
        };

        wOK.addListener(SWT.Selection, lsOK);
        wGet.addListener(SWT.Selection, lsGet);
        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();
            }
        });

        lsResize = new Listener() {
            public void handleEvent(Event event) {
                Point size = shell.getSize();
                wFields.setSize(size.x - 10, size.y - 50);
                wFields.table.setSize(size.x - 10, size.y - 50);
                wFields.redraw();
            }
        };
        shell.addListener(SWT.Resize, lsResize);

        wTabFolder.setSelection(0);

        // Set the shell size, based upon previous time...
        setSize();

        getData();
        updateOperation();
        input.setChanged(changed);

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        return stepname;
    }

    private void createSettingsGroup(ModifyListener lsMod, int middle, int margin, Composite wGeneralComp) {
        // ////////////////////////
        // START OF Settings GROUP
        //

        wSettings = new Group(wGeneralComp, SWT.SHADOW_NONE);
        props.setLook(wSettings);
        wSettings.setText(BaseMessages.getString(PKG, "JsonOutputDialog.Group.Settings.Label"));

        FormLayout groupFileLayout = new FormLayout();
        groupFileLayout.marginWidth = 10;
        groupFileLayout.marginHeight = 10;
        wSettings.setLayout(groupFileLayout);

        // Generation
        wlGeneration = new Label(wSettings, SWT.RIGHT);
        wlGeneration.setText(BaseMessages.getString(PKG, "JsonOutputDialog.Generation.Label"));
        props.setLook(wlGeneration);
        fdlGeneration = new FormData();
        fdlGeneration.left = new FormAttachment(0, 0);
        fdlGeneration.right = new FormAttachment(middle, -margin);
        fdlGeneration.top = new FormAttachment(wlOperation, margin);
        wlGeneration.setLayoutData(fdlGeneration);

        wGeneration = new CCombo(wSettings, SWT.BORDER | SWT.READ_ONLY);
        props.setLook(wGeneration);
        wGeneration.addModifyListener(lsMod);
        fdGeneration = new FormData();
        fdGeneration.left = new FormAttachment(middle, 0);
        fdGeneration.top = new FormAttachment(wlOperation, margin);
        fdGeneration.right = new FormAttachment(100, -margin);
        wGeneration.setLayoutData(fdGeneration);
        wGeneration.setItems(JsonOutputMeta.generationTypeDesc);
        wGeneration.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                updateGeneration();

            }
        });

        wlBlocName = new Label(wSettings, SWT.RIGHT);
        wlBlocName.setText(BaseMessages.getString(PKG, "JsonOutputDialog.BlocName.Label"));
        props.setLook(wlBlocName);
        fdlBlocName = new FormData();
        fdlBlocName.left = new FormAttachment(0, 0);
        fdlBlocName.top = new FormAttachment(wGeneration, margin);
        fdlBlocName.right = new FormAttachment(middle, -margin);
        wlBlocName.setLayoutData(fdlBlocName);
        wBlocName = new TextVar(transMeta, wSettings, SWT.BORDER | SWT.READ_ONLY);
        wBlocName.setEditable(true);
        props.setLook(wBlocName);
        wBlocName.addModifyListener(lsMod);
        fdBlocName = new FormData();
        fdBlocName.left = new FormAttachment(middle, 0);
        fdBlocName.top = new FormAttachment(wGeneration, margin);
        fdBlocName.right = new FormAttachment(100, 0);
        wBlocName.setLayoutData(fdBlocName);

        wlOutputValue = new Label(wSettings, SWT.RIGHT);
        wlOutputValue.setText(BaseMessages.getString(PKG, "JsonOutputDialog.OutputValue.Label"));
        props.setLook(wlOutputValue);
        fdlOutputValue = new FormData();
        fdlOutputValue.left = new FormAttachment(0, 0);
        fdlOutputValue.top = new FormAttachment(wBlocName, margin);
        fdlOutputValue.right = new FormAttachment(middle, -margin);
        wlOutputValue.setLayoutData(fdlOutputValue);
        wOutputValue = new TextVar(transMeta, wSettings, SWT.BORDER | SWT.READ_ONLY);
        wOutputValue.setEditable(true);
        wOutputValue.setToolTipText("JsonOutputDialog.OutputValue.Tooltip");
        props.setLook(wOutputValue);
        wOutputValue.addModifyListener(lsMod);
        fdOutputValue = new FormData();
        fdOutputValue.left = new FormAttachment(middle, 0);
        fdOutputValue.top = new FormAttachment(wBlocName, margin);
        fdOutputValue.right = new FormAttachment(100, 0);
        wOutputValue.setLayoutData(fdOutputValue);

        wlUseArrayWithSingleInstance = new Label(wSettings, SWT.RIGHT);
        wlUseArrayWithSingleInstance
                .setText(BaseMessages.getString(PKG, "JsonOutputDialog.UseArrayWihSingleInstanceMode.Label"));
        props.setLook(wlUseArrayWithSingleInstance);
        fdlUseArrayWithSingleInstance = new FormData();
        fdlUseArrayWithSingleInstance.left = new FormAttachment(0, 0);
        fdlUseArrayWithSingleInstance.top = new FormAttachment(wOutputValue, margin);
        fdlUseArrayWithSingleInstance.right = new FormAttachment(middle, -margin);
        wlUseArrayWithSingleInstance.setLayoutData(fdlUseArrayWithSingleInstance);
        wUseArrayWithSingleInstance = new Button(wSettings, SWT.CHECK);
        wUseArrayWithSingleInstance.setToolTipText(
                BaseMessages.getString(PKG, "JsonOutputDialog.UseArrayWihSingleInstanceMode.Tooltip"));
        props.setLook(wUseArrayWithSingleInstance);
        fdUseArrayWithSingleInstance = new FormData();
        fdUseArrayWithSingleInstance.left = new FormAttachment(middle, 0);
        fdUseArrayWithSingleInstance.top = new FormAttachment(wOutputValue, margin);
        fdUseArrayWithSingleInstance.right = new FormAttachment(100, 0);
        wUseArrayWithSingleInstance.setLayoutData(fdUseArrayWithSingleInstance);
        wUseArrayWithSingleInstance.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                input.setChanged();
            }
        });

        wlJSONPrittified = new Label(wSettings, SWT.RIGHT);
        wlJSONPrittified.setText(BaseMessages.getString(PKG, "JsonOutputDialog.JSONPrittified.Label"));
        props.setLook(wlJSONPrittified);
        fdlJSONPrittified = new FormData();
        fdlJSONPrittified.left = new FormAttachment(0, 0);
        fdlJSONPrittified.top = new FormAttachment(wUseArrayWithSingleInstance, margin);
        fdlJSONPrittified.right = new FormAttachment(middle, -margin);
        wlJSONPrittified.setLayoutData(fdlJSONPrittified);
        wJSONPrittified = new Button(wSettings, SWT.CHECK);
        wJSONPrittified.setToolTipText(BaseMessages.getString(PKG, "JsonOutputDialog.JSONPrittified.Tooltip"));
        props.setLook(wJSONPrittified);
        fdJSONPrittified = new FormData();
        fdJSONPrittified.left = new FormAttachment(middle, 0);
        fdJSONPrittified.top = new FormAttachment(wUseArrayWithSingleInstance, margin);
        fdJSONPrittified.right = new FormAttachment(100, 0);
        wJSONPrittified.setLayoutData(fdJSONPrittified);
        wJSONPrittified.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                input.setChanged();
            }
        });

        wlSplitOutputAfter = new Label(wSettings, SWT.RIGHT);
        wlSplitOutputAfter.setText(BaseMessages.getString(PKG, "JsonOutputDialog.splitOutputAfter.Label"));
        props.setLook(wlSplitOutputAfter);
        fdlSplitOutputAfter = new FormData();
        fdlSplitOutputAfter.left = new FormAttachment(0, 0);
        fdlSplitOutputAfter.top = new FormAttachment(wJSONPrittified, margin);
        fdlSplitOutputAfter.right = new FormAttachment(middle, -margin);
        wlSplitOutputAfter.setLayoutData(fdlSplitOutputAfter);
        wSplitOutputAfter = new TextVar(transMeta, wSettings, SWT.BORDER | SWT.READ_ONLY);
        wSplitOutputAfter.setEditable(true);
        wSplitOutputAfter.setToolTipText("JsonOutputDialog.splitOutputAfter.Tooltip");
        props.setLook(wSplitOutputAfter);
        fdSplitOutputAfter = new FormData();
        fdSplitOutputAfter.left = new FormAttachment(middle, 0);
        fdSplitOutputAfter.top = new FormAttachment(wJSONPrittified, margin);
        fdSplitOutputAfter.right = new FormAttachment(100, 0);
        wSplitOutputAfter.setLayoutData(fdSplitOutputAfter);
        wSplitOutputAfter.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                input.setChanged();
            }
        });

        fdSettings = new FormData();
        fdSettings.left = new FormAttachment(0, margin);
        fdSettings.top = new FormAttachment(wOperation, 2 * margin);
        fdSettings.right = new FormAttachment(100, -margin);
        wSettings.setLayoutData(fdSettings);

        // ///////////////////////////////////////////////////////////
        // / END OF Settings GROUP
        // ///////////////////////////////////////////////////////////
    }

    private void createFilenameGroup(ModifyListener lsMod, int middle, int margin, Composite wGeneralComp) {
        // Connection grouping?
        // ////////////////////////
        // START OF FileName GROUP
        //

        wFileName = new Group(wGeneralComp, SWT.SHADOW_NONE);
        props.setLook(wFileName);
        wFileName.setText(BaseMessages.getString(PKG, "JsonOutputDialog.Group.File.Label"));

        FormLayout groupfilenameayout = new FormLayout();
        groupfilenameayout.marginWidth = 10;
        groupfilenameayout.marginHeight = 10;
        wFileName.setLayout(groupfilenameayout);

        // Filename line
        wlFilename = new Label(wFileName, SWT.RIGHT);
        wlFilename.setText(BaseMessages.getString(PKG, "JsonOutputDialog.Filename.Label"));
        props.setLook(wlFilename);
        fdlFilename = new FormData();
        fdlFilename.left = new FormAttachment(0, 0);
        fdlFilename.top = new FormAttachment(wOperation, margin);
        fdlFilename.right = new FormAttachment(middle, -margin);
        wlFilename.setLayoutData(fdlFilename);

        wbFilename = new Button(wFileName, SWT.PUSH | SWT.CENTER);
        props.setLook(wbFilename);
        wbFilename.setText(BaseMessages.getString(PKG, "System.Button.Browse"));
        fdbFilename = new FormData();
        fdbFilename.right = new FormAttachment(100, 0);
        fdbFilename.top = new FormAttachment(wSettings, 0);
        wbFilename.setLayoutData(fdbFilename);
        wbFilename.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                FileDialog dialog = new FileDialog(shell, SWT.SAVE);
                dialog.setFilterExtensions(new String[] { "*.js", "*.JS", "*" });
                if (wFilename.getText() != null) {
                    dialog.setFileName(transMeta.environmentSubstitute(wFilename.getText()));
                }
                dialog.setFilterNames(new String[] { BaseMessages.getString(PKG, "System.FileType.TextFiles"),
                        BaseMessages.getString(PKG, "System.FileType.CSVFiles"),
                        BaseMessages.getString(PKG, "System.FileType.AllFiles") });
                if (dialog.open() != null) {
                    String extension = wExtension.getText();
                    if (extension != null && dialog.getFileName() != null
                            && dialog.getFileName().endsWith("." + extension)) {
                        // The extension is filled in and matches the end
                        // of the selected file => Strip off the extension.
                        String fileName = dialog.getFileName();
                        wFilename.setText(dialog.getFilterPath() + System.getProperty("file.separator")
                                + fileName.substring(0, fileName.length() - (extension.length() + 1)));
                    } else {
                        wFilename.setText(dialog.getFilterPath() + System.getProperty("file.separator")
                                + dialog.getFileName());
                    }
                }
            }
        });
        wFilename = new TextVar(transMeta, wFileName, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        props.setLook(wFilename);
        wFilename.addModifyListener(lsMod);
        fdFilename = new FormData();
        fdFilename.left = new FormAttachment(middle, 0);
        fdFilename.top = new FormAttachment(wOutputValue, margin);
        fdFilename.right = new FormAttachment(wbFilename, -margin);
        wFilename.setLayoutData(fdFilename);

        // Append to end of file?
        wlAppend = new Label(wFileName, SWT.RIGHT);
        wlAppend.setText(BaseMessages.getString(PKG, "JsonOutputDialog.Append.Label"));
        props.setLook(wlAppend);
        fdlAppend = new FormData();
        fdlAppend.left = new FormAttachment(0, 0);
        fdlAppend.top = new FormAttachment(wFilename, margin);
        fdlAppend.right = new FormAttachment(middle, -margin);
        wlAppend.setLayoutData(fdlAppend);
        wAppend = new Button(wFileName, SWT.CHECK);
        wAppend.setToolTipText(BaseMessages.getString(PKG, "JsonOutputDialog.Append.Tooltip"));
        props.setLook(wAppend);
        fdAppend = new FormData();
        fdAppend.left = new FormAttachment(middle, 0);
        fdAppend.top = new FormAttachment(wFilename, margin);
        fdAppend.right = new FormAttachment(100, 0);
        wAppend.setLayoutData(fdAppend);
        wAppend.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                input.setChanged();
            }
        });

        // Create Parent Folder
        wlCreateParentFolder = new Label(wFileName, SWT.RIGHT);
        wlCreateParentFolder.setText(BaseMessages.getString(PKG, "JsonOutputDialog.CreateParentFolder.Label"));
        props.setLook(wlCreateParentFolder);
        fdlCreateParentFolder = new FormData();
        fdlCreateParentFolder.left = new FormAttachment(0, 0);
        fdlCreateParentFolder.top = new FormAttachment(wAppend, margin);
        fdlCreateParentFolder.right = new FormAttachment(middle, -margin);
        wlCreateParentFolder.setLayoutData(fdlCreateParentFolder);
        wCreateParentFolder = new Button(wFileName, SWT.CHECK);
        wCreateParentFolder
                .setToolTipText(BaseMessages.getString(PKG, "JsonOutputDialog.CreateParentFolder.Tooltip"));
        props.setLook(wCreateParentFolder);
        fdCreateParentFolder = new FormData();
        fdCreateParentFolder.left = new FormAttachment(middle, 0);
        fdCreateParentFolder.top = new FormAttachment(wAppend, margin);
        fdCreateParentFolder.right = new FormAttachment(100, 0);
        wCreateParentFolder.setLayoutData(fdCreateParentFolder);
        wCreateParentFolder.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                input.setChanged();
            }
        });

        // Open new File at Init
        wlDoNotOpenNewFileInit = new Label(wFileName, SWT.RIGHT);
        wlDoNotOpenNewFileInit.setText(BaseMessages.getString(PKG, "JsonOutputDialog.DoNotOpenNewFileInit.Label"));
        props.setLook(wlDoNotOpenNewFileInit);
        fdlDoNotOpenNewFileInit = new FormData();
        fdlDoNotOpenNewFileInit.left = new FormAttachment(0, 0);
        fdlDoNotOpenNewFileInit.top = new FormAttachment(wCreateParentFolder, margin);
        fdlDoNotOpenNewFileInit.right = new FormAttachment(middle, -margin);
        wlDoNotOpenNewFileInit.setLayoutData(fdlDoNotOpenNewFileInit);
        wDoNotOpenNewFileInit = new Button(wFileName, SWT.CHECK);
        wDoNotOpenNewFileInit
                .setToolTipText(BaseMessages.getString(PKG, "JsonOutputDialog.DoNotOpenNewFileInit.Tooltip"));
        props.setLook(wDoNotOpenNewFileInit);
        fdDoNotOpenNewFileInit = new FormData();
        fdDoNotOpenNewFileInit.left = new FormAttachment(middle, 0);
        fdDoNotOpenNewFileInit.top = new FormAttachment(wCreateParentFolder, margin);
        fdDoNotOpenNewFileInit.right = new FormAttachment(100, 0);
        wDoNotOpenNewFileInit.setLayoutData(fdDoNotOpenNewFileInit);
        wDoNotOpenNewFileInit.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                input.setChanged();
            }
        });

        createExtensionLine(lsMod, middle, margin);

        // Output to servlet (browser, ws)
        //
        wlServletOutput = new Label(wFileName, SWT.RIGHT);
        wlServletOutput.setText(BaseMessages.getString(PKG, "JsonOutputDialog.ServletOutput.Label"));
        props.setLook(wlServletOutput);
        fdlServletOutput = new FormData();
        fdlServletOutput.left = new FormAttachment(0, 0);
        fdlServletOutput.top = new FormAttachment(wEncoding, margin);
        fdlServletOutput.right = new FormAttachment(middle, -margin);
        wlServletOutput.setLayoutData(fdlServletOutput);
        wServletOutput = new Button(wFileName, SWT.CHECK);
        wServletOutput.setToolTipText(BaseMessages.getString(PKG, "JsonOutputDialog.ServletOutput.Tooltip"));
        props.setLook(wServletOutput);
        fdServletOutput = new FormData();
        fdServletOutput.left = new FormAttachment(middle, 0);
        fdServletOutput.top = new FormAttachment(wEncoding, margin);
        fdServletOutput.right = new FormAttachment(100, 0);
        wServletOutput.setLayoutData(fdServletOutput);
        wServletOutput.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                input.setChanged();
                setFlagsServletOption();
            }
        });

        // Create multi-part file?
        wlAddDate = new Label(wFileName, SWT.RIGHT);
        wlAddDate.setText(BaseMessages.getString(PKG, "JsonOutputDialog.AddDate.Label"));
        props.setLook(wlAddDate);
        fdlAddDate = new FormData();
        fdlAddDate.left = new FormAttachment(0, 0);
        fdlAddDate.top = new FormAttachment(wServletOutput, margin);
        fdlAddDate.right = new FormAttachment(middle, -margin);
        wlAddDate.setLayoutData(fdlAddDate);
        wAddDate = new Button(wFileName, SWT.CHECK);
        props.setLook(wAddDate);
        fdAddDate = new FormData();
        fdAddDate.left = new FormAttachment(middle, 0);
        fdAddDate.top = new FormAttachment(wServletOutput, margin);
        fdAddDate.right = new FormAttachment(100, 0);
        wAddDate.setLayoutData(fdAddDate);
        wAddDate.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                input.setChanged();
            }
        });
        // Create multi-part file?
        wlAddTime = new Label(wFileName, SWT.RIGHT);
        wlAddTime.setText(BaseMessages.getString(PKG, "JsonOutputDialog.AddTime.Label"));
        props.setLook(wlAddTime);
        fdlAddTime = new FormData();
        fdlAddTime.left = new FormAttachment(0, 0);
        fdlAddTime.top = new FormAttachment(wAddDate, margin);
        fdlAddTime.right = new FormAttachment(middle, -margin);
        wlAddTime.setLayoutData(fdlAddTime);
        wAddTime = new Button(wFileName, SWT.CHECK);
        props.setLook(wAddTime);
        fdAddTime = new FormData();
        fdAddTime.left = new FormAttachment(middle, 0);
        fdAddTime.top = new FormAttachment(wAddDate, margin);
        fdAddTime.right = new FormAttachment(100, 0);
        wAddTime.setLayoutData(fdAddTime);
        wAddTime.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                input.setChanged();
            }
        });

        wbShowFiles = new Button(wFileName, SWT.PUSH | SWT.CENTER);
        props.setLook(wbShowFiles);
        wbShowFiles.setText(BaseMessages.getString(PKG, "JsonOutputDialog.ShowFiles.Button"));
        fdbShowFiles = new FormData();
        fdbShowFiles.left = new FormAttachment(middle, 0);
        fdbShowFiles.top = new FormAttachment(wAddTime, margin * 2);
        wbShowFiles.setLayoutData(fdbShowFiles);
        wbShowFiles.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                JsonOutputMeta tfoi = new JsonOutputMeta();
                getInfo(tfoi);
                String[] files = tfoi.getFiles(transMeta.environmentSubstitute(wFilename.getText()));
                if (files != null && files.length > 0) {
                    EnterSelectionDialog esd = new EnterSelectionDialog(shell, files,
                            BaseMessages.getString(PKG, "JsonOutputDialog.SelectOutputFiles.DialogTitle"),
                            BaseMessages.getString(PKG, "JsonOutputDialog.SelectOutputFiles.DialogMessage"));
                    esd.setViewOnly();
                    esd.open();
                } else {
                    MessageBox mb = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR);
                    mb.setMessage(BaseMessages.getString(PKG, "JsonOutputDialog.NoFilesFound.DialogMessage"));
                    mb.setText(BaseMessages.getString(PKG, "System.DialogTitle.Error"));
                    mb.open();
                }
            }
        });

        // Add File to the result files name
        wlAddToResult = new Label(wFileName, SWT.RIGHT);
        wlAddToResult.setText(BaseMessages.getString(PKG, "JsonOutputDialog.AddFileToResult.Label"));
        props.setLook(wlAddToResult);
        fdlAddToResult = new FormData();
        fdlAddToResult.left = new FormAttachment(0, 0);
        fdlAddToResult.top = new FormAttachment(wbShowFiles, margin);
        fdlAddToResult.right = new FormAttachment(middle, -margin);
        wlAddToResult.setLayoutData(fdlAddToResult);
        wAddToResult = new Button(wFileName, SWT.CHECK);
        wAddToResult.setToolTipText(BaseMessages.getString(PKG, "JsonOutputDialog.AddFileToResult.Tooltip"));
        props.setLook(wAddToResult);
        fdAddToResult = new FormData();
        fdAddToResult.left = new FormAttachment(middle, 0);
        fdAddToResult.top = new FormAttachment(wbShowFiles, margin);
        fdAddToResult.right = new FormAttachment(100, 0);
        wAddToResult.setLayoutData(fdAddToResult);
        SelectionAdapter lsSelR = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                input.setChanged();
            }
        };
        wAddToResult.addSelectionListener(lsSelR);

        fdFileName = new FormData();
        fdFileName.left = new FormAttachment(0, margin);
        fdFileName.top = new FormAttachment(wSettings, 2 * margin);
        fdFileName.right = new FormAttachment(100, -margin);
        wFileName.setLayoutData(fdFileName);

        // ///////////////////////////////////////////////////////////
        // / END OF FileName GROUP
        // ///////////////////////////////////////////////////////////
    }

    private void createExtensionLine(ModifyListener lsMod, int middle, int margin) {
        // Extension line
        wlExtension = new Label(wFileName, SWT.RIGHT);
        wlExtension.setText(BaseMessages.getString(PKG, "System.Label.Extension"));
        props.setLook(wlExtension);
        fdlExtension = new FormData();
        fdlExtension.left = new FormAttachment(0, 0);
        fdlExtension.top = new FormAttachment(wDoNotOpenNewFileInit, margin);
        fdlExtension.right = new FormAttachment(middle, -margin);
        wlExtension.setLayoutData(fdlExtension);

        wExtension = new TextVar(transMeta, wFileName, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
        props.setLook(wExtension);
        wExtension.addModifyListener(lsMod);
        fdExtension = new FormData();
        fdExtension.left = new FormAttachment(middle, 0);
        fdExtension.top = new FormAttachment(wDoNotOpenNewFileInit, margin);
        fdExtension.right = new FormAttachment(100, -margin);
        wExtension.setLayoutData(fdExtension);

        wlEncoding = new Label(wFileName, SWT.RIGHT);
        wlEncoding.setText(BaseMessages.getString(PKG, "JsonOutputDialog.Encoding.Label"));
        props.setLook(wlEncoding);
        fdlEncoding = new FormData();
        fdlEncoding.left = new FormAttachment(0, 0);
        fdlEncoding.top = new FormAttachment(wExtension, margin);
        fdlEncoding.right = new FormAttachment(middle, -margin);
        wlEncoding.setLayoutData(fdlEncoding);
        wEncoding = new ComboVar(transMeta, wFileName, SWT.BORDER | SWT.READ_ONLY);
        wEncoding.setEditable(true);
        props.setLook(wEncoding);
        wEncoding.addModifyListener(lsMod);
        fdEncoding = new FormData();
        fdEncoding.left = new FormAttachment(middle, 0);
        fdEncoding.top = new FormAttachment(wExtension, margin);
        fdEncoding.right = new FormAttachment(100, 0);
        wEncoding.setLayoutData(fdEncoding);
        wEncoding.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);
                setEncodings();
                shell.setCursor(null);
                busy.dispose();
            }
        });
    }

    protected void setFlagsServletOption() {
        boolean enableFilename = !wServletOutput.getSelection();
        wlFilename.setEnabled(enableFilename);
        wFilename.setEnabled(enableFilename);
        wlDoNotOpenNewFileInit.setEnabled(enableFilename);
        wDoNotOpenNewFileInit.setEnabled(enableFilename);
        wlCreateParentFolder.setEnabled(enableFilename);
        wCreateParentFolder.setEnabled(enableFilename);
        wlExtension.setEnabled(enableFilename);
        wExtension.setEnabled(enableFilename);
        wlAddDate.setEnabled(enableFilename);
        wAddDate.setEnabled(enableFilename);
        wlAddTime.setEnabled(enableFilename);
        wAddTime.setEnabled(enableFilename);
        wlAppend.setEnabled(enableFilename);
        wAppend.setEnabled(enableFilename);
        wbShowFiles.setEnabled(enableFilename);
        wlAddToResult.setEnabled(enableFilename);
        wAddToResult.setEnabled(enableFilename);
    }

    protected void setFieldListComboBoxes() {
        // Something was changed in the row.
        //
        final Map<String, Integer> fields = new HashMap<String, Integer>();

        // Add the currentMeta fields...
        fields.putAll(inputFields);

        Set<String> keySet = fields.keySet();
        List<String> entries = new ArrayList<String>(keySet);

        String[] fieldNames = entries.toArray(new String[entries.size()]);

        Const.sortStrings(fieldNames);
        colinf[0].setComboValues(fieldNames);
        keyColInf[0].setComboValues(fieldNames);
    }

    private void setEncodings() {
        // Encoding of the text file:
        if (!gotEncodings) {
            gotEncodings = true;

            wEncoding.removeAll();
            List<Charset> values = new ArrayList<Charset>(Charset.availableCharsets().values());
            for (int i = 0; i < values.size(); i++) {
                Charset charSet = values.get(i);
                wEncoding.add(charSet.displayName());
            }

            // Now select the default!
            String defEncoding = Const.getEnvironmentVariable("file.encoding", "UTF-8");
            int idx = Const.indexOfString(defEncoding, wEncoding.getItems());
            if (idx >= 0) {
                wEncoding.select(idx);
            } else {
                wEncoding.select(Const.indexOfString("UTF-8", wEncoding.getItems()));
            }
        }
    }

    /**
     * Copy information from the meta-data input to the dialog fields.
     */
    private void getData() {

        wBlocName.setText(Const.NVL(input.getJsonBloc(), ""));
        wEncoding.setText(Const.NVL(input.getEncoding(), ""));
        wOutputValue.setText(Const.NVL(input.getOutputValue(), ""));
        wUseArrayWithSingleInstance.setSelection(input.isUseArrayWithSingleInstance());
        wJSONPrittified.setSelection(input.isJsonPrittified());
        wSplitOutputAfter.setText(Integer.toString(input.getSplitOutputAfter()));
        wOperation.setText(JsonOutputMeta.getOperationTypeDesc(input.getOperationType()));
        wGeneration.setText(JsonOutputMeta.getGenerationTypeDesc(input.getGenerationType()));
        wFilename.setText(Const.NVL(input.getFileName(), ""));
        wCreateParentFolder.setSelection(input.isCreateParentFolder());
        wExtension.setText(Const.NVL(input.getExtension(), "js"));
        wServletOutput.setSelection(input.isServletOutput());
        setFlagsServletOption();

        wAddDate.setSelection(input.isDateInFilename());
        wAddTime.setSelection(input.isTimeInFilename());
        wAppend.setSelection(input.isFileAppended());

        wEncoding.setText(Const.NVL(input.getEncoding(), ""));
        wAddToResult.setSelection(input.AddToResult());
        wDoNotOpenNewFileInit.setSelection(input.isDoNotOpenNewFileInit());

        wJSONSizeFieldname.setText(Const.NVL(input.getJsonSizeFieldname(), ""));
        wJSONPageStartAtFieldname.setText(Const.NVL(input.getJsonPageStartsAtFieldname(), ""));
        wJSONPageEndAtFieldname.setText(Const.NVL(input.getJsonPageEndsAtFieldname(), ""));

        if (isDebug()) {
            logDebug(BaseMessages.getString(PKG, "JsonOutputDialog.Log.GettingFieldsInfo"));
        }

        for (int i = 0; i < input.getKeyFields().length; i++) {
            JsonOutputKeyField field = input.getKeyFields()[i];

            TableItem item = wKeyFields.table.getItem(i);
            item.setText(1, Const.NVL(field.getFieldName(), ""));

        }

        for (int i = 0; i < input.getOutputFields().length; i++) {
            JsonOutputField field = input.getOutputFields()[i];

            TableItem item = wFields.table.getItem(i);
            item.setText(1, Const.NVL(field.getFieldName(), ""));
            item.setText(2, Const.NVL(field.getElementName(), ""));
            String jsonFragment = field.isJSONFragment() ? BaseMessages.getString(PKG, "System.Combo.Yes")
                    : BaseMessages.getString(PKG, "System.Combo.No");
            if (jsonFragment != null) {
                item.setText(3, jsonFragment);
            }
            String removeIfBlank = field.isRemoveIfBlank() ? BaseMessages.getString(PKG, "System.Combo.Yes")
                    : BaseMessages.getString(PKG, "System.Combo.No");
            if (removeIfBlank != null) {
                item.setText(4, removeIfBlank);
            }

        }

        wFields.optWidth(true);
        wStepname.selectAll();
        wStepname.setFocus();
    }

    private void cancel() {
        stepname = null;

        input.setChanged(backupChanged);

        dispose();
    }

    private void getInfo(JsonOutputMeta jsometa) {

        jsometa.setJsonBloc(wBlocName.getText());
        jsometa.setEncoding(wEncoding.getText());
        jsometa.setOutputValue(wOutputValue.getText());
        jsometa.setUseArrayWithSingleInstance(wUseArrayWithSingleInstance.getSelection());
        jsometa.setOperationType(JsonOutputMeta.getOperationTypeByDesc(wOperation.getText()));
        jsometa.setJsonPrittified(wJSONPrittified.getSelection());
        jsometa.setSplitOutputAfter(Integer.parseInt(wSplitOutputAfter.getText()));
        jsometa.setGenerationType(JsonOutputMeta.getGenerationTypeByDesc(wGeneration.getText()));
        jsometa.setCreateParentFolder(wCreateParentFolder.getSelection());
        jsometa.setFileName(wFilename.getText());
        jsometa.setExtension(wExtension.getText());
        jsometa.setServletOutput(wServletOutput.getSelection());
        jsometa.setFileAppended(wAppend.getSelection());

        jsometa.setDateInFilename(wAddDate.getSelection());
        jsometa.setTimeInFilename(wAddTime.getSelection());

        jsometa.setEncoding(wEncoding.getText());
        jsometa.setAddToResult(wAddToResult.getSelection());
        jsometa.setDoNotOpenNewFileInit(wDoNotOpenNewFileInit.getSelection());

        jsometa.setJsonSizeFieldname(wJSONSizeFieldname.getText());
        jsometa.setJsonPageStartsAtFieldname(wJSONPageStartAtFieldname.getText());
        jsometa.setJsonPageEndsAtFieldname(wJSONPageEndAtFieldname.getText());

        int nrKeyFields = wKeyFields.nrNonEmpty();

        jsometa.allocateKey(nrKeyFields);

        for (int i = 0; i < nrKeyFields; i++) {
            JsonOutputKeyField field = new JsonOutputKeyField();

            TableItem item = wKeyFields.getNonEmpty(i);
            field.setFieldName(item.getText(1));
            jsometa.getKeyFields()[i] = field;
        }

        int nrfields = wFields.nrNonEmpty();

        jsometa.allocate(nrfields);

        for (int i = 0; i < nrfields; i++) {
            JsonOutputField field = new JsonOutputField();

            TableItem item = wFields.getNonEmpty(i);
            field.setFieldName(item.getText(1));
            field.setElementName(item.getText(2));
            field.setJSONFragment(
                    BaseMessages.getString(PKG, "System.Combo.Yes").equalsIgnoreCase(item.getText(3)));
            field.setRemoveIfBlank(
                    BaseMessages.getString(PKG, "System.Combo.Yes").equalsIgnoreCase(item.getText(4)));
            // CHECKSTYLE:Indentation:OFF
            jsometa.getOutputFields()[i] = field;
        }
    }

    private void ok() {
        if (Const.isEmpty(wStepname.getText())) {
            return;
        }

        stepname = wStepname.getText(); // return value

        getInfo(input);

        dispose();
    }

    private void get() {
        if (gotPreviousFields) {
            return;
        }
        try {
            RowMetaInterface r = transMeta.getPrevStepFields(stepname);
            if (r != null) {
                getFieldsFromPrevious(r, wFields, 1, new int[] { 1, 2 }, new TableItemInsertListener() {
                    public boolean tableItemInserted(TableItem tableItem, ValueMetaInterface v) {
                        if (v.isNumber()) {
                            if (v.getLength() > 0) {
                                int le = v.getLength();
                                int pr = v.getPrecision();

                                if (v.getPrecision() <= 0) {
                                    pr = 0;
                                }

                                String mask = " ";
                                for (int m = 0; m < le - pr; m++) {
                                    mask += "0";
                                }
                                if (pr > 0) {
                                    mask += ".";
                                }
                                for (int m = 0; m < pr; m++) {
                                    mask += "0";
                                }
                                tableItem.setText(4, mask);
                            }
                        }
                        return true;
                    }
                });
            }
        } catch (KettleException ke) {
            new ErrorDialog(shell, BaseMessages.getString(PKG, "System.Dialog.GetFieldsFailed.Title"),
                    BaseMessages.getString(PKG, "System.Dialog.GetFieldsFailed.Message"), ke);
        }
    }

    public final void getFieldsFromPrevious(RowMetaInterface row, TableView tableView, int keyColumn,
            int[] nameColumn, TableItemInsertListener listener) {
        if (row == null || row.size() == 0) {
            return; // nothing to do
        }

        Table table = tableView.table;

        // get a list of all the non-empty keys (names)
        //
        List<String> keys = new ArrayList<String>();
        for (int i = 0; i < table.getItemCount(); i++) {
            TableItem tableItem = table.getItem(i);
            String key = tableItem.getText(keyColumn);
            if (!Const.isEmpty(key) && keys.indexOf(key) < 0) {
                keys.add(key);
            }
        }

        int choice = 0;

        if (keys.size() > 0) {
            // Ask what we should do with the existing data in the step.
            //
            MessageDialog md = new MessageDialog(tableView.getShell(),
                    BaseMessages.getString(PKG, "BaseStepDialog.GetFieldsChoice.Title"), // "Warning!"
                    null,
                    BaseMessages.getString(
                            PKG, "BaseStepDialog.GetFieldsChoice.Message", "" + keys.size(), "" + row.size()),
                    MessageDialog.WARNING,
                    new String[] { BaseMessages.getString(PKG, "BaseStepDialog.AddNew"),
                            BaseMessages.getString(PKG, "BaseStepDialog.Add"),
                            BaseMessages.getString(PKG, "BaseStepDialog.ClearAndAdd"),
                            BaseMessages.getString(PKG, "BaseStepDialog.Cancel"), },
                    0);
            MessageDialog.setDefaultImage(GUIResource.getInstance().getImageSpoon());
            int idx = md.open();
            choice = idx & 0xFF;
        }

        if (choice == 3 || choice == 255) {
            return; // Cancel clicked
        }

        if (choice == 2) {
            tableView.clearAll(false);
        }

        for (int i = 0; i < row.size(); i++) {
            ValueMetaInterface v = row.getValueMeta(i);

            boolean add = true;

            if (choice == 0) { // hang on, see if it's not yet in the table view

                if (keys.indexOf(v.getName()) >= 0) {
                    add = false;
                }
            }

            if (add) {
                TableItem tableItem = new TableItem(table, SWT.NONE);

                for (int c = 0; c < nameColumn.length; c++) {
                    tableItem.setText(nameColumn[c], Const.NVL(v.getName(), ""));
                }
                if (listener != null) {
                    if (!listener.tableItemInserted(tableItem, v)) {
                        tableItem.dispose(); // remove it again
                    }
                }
            }
        }
        tableView.removeEmptyRows();
        tableView.setRowNums();
        tableView.optWidth(true);
    }

    private void updateGeneration() {
        int generationType = JsonOutputMeta.getGenerationTypeByDesc(wGeneration.getText());
        //boolean activeFile = opType != JsonOutputMeta.OPERATION_TYPE_OUTPUT_VALUE;

    }

    private void updateOperation() {

        int opType = JsonOutputMeta.getOperationTypeByDesc(wOperation.getText());
        boolean activeFile = opType != JsonOutputMeta.OPERATION_TYPE_OUTPUT_VALUE;

        wlFilename.setEnabled(activeFile);
        wFilename.setEnabled(activeFile);
        wbFilename.setEnabled(activeFile);
        wlExtension.setEnabled(activeFile);
        wExtension.setEnabled(activeFile);
        wlEncoding.setEnabled(activeFile);
        wEncoding.setEnabled(activeFile);
        wlAppend.setEnabled(activeFile);
        wAppend.setEnabled(activeFile);
        wlCreateParentFolder.setEnabled(activeFile);
        wCreateParentFolder.setEnabled(activeFile);
        wlDoNotOpenNewFileInit.setEnabled(activeFile);
        wDoNotOpenNewFileInit.setEnabled(activeFile);
        wlAddDate.setEnabled(activeFile);
        wAddDate.setEnabled(activeFile);
        wlAddTime.setEnabled(activeFile);
        wAddTime.setEnabled(activeFile);
        wlAddToResult.setEnabled(activeFile);
        wAddToResult.setEnabled(activeFile);
        wbShowFiles.setEnabled(activeFile);

        wlServletOutput.setEnabled(opType == JsonOutputMeta.OPERATION_TYPE_WRITE_TO_FILE
                || opType == JsonOutputMeta.OPERATION_TYPE_BOTH);
        wServletOutput.setEnabled(opType == JsonOutputMeta.OPERATION_TYPE_WRITE_TO_FILE
                || opType == JsonOutputMeta.OPERATION_TYPE_BOTH);

        boolean activeOutputValue = JsonOutputMeta
                .getOperationTypeByDesc(wOperation.getText()) != JsonOutputMeta.OPERATION_TYPE_WRITE_TO_FILE;

        wlOutputValue.setEnabled(activeOutputValue);
        wOutputValue.setEnabled(activeOutputValue);

        setFlagsServletOption();
    }
}