be.ibridge.kettle.trans.step.selectvalues.SelectValuesDialog.java Source code

Java tutorial

Introduction

Here is the source code for be.ibridge.kettle.trans.step.selectvalues.SelectValuesDialog.java

Source

/**********************************************************************
**                                                                   **
**               This code belongs to the KETTLE project.            **
**                                                                   **
** Kettle, from version 2.2 on, is released into the public domain   **
** under the Lesser GNU Public License (LGPL).                       **
**                                                                   **
** For more details, please read the document LICENSE.txt, included  **
** in this project                                                   **
**                                                                   **
** http://www.kettle.be                                              **
** info@kettle.be                                                    **
**                                                                   **
**********************************************************************/

/*
 * Created on 19-jun-2003
 *
 */

package be.ibridge.kettle.trans.step.selectvalues;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
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 be.ibridge.kettle.core.ColumnInfo;
import be.ibridge.kettle.core.Const;
import be.ibridge.kettle.core.Props;
import be.ibridge.kettle.core.Row;
import be.ibridge.kettle.core.SourceToTargetMapping;
import be.ibridge.kettle.core.dialog.EnterMappingDialog;
import be.ibridge.kettle.core.dialog.ErrorDialog;
import be.ibridge.kettle.core.exception.KettleException;
import be.ibridge.kettle.core.value.Value;
import be.ibridge.kettle.core.widget.TableView;
import be.ibridge.kettle.trans.TransMeta;
import be.ibridge.kettle.trans.step.BaseStepDialog;
import be.ibridge.kettle.trans.step.BaseStepMeta;
import be.ibridge.kettle.trans.step.StepDialogInterface;
import be.ibridge.kettle.trans.step.StepMeta;
import be.ibridge.kettle.trans.step.StepMetaInterface;

/**
 * Dialog for the Select Values step. 
 */
public class SelectValuesDialog extends BaseStepDialog implements StepDialogInterface {
    private CTabFolder wTabFolder;
    private FormData fdTabFolder;

    private CTabItem wSelectTab, wRemoveTab, wMetaTab;

    private Composite wSelectComp, wRemoveComp, wMetaComp;
    private FormData fdSelectComp, fdRemoveComp, fdMetaComp;

    private Label wlFields;
    private TableView wFields;
    private FormData fdlFields, fdFields;

    private Label wlRemove;
    private TableView wRemove;
    private FormData fdlRemove, fdRemove;

    private Label wlMeta;
    private TableView wMeta;
    private FormData fdlMeta, fdMeta;

    private Button wGetSelect, wGetRemove, wGetMeta, wDoMapping;
    private FormData fdGetSelect, fdGetRemove, fdGetMeta;

    private SelectValuesMeta input;

    private List fieldColumns = new ArrayList();

    /**
     * Fields from previous step
     */
    private Row prevFields;

    /**
     * Previous fields are read asynchonous because this might take some time
     * and the user is able to do other things, where he will not need the previous fields
     */
    private boolean bPreviousFieldsLoaded = false;

    public SelectValuesDialog(Shell parent, Object in, TransMeta transMeta, String sname) {
        super(parent, (BaseStepMeta) in, transMeta, sname);
        input = (SelectValuesMeta) in;
    }

    public String open() {
        Shell parent = getParent();
        Display display = parent.getDisplay();

        shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN);
        props.setLook(shell);
        setShellImage(shell, input);

        ModifyListener lsMod = new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                input.setChanged();
            }
        };
        changed = input.hasChanged();

        lsGet = new Listener() {
            public void handleEvent(Event e) {
                get();
            }
        };

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

        shell.setLayout(formLayout);
        shell.setText(Messages.getString("SelectValuesDialog.Shell.Label")); //$NON-NLS-1$

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

        // Stepname line
        wlStepname = new Label(shell, SWT.RIGHT);
        wlStepname.setText(Messages.getString("SelectValuesDialog.Stepname.Label")); //$NON-NLS-1$
        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);

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

        //////////////////////////
        // START OF SELECT TAB ///
        //////////////////////////

        wSelectTab = new CTabItem(wTabFolder, SWT.NONE);
        wSelectTab.setText(Messages.getString("SelectValuesDialog.SelectTab.TabItem")); //$NON-NLS-1$

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

        FormLayout selectLayout = new FormLayout();
        selectLayout.marginWidth = margin;
        selectLayout.marginHeight = margin;
        wSelectComp.setLayout(selectLayout);

        wlFields = new Label(wSelectComp, SWT.NONE);
        wlFields.setText(Messages.getString("SelectValuesDialog.Fields.Label")); //$NON-NLS-1$
        props.setLook(wlFields);
        fdlFields = new FormData();
        fdlFields.left = new FormAttachment(0, 0);
        fdlFields.top = new FormAttachment(0, 0);
        wlFields.setLayoutData(fdlFields);

        final int FieldsCols = 4;
        final int FieldsRows = input.getSelectName().length;

        ColumnInfo[] colinf = new ColumnInfo[FieldsCols];
        colinf[0] = new ColumnInfo(Messages.getString("SelectValuesDialog.ColumnInfo.Fieldname"), //$NON-NLS-1$
                ColumnInfo.COLUMN_TYPE_CCOMBO,
                new String[] { Messages.getString("SelectValuesDialog.ColumnInfo.Loading") }, false);
        colinf[1] = new ColumnInfo(Messages.getString("SelectValuesDialog.ColumnInfo.RenameTo"), //$NON-NLS-1$
                ColumnInfo.COLUMN_TYPE_TEXT, false);
        colinf[2] = new ColumnInfo(Messages.getString("SelectValuesDialog.ColumnInfo.Length"), //$NON-NLS-1$
                ColumnInfo.COLUMN_TYPE_TEXT, false);
        colinf[3] = new ColumnInfo(Messages.getString("SelectValuesDialog.ColumnInfo.Precision"), //$NON-NLS-1$
                ColumnInfo.COLUMN_TYPE_TEXT, false);

        fieldColumns.add(colinf[0]);
        wFields = new TableView(wSelectComp, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI, colinf, FieldsRows, lsMod,
                props);

        wGetSelect = new Button(wSelectComp, SWT.PUSH);
        wGetSelect.setText(Messages.getString("SelectValuesDialog.GetSelect.Button")); //$NON-NLS-1$
        wGetSelect.addListener(SWT.Selection, lsGet);
        fdGetSelect = new FormData();
        fdGetSelect.right = new FormAttachment(100, 0);
        fdGetSelect.top = new FormAttachment(50, 0);
        wGetSelect.setLayoutData(fdGetSelect);

        wDoMapping = new Button(wSelectComp, SWT.PUSH);
        wDoMapping.setText(Messages.getString("SelectValuesDialog.DoMapping.Button")); //$NON-NLS-1$

        wDoMapping.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event arg0) {
                generateMappings();
            }
        });

        fdGetSelect = new FormData();
        fdGetSelect.right = new FormAttachment(100, 0);
        fdGetSelect.top = new FormAttachment(wGetSelect, 0);
        wDoMapping.setLayoutData(fdGetSelect);

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

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

        wSelectComp.layout();
        wSelectTab.setControl(wSelectComp);

        /////////////////////////////////////////////////////////////
        /// END OF SELECT TAB
        /////////////////////////////////////////////////////////////

        /////////////////////////////////////////////////////////////
        // START OF REMOVE TAB 
        /////////////////////////////////////////////////////////////
        wRemoveTab = new CTabItem(wTabFolder, SWT.NONE);
        wRemoveTab.setText(Messages.getString("SelectValuesDialog.RemoveTab.TabItem")); //$NON-NLS-1$

        FormLayout contentLayout = new FormLayout();
        contentLayout.marginWidth = margin;
        contentLayout.marginHeight = margin;

        wRemoveComp = new Composite(wTabFolder, SWT.NONE);
        props.setLook(wRemoveComp);
        wRemoveComp.setLayout(contentLayout);

        wlRemove = new Label(wRemoveComp, SWT.NONE);
        wlRemove.setText(Messages.getString("SelectValuesDialog.Remove.Label")); //$NON-NLS-1$
        props.setLook(wlRemove);
        fdlRemove = new FormData();
        fdlRemove.left = new FormAttachment(0, 0);
        fdlRemove.top = new FormAttachment(0, 0);
        wlRemove.setLayoutData(fdlRemove);

        final int RemoveCols = 1;
        final int RemoveRows = input.getDeleteName().length;

        ColumnInfo[] colrem = new ColumnInfo[RemoveCols];
        colrem[0] = new ColumnInfo(Messages.getString("SelectValuesDialog.ColumnInfo.Fieldname"), //$NON-NLS-1$
                ColumnInfo.COLUMN_TYPE_CCOMBO,
                new String[] { Messages.getString("SelectValuesDialog.ColumnInfo.Loading") }, false);
        fieldColumns.add(colrem[0]);
        wRemove = new TableView(wRemoveComp, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI, colrem, RemoveRows, lsMod,
                props);

        wGetRemove = new Button(wRemoveComp, SWT.PUSH);
        wGetRemove.setText(Messages.getString("SelectValuesDialog.GetRemove.Button")); //$NON-NLS-1$
        wGetRemove.addListener(SWT.Selection, lsGet);
        fdGetRemove = new FormData();
        fdGetRemove.right = new FormAttachment(100, 0);
        fdGetRemove.top = new FormAttachment(50, 0);
        wGetRemove.setLayoutData(fdGetRemove);

        fdRemove = new FormData();
        fdRemove.left = new FormAttachment(0, 0);
        fdRemove.top = new FormAttachment(wlRemove, margin);
        fdRemove.right = new FormAttachment(wGetRemove, -margin);
        fdRemove.bottom = new FormAttachment(100, 0);
        wRemove.setLayoutData(fdRemove);

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

        wRemoveComp.layout();
        wRemoveTab.setControl(wRemoveComp);

        /////////////////////////////////////////////////////////////
        /// END OF REMOVE TAB
        /////////////////////////////////////////////////////////////

        //////////////////////////
        // START OF META TAB  ///
        //////////////////////////

        wMetaTab = new CTabItem(wTabFolder, SWT.NONE);
        wMetaTab.setText(Messages.getString("SelectValuesDialog.MetaTab.TabItem")); //$NON-NLS-1$

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

        FormLayout metaLayout = new FormLayout();
        metaLayout.marginWidth = margin;
        metaLayout.marginHeight = margin;
        wMetaComp.setLayout(metaLayout);

        wlMeta = new Label(wMetaComp, SWT.NONE);
        wlMeta.setText(Messages.getString("SelectValuesDialog.Meta.Label")); //$NON-NLS-1$
        props.setLook(wlMeta);
        fdlMeta = new FormData();
        fdlMeta.left = new FormAttachment(0, 0);
        fdlMeta.top = new FormAttachment(0, 0);
        wlMeta.setLayoutData(fdlMeta);

        final int MetaCols = 5;
        final int MetaRows = input.getMetaName().length;

        ColumnInfo[] colmeta = new ColumnInfo[MetaCols];
        colmeta[0] = new ColumnInfo(Messages.getString("SelectValuesDialog.ColumnInfo.Fieldname"), //$NON-NLS-1$
                ColumnInfo.COLUMN_TYPE_CCOMBO,
                new String[] { Messages.getString("SelectValuesDialog.ColumnInfo.Loading") }, false);
        colmeta[1] = new ColumnInfo(Messages.getString("SelectValuesDialog.ColumnInfo.Renameto"), //$NON-NLS-1$
                ColumnInfo.COLUMN_TYPE_TEXT, false);
        colmeta[2] = new ColumnInfo(Messages.getString("SelectValuesDialog.ColumnInfo.Type"), //$NON-NLS-1$
                ColumnInfo.COLUMN_TYPE_CCOMBO, Value.getAllTypes(), false);
        colmeta[3] = new ColumnInfo(Messages.getString("SelectValuesDialog.ColumnInfo.Length"), //$NON-NLS-1$
                ColumnInfo.COLUMN_TYPE_TEXT, false);
        colmeta[4] = new ColumnInfo(Messages.getString("SelectValuesDialog.ColumnInfo.Precision"), //$NON-NLS-1$
                ColumnInfo.COLUMN_TYPE_TEXT, false);
        fieldColumns.add(colmeta[0]);
        wMeta = new TableView(wMetaComp, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI, colmeta, MetaRows, lsMod,
                props);

        wGetMeta = new Button(wMetaComp, SWT.PUSH);
        wGetMeta.setText(Messages.getString("SelectValuesDialog.GetMeta.Button")); //$NON-NLS-1$
        wGetMeta.addListener(SWT.Selection, lsGet);
        fdGetMeta = new FormData();
        fdGetMeta.right = new FormAttachment(100, 0);
        fdGetMeta.top = new FormAttachment(50, 0);
        wGetMeta.setLayoutData(fdGetMeta);

        fdMeta = new FormData();
        fdMeta.left = new FormAttachment(0, 0);
        fdMeta.top = new FormAttachment(wlMeta, margin);
        fdMeta.right = new FormAttachment(wGetMeta, -margin);
        fdMeta.bottom = new FormAttachment(100, 0);
        wMeta.setLayoutData(fdMeta);

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

        wMetaComp.layout();
        wMetaTab.setControl(wMetaComp);

        /////////////////////////////////////////////////////////////
        /// END OF META 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);

        /////////////////////////////////////////////////////////////
        /// END OF TAB FOLDER
        /////////////////////////////////////////////////////////////

        wOK = new Button(shell, SWT.PUSH);
        wOK.setText(Messages.getString("System.Button.OK")); //$NON-NLS-1$
        wCancel = new Button(shell, SWT.PUSH);
        wCancel.setText(Messages.getString("System.Button.Cancel")); //$NON-NLS-1$

        setButtonPositions(new Button[] { wOK, wCancel }, margin, wTabFolder);

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

        wOK.addListener(SWT.Selection, lsOK);
        wCancel.addListener(SWT.Selection, lsCancel);

        lsDef = new SelectionAdapter() {
            public void widgetDefaultSelected(SelectionEvent e) {
                ok();
            }
        };

        wStepname.addSelectionListener(lsDef);

        // Detect X or ALT-F4 or something that kills this window...
        shell.addShellListener(new ShellAdapter() {
            public void shellClosed(ShellEvent e) {
                cancel();
            }
        });

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

        getData();
        input.setChanged(changed);

        setComboValues();

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

    private void setComboValues() {
        Runnable fieldLoader = new Runnable() {
            public void run() {
                try {
                    prevFields = transMeta.getPrevStepFields(stepname);
                } catch (KettleException e) {
                    prevFields = new Row();
                    String msg = Messages.getString("SelectValuesDialog.DoMapping.UnableToFindInput");
                    log.logError(toString(), msg);
                }
                String[] prevStepFieldNames = prevFields.getFieldNames();
                Arrays.sort(prevStepFieldNames);
                bPreviousFieldsLoaded = true;
                for (int i = 0; i < fieldColumns.size(); i++) {
                    ColumnInfo colInfo = (ColumnInfo) fieldColumns.get(i);
                    colInfo.setComboValues(prevStepFieldNames);
                }
            }
        };
        shell.getDisplay().asyncExec(fieldLoader);
    }

    /**
     * Copy information from the meta-data input to the dialog fields.
     */
    public void getData() {
        wTabFolder.setSelection(0); // Default

        /*
         * Select fields
         */
        if (input.getSelectName() != null && input.getSelectName().length > 0) {
            for (int i = 0; i < input.getSelectName().length; i++) {
                TableItem item = wFields.table.getItem(i);
                if (input.getSelectName()[i] != null)
                    item.setText(1, input.getSelectName()[i]);
                if (input.getSelectRename()[i] != null
                        && !input.getSelectRename()[i].equals(input.getSelectName()[i]))
                    item.setText(2, input.getSelectRename()[i]);
                item.setText(3, input.getSelectLength()[i] == -2 ? "" : "" + input.getSelectLength()[i]); //$NON-NLS-1$ //$NON-NLS-2$
                item.setText(4, input.getSelectPrecision()[i] == -2 ? "" : "" + input.getSelectPrecision()[i]); //$NON-NLS-1$ //$NON-NLS-2$
            }
            wFields.setRowNums();
            wFields.optWidth(true);
            wTabFolder.setSelection(0);
        }

        /*
         * Remove certain fields...
         */
        if (input.getDeleteName() != null && input.getDeleteName().length > 0) {
            for (int i = 0; i < input.getDeleteName().length; i++) {
                TableItem item = wRemove.table.getItem(i);
                if (input.getDeleteName()[i] != null)
                    item.setText(1, input.getDeleteName()[i]);
            }
            wRemove.setRowNums();
            wRemove.optWidth(true);
            wTabFolder.setSelection(1);
        }

        /*
         * Change the meta-data of certain fields
         */
        if (input.getMetaName() != null && input.getMetaName().length > 0) {
            for (int i = 0; i < input.getMetaName().length; i++) {
                TableItem item = wMeta.table.getItem(i);
                if (input.getMetaName()[i] != null)
                    item.setText(1, input.getMetaName()[i]);
                if (input.getMetaRename()[i] != null && !input.getMetaRename()[i].equals(input.getMetaName()[i]))
                    item.setText(2, input.getMetaRename()[i]);
                item.setText(3, Value.getTypeDesc(input.getMetaType()[i]));
                item.setText(4, input.getMetaLength()[i] == -2 ? "" : "" + input.getMetaLength()[i]); //$NON-NLS-1$ //$NON-NLS-2$
                item.setText(5, input.getMetaPrecision()[i] == -2 ? "" : "" + input.getMetaPrecision()[i]); //$NON-NLS-1$ //$NON-NLS-2$
            }
            wMeta.setRowNums();
            wMeta.optWidth(true);
            wTabFolder.setSelection(2);
        }

        wStepname.setFocus();
        wStepname.selectAll();
    }

    private void cancel() {
        stepname = null;
        input.setChanged(changed);
        dispose();
    }

    private void ok() {
        stepname = wStepname.getText(); // return value

        // copy info to meta class (input)

        int i;

        int nrfields = wFields.nrNonEmpty();
        int nrremove = wRemove.nrNonEmpty();
        int nrmeta = wMeta.nrNonEmpty();

        input.allocate(nrfields, nrremove, nrmeta);

        for (i = 0; i < nrfields; i++) {
            TableItem item = wFields.getNonEmpty(i);
            input.getSelectName()[i] = item.getText(1);
            input.getSelectRename()[i] = item.getText(2);
            if (input.getSelectRename()[i] == null || input.getSelectName()[i].length() == 0)
                input.getSelectRename()[i] = input.getSelectName()[i];
            input.getSelectLength()[i] = Const.toInt(item.getText(3), -2);
            input.getSelectPrecision()[i] = Const.toInt(item.getText(4), -2);

            if (input.getSelectLength()[i] < -2)
                input.getSelectLength()[i] = -2;
            if (input.getSelectPrecision()[i] < -2)
                input.getSelectPrecision()[i] = -2;
        }

        for (i = 0; i < nrremove; i++) {
            TableItem item = wRemove.getNonEmpty(i);
            input.getDeleteName()[i] = item.getText(1);
        }

        for (i = 0; i < nrmeta; i++) {
            TableItem item = wMeta.getNonEmpty(i);
            input.getMetaName()[i] = item.getText(1);
            input.getMetaRename()[i] = item.getText(2);
            if (input.getMetaRename()[i] == null || input.getMetaName()[i].length() == 0)
                input.getMetaRename()[i] = input.getMetaName()[i];
            input.getMetaType()[i] = Value.getType(item.getText(3));
            input.getMetaLength()[i] = Const.toInt(item.getText(4), -2);
            input.getMetaPrecision()[i] = Const.toInt(item.getText(5), -2);

            if (input.getMetaLength()[i] < -2)
                input.getMetaLength()[i] = -2;
            if (input.getMetaPrecision()[i] < -2)
                input.getMetaPrecision()[i] = -2;
        }
        dispose();
    }

    private void get() {
        try {
            Row r = transMeta.getPrevStepFields(stepname);
            if (r != null) {
                switch (wTabFolder.getSelectionIndex()) {
                case 0:
                    BaseStepDialog.getFieldsFromPrevious(r, wFields, 1, new int[] { 1 }, new int[] {}, -1, -1,
                            null);
                    break;
                case 1:
                    BaseStepDialog.getFieldsFromPrevious(r, wRemove, 1, new int[] { 1 }, new int[] {}, -1, -1,
                            null);
                    break;
                case 2:
                    BaseStepDialog.getFieldsFromPrevious(r, wMeta, 1, new int[] { 1 }, new int[] {}, 4, 5, null);
                    break;
                }
            }
        } catch (KettleException ke) {
            new ErrorDialog(shell, Messages.getString("SelectValuesDialog.FailedToGetFields.DialogTitle"), //$NON-NLS-1$
                    Messages.getString("SelectValuesDialog.FailedToGetFields.DialogMessage"), ke); //$NON-NLS-1$
        }
    }

    /**
     * Reads in the fields from the previous steps and from the ONE next step and opens an 
     * EnterMappingDialog with this information. After the user did the mapping, those information 
     * is put into the Select/Rename table.
     */
    private void generateMappings() {
        if (!bPreviousFieldsLoaded) {
            MessageDialog.openError(shell, Messages.getString("SelectValuesDialog.ColumnInfo.Loading"),
                    Messages.getString("SelectValuesDialog.ColumnInfo.Loading"));
            return;
        }
        if ((wRemove.getItemCount() > 0) || (wMeta.getItemCount() > 0)) {
            for (int i = 0; i < wRemove.getItemCount(); i++) {
                String[] columns = wRemove.getItem(i);
                for (int a = 0; a < columns.length; a++) {
                    if (columns[a].length() > 0) {
                        MessageDialog.openError(shell,
                                Messages.getString("SelectValuesDialog.DoMapping.NoDeletOrMetaTitle"),
                                Messages.getString("SelectValuesDialog.DoMapping.NoDeletOrMeta"));
                        return;
                    }
                }
            }
            for (int i = 0; i < wMeta.getItemCount(); i++) {
                String[] columns = wMeta.getItem(i);
                for (int a = 0; a < columns.length; a++) {
                    String col = columns[a];
                    if (col.length() > 0) {
                        MessageDialog.openError(shell,
                                Messages.getString("SelectValuesDialog.DoMapping.NoDeletOrMetaTitle"),
                                Messages.getString("SelectValuesDialog.DoMapping.NoDeletOrMeta"));
                        return;
                    }
                }
            }
        }

        Row nextStepRequiredFields = null;

        StepMeta stepMeta = new StepMeta(stepname, input);
        StepMeta[] nextSteps = transMeta.getNextSteps(stepMeta);
        if (nextSteps.length == 0 || nextSteps.length > 1) {
            MessageDialog.openError(shell, Messages.getString("SelectValuesDialog.DoMapping.NoNextStepTitle"),
                    Messages.getString("SelectValuesDialog.DoMapping.NoNextStep"));
            return;
        }
        StepMeta outputStepMeta = nextSteps[0];
        StepMetaInterface stepMetaInterface = outputStepMeta.getStepMetaInterface();
        try {
            nextStepRequiredFields = stepMetaInterface.getRequiredFields();
        } catch (KettleException e) {
            log.logError(toString(), Messages.getString("SelectValuesDialog.DoMapping.UnableToFindOutput"));
            nextStepRequiredFields = new Row();
        }

        String[] inputNames = new String[prevFields.size()];
        for (int i = 0; i < prevFields.size(); i++) {
            Value value = prevFields.getValue(i);
            inputNames[i] = value.getName() + EnterMappingDialog.STRING_ORIGIN_SEPARATOR + value.getOrigin() + ")";
        }

        String[] outputNames = new String[nextStepRequiredFields.size()];
        for (int i = 0; i < nextStepRequiredFields.size(); i++) {
            outputNames[i] = nextStepRequiredFields.getValue(i).getName();
        }

        String[] selectName = new String[wFields.getItemCount()];
        String[] selectRename = new String[wFields.getItemCount()];
        for (int i = 0; i < wFields.getItemCount(); i++) {
            selectName[i] = wFields.getItem(i, 1);
            selectRename[i] = wFields.getItem(i, 2);
        }

        ArrayList mappings = new ArrayList();
        StringBuffer missingFields = new StringBuffer();
        for (int i = 0; i < selectName.length; i++) {
            String valueName = selectName[i];
            String valueRename = selectRename[i];
            int inIndex = prevFields.searchValueIndex(valueName);
            if (inIndex < 0) {
                missingFields.append(Const.CR + "   " + valueName + " --> " + valueRename);
                continue;
            }
            if (null == valueRename || valueRename.equals("")) {
                valueRename = valueName;
            }
            int outIndex = nextStepRequiredFields.searchValueIndex(valueRename);
            if (outIndex < 0) {
                missingFields.append(Const.CR + "   " + valueName + " --> " + valueRename);
                continue;
            }
            SourceToTargetMapping mapping = new SourceToTargetMapping(inIndex, outIndex);
            mappings.add(mapping);
        }
        // show a confirm dialog if some misconfiguration was found
        if (missingFields.length() > 0) {
            boolean goOn = MessageDialog.openConfirm(shell,
                    Messages.getString("SelectValuesDialog.DoMapping.SomeFieldsNotFoundTitle"), Messages.getString(
                            "SelectValuesDialog.DoMapping.SomeFieldsNotFound", missingFields.toString()));
            if (!goOn) {
                return;
            }
        }
        EnterMappingDialog d = new EnterMappingDialog(SelectValuesDialog.this.shell, inputNames, outputNames,
                mappings);
        mappings = d.open();

        // mappings == null if the user pressed cancel
        if (null != mappings) {
            wFields.table.removeAll();
            wFields.table.setItemCount(mappings.size());
            for (int i = 0; i < mappings.size(); i++) {
                SourceToTargetMapping mapping = (SourceToTargetMapping) mappings.get(i);
                TableItem item = wFields.table.getItem(i);
                item.setText(1, prevFields.getValue(mapping.getSourcePosition()).getName());
                item.setText(2, outputNames[mapping.getTargetPosition()]);
                item.setText(3, "-1");
                item.setText(4, "-1");
            }
            wFields.setRowNums();
            wFields.optWidth(true);
            wTabFolder.setSelection(0);
        }
    }
}