eu.geclipse.jsdl.ui.internal.dialogs.MultipleInputDialog.java Source code

Java tutorial

Introduction

Here is the source code for eu.geclipse.jsdl.ui.internal.dialogs.MultipleInputDialog.java

Source

/******************************************************************************
 * Copyright (c) 2006 g-Eclipse consortium 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Initial development of the original code was made for
 * project g-Eclipse founded by European Union
 * project number: FP6-IST-034327  http://www.geclipse.eu/
 *
 * Contributor(s):
 *     PSNC - Katarzyna Bylec
 *           
 *****************************************************************************/
package eu.geclipse.jsdl.ui.internal.dialogs;

import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.Path;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
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.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import eu.geclipse.jsdl.ui.internal.Activator;
import eu.geclipse.ui.dialogs.GridFileDialog;
import eu.geclipse.ui.widgets.StoredCombo;

/**
 * This class is in fact adaptation of Eclipse's class
 * org.eclipse.debug.internal.ui.MultipleInputDialog for gEclipse.
 * Re-implementation was needed to avoid internal dependencies warnings. Some
 * methods were changed and some other added to suit gEclipse needs.
 */
public class MultipleInputDialog extends Dialog {

    protected static final String FIELD_NAME = "FIELD_NAME"; //$NON-NLS-1$
    protected Composite panel;
    protected List<FieldSummary> fieldList = new ArrayList<FieldSummary>();
    protected List<StoredCombo> storedComboList = new ArrayList<StoredCombo>();
    protected List<Text> controlList = new ArrayList<Text>();
    protected List<Validator> validators = new ArrayList<Validator>();
    protected List<Combo> combosList = new ArrayList<Combo>();
    protected Map<Object, String> valueMap = new HashMap<Object, String>();
    protected Map<String, ArrayList<String>> combosData = new HashMap<String, ArrayList<String>>();
    private String title;
    private Map<String, String> connectedFields = new HashMap<String, String>();

    /**
     * Method to create new MultipleInputDialog
     * 
     * @param shell shell for the dialog
     * @param title title of the dialog
     */
    public MultipleInputDialog(final Shell shell, final String title) {
        super(shell);
        this.title = title;
        setShellStyle(getShellStyle() | SWT.RESIZE);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
     */
    @Override
    protected void configureShell(final Shell shell) {
        super.configureShell(shell);
        if (this.title != null) {
            shell.setText(this.title);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected Control createButtonBar(final Composite parent) {
        Control bar = super.createButtonBar(parent);
        validateFields();
        return bar;
    }

    /**
     * Method for adding new text field to dialog. This field is connected with
     * {@link GridFileDialog}
     * 
     * @param labelText label for the filed
     * @param initialValue initial value to set field to
     * @param allowsEmpty parameter allowing this field to be empty or not
     * @param allowLocal true for field which will accept both - local and remote
     *            location, false - only for remote
     */
    public void addBrowseField(final String labelText, final String initialValue, final boolean allowsEmpty,
            final boolean allowLocal) {
        this.fieldList.add(new FieldSummary(FieldType.BROWSE, labelText, initialValue, allowsEmpty, allowLocal));
    }

    // public void setConnectionFromBrowserToText( final String sourceFieldName,
    // final String targetFieldName ){
    // source = null;
    // target = null;
    // for (Control control: this.controlList){
    // if (control.getData(FIELD_NAME).equals( sourceFieldName )){
    // source = ( Text )control;
    // } else {
    // if (control.getData(FIELD_NAME).equals( sourceFieldName )){
    // target = ( Text )control;
    // }
    // }
    // }
    // if (target != null && source != null){
    //      
    // source.addFocusListener( new FocusListener(){
    //
    // public void focusGained( FocusEvent e ) {
    // // do nothing
    // }
    //
    // public void focusLost( FocusEvent e ) {
    // if (source.getText() != null && source.getText().length() > 0){
    // target.setText( source.getText() );
    // }
    // }
    //        
    // });
    // }
    // }
    /**
     * Method for adding new combo field to this dialog
     * 
     * @param labelText label to describe combo field
     * @param values values to put on the list of the combo field
     * @param initialValue one of the values from values list. Combo field will be
     *            set to this value. If <code>null</code> - combo field is set
     *            to point on the first value from the values set
     */
    public void addComboField(final String labelText, final ArrayList<String> values, final String initialValue) {
        this.combosData.put(labelText, values);
        this.fieldList.add(new FieldSummary(FieldType.COMBO, labelText, initialValue, false));
    }

    private boolean checkReadyToConnect(final String name, final int positionInDialog) {
        boolean result = false;
        if (this.connectedFields.containsKey(name)) {
            String connectionName = this.connectedFields.get(name);
            int connectionPosition = this.fieldList.size();
            for (int i = 0; i < positionInDialog; i++) {
                if (this.fieldList.get(i).name.equals(connectionName)) {
                    connectionPosition = i;
                }
            }
            if (connectionPosition < positionInDialog) {
                result = true;
            }
        } else {
            if (this.connectedFields.containsValue(name)) {
                String connectionName = ""; //$NON-NLS-1$
                for (String connName : this.connectedFields.keySet()) {
                    if (this.connectedFields.get(connName).equals(name)) {
                        connectionName = connName;
                    }
                }
                int connectionPosition = this.fieldList.size();
                for (int i = 0; i < positionInDialog; i++) {
                    if (this.fieldList.get(i).name.equals(connectionName)) {
                        connectionPosition = i;
                    }
                }
                if (connectionPosition < positionInDialog) {
                    result = true;
                }
            } else {
                // do nothing
            }
        }
        return result;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected Control createDialogArea(final Composite parent) {
        Composite container = (Composite) super.createDialogArea(parent);
        container.setLayout(new GridLayout(2, false));
        container.setLayoutData(new GridData(GridData.FILL_BOTH));
        this.panel = new Composite(container, SWT.NONE);
        GridLayout layout = new GridLayout(2, false);
        this.panel.setLayout(layout);
        this.panel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        for (Iterator<FieldSummary> i = this.fieldList.iterator(); i.hasNext();) {
            FieldSummary field = i.next();
            boolean connected = checkReadyToConnect(field.name, this.fieldList.indexOf(field));
            switch (field.type) {
            case TEXT:
                createTextField(field.name, field.initialValue, field.allowsEmpty, connected);
                break;
            case STORED_COMBO:
                createStoredComboField(field.name, field.initialValue, field.allowsEmpty, connected, field.prefID);
                break;
            case BROWSE:
                createBrowseField(field.name, field.initialValue, field.allowsEmpty, connected, field.allowLocal);
                break;
            // case VARIABLE:
            // createVariablesField( field.name,
            // field.initialValue,
            // field.allowsEmpty );
            // break;
            case COMBO:
                createComboField(field.name, field.initialValue, field.allowsEmpty);
                break;
            }
        }
        this.fieldList = null; // allow it to be gc'd
        Dialog.applyDialogFont(container);
        return container;
    }

    /**
     * Validates all dialog fields and makes OK button disabled or enabled
     */
    public void validateFields() {
        for (Iterator<Validator> i = this.validators.iterator(); i.hasNext();) {
            Validator validator = i.next();
            if (!validator.validate()) {
                getButton(IDialogConstants.OK_ID).setEnabled(false);
                return;
            }
        }
        getButton(IDialogConstants.OK_ID).setEnabled(true);
    }

    protected void createTextField(final String labelText, final String initialValue, final boolean allowEmpty,
            final boolean connected) {
        Label label = new Label(this.panel, SWT.NONE);
        label.setText(labelText);
        label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
        final Text text = new Text(this.panel, SWT.SINGLE | SWT.BORDER);
        text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        text.setData(FIELD_NAME, labelText);
        // make sure rows are the same height on both panels.
        label.setSize(label.getSize().x, text.getSize().y);
        if (initialValue != null) {
            text.setText(initialValue);
        }
        if (!allowEmpty) {
            this.validators.add(new Validator() {

                @Override
                public boolean validate() {
                    return !text.getText().equals(""); //$NON-NLS-1$
                }
            });
            text.addModifyListener(new ModifyListener() {

                public void modifyText(final ModifyEvent e) {
                    validateFields();
                }
            });
        }
        this.controlList.add(text);
        if (connected) {
            // mamy target, trzeba dodac listenera do source
            if (this.connectedFields.containsKey(labelText)) {
                String sourceName = this.connectedFields.get(labelText);
                Text sourceControl = null;
                int sourceIndex = -1;
                int targetIndex = -1;
                for (Control control : this.controlList) {
                    if (control.getData(FIELD_NAME).equals(sourceName)) {
                        sourceControl = (Text) control;
                        sourceIndex = this.controlList.indexOf(control);
                    } else {
                        if (control.getData(FIELD_NAME).equals(labelText)) {
                            targetIndex = this.controlList.indexOf(control);
                        }
                    }
                }
                final int targetPosition = targetIndex;
                final int sourcePosition = sourceIndex;
                if (sourceControl != null) {
                    sourceControl.addModifyListener(new ModifyListener() {

                        public void modifyText(final ModifyEvent event) {
                            // String value = "";
                            // Path p = new Path(controlList.get( sourcePosition ).getText());
                            // value = p.lastSegment();
                            // if (controlList.get( targetPosition ).getText() != null &&
                            // controlList.get( targetPosition ).getText().length() == 0 ){
                            // controlList.get( targetPosition ).setText( value );
                            // }
                        }
                    });
                    sourceControl.addFocusListener(new FocusListener() {

                        public void focusGained(final FocusEvent event) {
                            // do nothing
                        }

                        public void focusLost(final FocusEvent event) {
                            String value = ""; //$NON-NLS-1$
                            Path p = new Path(MultipleInputDialog.this.controlList.get(sourcePosition).getText());
                            value = p.lastSegment();
                            if (MultipleInputDialog.this.controlList.get(targetPosition).getText() != null
                                    && MultipleInputDialog.this.controlList.get(targetPosition).getText()
                                            .length() == 0) {
                                MultipleInputDialog.this.controlList.get(targetPosition).setText(value);
                            }
                        }
                    });
                }
            } else {
                // mamy source, do niego dodac listenera, znalezc target
                // szukanie targetu
                String targetName = null;
                for (String name : this.connectedFields.keySet()) {
                    if (this.connectedFields.get(name).equals(labelText)) {
                        targetName = name;
                    }
                }
                Text targetControl = null;
                int sourceIndex = -1;
                int targetIndex = -1;
                for (Control control : this.controlList) {
                    if (control.getData(FIELD_NAME).equals(targetName)) {
                        targetControl = (Text) control;
                        targetIndex = this.controlList.indexOf(control);
                    } else {
                        if (control.getData(FIELD_NAME).equals(labelText)) {
                            sourceIndex = this.controlList.indexOf(control);
                        }
                    }
                }
                final int sourcePosition = sourceIndex;
                final int targetPosition = targetIndex;
                text.addModifyListener(new ModifyListener() {

                    public void modifyText(final ModifyEvent event) {
                        // controlList.get( targetPosition ).setText( controlList.get(
                        // sourcePosition ).getText() );
                    }
                });
                text.addFocusListener(new FocusListener() {

                    public void focusGained(final FocusEvent event) {
                        // do nothing
                    }

                    public void focusLost(final FocusEvent event) {
                        String value = ""; //$NON-NLS-1$
                        Path p = new Path(MultipleInputDialog.this.controlList.get(sourcePosition).getText());
                        value = p.lastSegment();
                        if (MultipleInputDialog.this.controlList.get(targetPosition).getText() != null
                                && MultipleInputDialog.this.controlList.get(targetPosition).getText()
                                        .length() == 0) {
                            MultipleInputDialog.this.controlList.get(targetPosition).setText(value);
                        }
                    }
                });
            }
        }
    }

    protected void createStoredComboField(final String labelText, final String initialValue,
            final boolean allowEmpty, final boolean connected, final String prefID) {
        IPreferenceStore prefs = Activator.getDefault().getPreferenceStore();
        Label label = new Label(this.panel, SWT.NONE);
        label.setText(labelText);
        label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
        final StoredCombo storedCombo = new StoredCombo(this.panel, SWT.SINGLE | SWT.BORDER);
        storedCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        storedCombo.setPreferences(prefs, prefID);
        storedCombo.setData(FIELD_NAME, labelText);
        // make sure rows are the same height on both panels.
        label.setSize(label.getSize().x, storedCombo.getSize().y);
        if (initialValue != null) {
            storedCombo.setText(initialValue);
        }
        if (!allowEmpty) {
            this.validators.add(new Validator() {

                @Override
                public boolean validate() {
                    return !storedCombo.getText().equals(""); //$NON-NLS-1$
                }
            });
            storedCombo.addModifyListener(new ModifyListener() {

                public void modifyText(final ModifyEvent e) {
                    validateFields();
                }
            });
        }
        this.storedComboList.add(storedCombo);
        if (connected) {
            if (this.connectedFields.containsKey(labelText)) {
                String sourceName = this.connectedFields.get(labelText);
                Text sourceControl = null;
                int sourceIndex = -1;
                int targetIndex = -1;
                for (Control control : this.storedComboList) {
                    if (control.getData(FIELD_NAME).equals(sourceName)) {
                        sourceControl = (Text) control;
                        sourceIndex = this.storedComboList.indexOf(control);
                    } else {
                        if (control.getData(FIELD_NAME).equals(labelText)) {
                            targetIndex = this.storedComboList.indexOf(control);
                        }
                    }
                }
                final int targetPosition = targetIndex;
                final int sourcePosition = sourceIndex;
                sourceControl.addModifyListener(new ModifyListener() {

                    public void modifyText(final ModifyEvent event) {
                        // String value = "";
                        // Path p = new Path(controlList.get( sourcePosition ).getText());
                        // value = p.lastSegment();
                        // if (controlList.get( targetPosition ).getText() != null &&
                        // controlList.get( targetPosition ).getText().length() == 0 ){
                        // controlList.get( targetPosition ).setText( value );
                        // }
                    }
                });
                sourceControl.addFocusListener(new FocusListener() {

                    public void focusGained(final FocusEvent event) {
                        // do nothing
                    }

                    public void focusLost(final FocusEvent event) {
                        String value = ""; //$NON-NLS-1$
                        Path p = new Path(MultipleInputDialog.this.storedComboList.get(sourcePosition).getText());
                        value = p.lastSegment();
                        if (MultipleInputDialog.this.storedComboList.get(targetPosition).getText() != null
                                && MultipleInputDialog.this.storedComboList.get(targetPosition).getText()
                                        .length() == 0) {
                            MultipleInputDialog.this.storedComboList.get(targetPosition).setText(value);
                        }
                    }
                });
            } else {
                String targetName = null;
                for (String name : this.connectedFields.keySet()) {
                    if (this.connectedFields.get(name).equals(labelText)) {
                        targetName = name;
                    }
                }
                Text targetControl = null;
                int sourceIndex = -1;
                int targetIndex = -1;
                for (Control control : this.storedComboList) {
                    if (control.getData(FIELD_NAME).equals(targetName)) {
                        targetControl = (Text) control;
                        targetIndex = this.storedComboList.indexOf(control);
                    } else {
                        if (control.getData(FIELD_NAME).equals(labelText)) {
                            sourceIndex = this.storedComboList.indexOf(control);
                        }
                    }
                }
                final int sourcePosition = sourceIndex;
                final int targetPosition = targetIndex;
                storedCombo.addModifyListener(new ModifyListener() {

                    public void modifyText(final ModifyEvent event) {
                        // controlList.get( targetPosition ).setText( controlList.get(
                        // sourcePosition ).getText() );
                    }
                });
                storedCombo.addFocusListener(new FocusListener() {

                    public void focusGained(final FocusEvent event) {
                        // do nothing
                    }

                    public void focusLost(final FocusEvent event) {
                        String value = ""; //$NON-NLS-1$
                        Path p = new Path(MultipleInputDialog.this.storedComboList.get(sourcePosition).getText());
                        value = p.lastSegment();
                        if (MultipleInputDialog.this.storedComboList.get(targetPosition).getText() != null
                                && MultipleInputDialog.this.storedComboList.get(targetPosition).getText()
                                        .length() == 0) {
                            MultipleInputDialog.this.storedComboList.get(targetPosition).setText(value);
                        }
                    }
                });
            }
        }
    }

    public void setConnectedFields(final String sourceFieldName, final String targetFieldName) {
        this.connectedFields.put(targetFieldName, sourceFieldName);
    }

    protected void createBrowseField(final String labelText, final String initialValue, final boolean allowEmpty,
            final boolean connected, final boolean allowLocal) {
        Label label = new Label(this.panel, SWT.NONE);
        label.setText(labelText);
        label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
        Composite comp = new Composite(this.panel, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        comp.setLayout(layout);
        comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        final Text text = new Text(comp, SWT.SINGLE | SWT.BORDER);
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        data.widthHint = 200;
        text.setLayoutData(data);
        text.setData(FIELD_NAME, labelText);
        // make sure rows are the same height on both panels.
        label.setSize(label.getSize().x, text.getSize().y);
        if (initialValue != null) {
            text.setText(initialValue);
        }
        if (!allowEmpty) {
            this.validators.add(new Validator() {

                @Override
                public boolean validate() {
                    return !text.getText().equals(""); //$NON-NLS-1$
                }
            });
            text.addModifyListener(new ModifyListener() {

                public void modifyText(final ModifyEvent e) {
                    validateFields();
                }
            });
        }
        Button button = createButton(comp, IDialogConstants.IGNORE_ID,
                Messages.getString("MultilpeInputDialog.browse_button"), //$NON-NLS-1$
                false);
        button.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                {
                    GridFileDialog dialog = new GridFileDialog(getShell(), GridFileDialog.STYLE_NONE);

                    if (dialog.open() == Window.OK) {
                        URI[] uris = dialog.getSelectedURIs();
                        if ((uris != null) && (uris.length > 0)) {
                            text.setText(uris[0].toString());
                        } else {
                            text.setText(""); //$NON-NLS-1$
                        }
                    }
                    //
                    // IGridConnectionElement connection = GridFileDialog.openFileDialog(
                    // getShell(),
                    // "Choose a file",
                    // null,
                    // allowLocal );
                    // if( connection != null ) {
                    // try {
                    // String filename = connection.getConnectionFileStore().toString();
                    // if( connection.getConnectionFileStore()
                    // .getFileSystem()
                    // .getScheme()
                    // .equalsIgnoreCase( "file" ) )
                    // {
                    // filename = "file://" + filename;
                    // }
                    // if( filename != null ) {
                    // text.setText( filename );
                    // }
                    // } catch( CoreException cExc ) {
                    // ProblemException exception = new ProblemException(
                    // ICoreProblems.NET_CONNECTION_FAILED,
                    // cExc,
                    // Activator.PLUGIN_ID );
                    // ProblemDialog.openProblem( getShell(),
                    // "error",
                    // "error",
                    // exception );
                    // }
                    // }
                }
            }
        });
        this.controlList.add(text);
        if (connected) {
            // mamy target, trzeba dodac listenera do source
            if (this.connectedFields.containsKey(labelText)) {
                String sourceName = this.connectedFields.get(labelText);
                Text sourceControl = null;
                int sourceIndex = -1;
                int targetIndex = -1;
                for (Control control : this.controlList) {
                    if (control.getData(FIELD_NAME).equals(sourceName)) {
                        sourceControl = (Text) control;
                        sourceIndex = this.controlList.indexOf(control);
                    } else {
                        if (control.getData(FIELD_NAME).equals(labelText)) {
                            targetIndex = this.controlList.indexOf(control);
                        }
                    }
                }
                final int targetPosition = targetIndex;
                final int sourcePosition = sourceIndex;
                if (sourceControl != null) {
                    sourceControl.addModifyListener(new ModifyListener() {

                        public void modifyText(ModifyEvent e) {
                            // controlList.get( targetPosition ).setText( controlList.get(
                            // sourcePosition ).getText() );
                        }
                    });
                    sourceControl.addFocusListener(new FocusListener() {

                        public void focusGained(FocusEvent e) {
                            // do nothing
                        }

                        public void focusLost(FocusEvent e) {
                            String value = "";
                            Path p = new Path(MultipleInputDialog.this.controlList.get(sourcePosition).getText());
                            value = p.lastSegment();
                            if (MultipleInputDialog.this.controlList.get(targetPosition).getText() != null
                                    && MultipleInputDialog.this.controlList.get(targetPosition).getText()
                                            .length() == 0) {
                                MultipleInputDialog.this.controlList.get(targetPosition).setText(value);
                            }
                        }
                    });
                }
            } else {
                // mamy source, do niego dodac listenera, znalezc target
                // szukanie targetu
                String targetName = null;
                for (String name : this.connectedFields.keySet()) {
                    if (this.connectedFields.get(name).equals(labelText)) {
                        targetName = name;
                    }
                }
                // Text targetControl = null;
                int sourceIndex = -1;
                int targetIndex = -1;
                for (Control control : this.controlList) {
                    if (control.getData(FIELD_NAME).equals(targetName)) {
                        // targetControl = ( Text )control;
                        targetIndex = this.controlList.indexOf(control);
                    } else {
                        if (control.getData(FIELD_NAME).equals(labelText)) {
                            sourceIndex = this.controlList.indexOf(control);
                        }
                    }
                }
                final int sourcePosition = sourceIndex;
                final int targetPosition = targetIndex;
                text.addModifyListener(new ModifyListener() {

                    public void modifyText(final ModifyEvent e) {
                        // controlList.get( targetPosition ).setText( controlList.get(
                        // sourcePosition ).getText() );
                    }
                });
                text.addFocusListener(new FocusListener() {

                    public void focusGained(final FocusEvent e) {
                        // do nothing
                    }

                    public void focusLost(final FocusEvent e) {
                        String value = "";
                        Path p = new Path(MultipleInputDialog.this.controlList.get(sourcePosition).getText());
                        value = p.lastSegment();
                        if (MultipleInputDialog.this.controlList.get(targetPosition).getText() != null
                                && MultipleInputDialog.this.controlList.get(targetPosition).getText()
                                        .length() == 0) {
                            MultipleInputDialog.this.controlList.get(targetPosition).setText(value);
                        }
                    }
                });
            }
        }
    }

    // TODO katis - is this method used??
    /**
     * @param labelText
     * @param initialValue
     * @param allowEmpty
     */
    public void createVariablesField(final String labelText, final String initialValue, final boolean allowEmpty) {
        Label label = new Label(this.panel, SWT.NONE);
        label.setText(labelText);
        label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
        Composite comp = new Composite(this.panel, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        comp.setLayout(layout);
        comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        final Text text = new Text(comp, SWT.SINGLE | SWT.BORDER);
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        data.widthHint = 200;
        text.setLayoutData(data);
        text.setData(FIELD_NAME, labelText);
        // make sure rows are the same height on both panels.
        label.setSize(label.getSize().x, text.getSize().y);
        if (initialValue != null) {
            text.setText(initialValue);
        }
        if (!allowEmpty) {
            this.validators.add(new Validator() {

                @Override
                public boolean validate() {
                    return !text.getText().equals(""); //$NON-NLS-1$
                }
            });
            text.addModifyListener(new ModifyListener() {

                public void modifyText(final ModifyEvent e) {
                    validateFields();
                }
            });
        }
        this.controlList.add(text);
    }

    protected void createComboField(final String labelText, final String initialValue, final boolean allowEmpty) {
        Label label = new Label(this.panel, SWT.NONE);
        label.setText(labelText);
        label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
        Composite comp = new Composite(this.panel, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        comp.setLayout(layout);
        comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        final Combo combo = new StoredCombo(comp, SWT.SINGLE | SWT.BORDER);
        for (String comboText : this.combosData.get(labelText)) {
            combo.add(comboText);
        }
        if (initialValue != null) {
            for (int i = 0; i < combo.getItemCount(); i++) {
                if (combo.getItem(i).equals(initialValue)) {
                    combo.select(i);
                }
            }
        } else {
            combo.select(0);
        }
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        data.widthHint = 200;
        combo.setLayoutData(data);
        combo.setData(FIELD_NAME, labelText);
        // make sure rows are the same height on both panels.
        label.setSize(label.getSize().x, combo.getSize().y);
        if (initialValue != null) {
            combo.setText(initialValue);
        }
        if (!allowEmpty) {
            this.validators.add(new Validator() {

                @Override
                public boolean validate() {
                    return !combo.getText().equals(""); //$NON-NLS-1$
                }
            });
            combo.addModifyListener(new ModifyListener() {

                public void modifyText(final ModifyEvent e) {
                    validateFields();
                }
            });
        }
        this.combosList.add(combo);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#okPressed()
     */
    @Override
    protected void okPressed() {
        for (Iterator<Text> i = this.controlList.iterator(); i.hasNext();) {
            Control control = i.next();
            if (control instanceof Text) {
                this.valueMap.put(control.getData(FIELD_NAME), ((Text) control).getText());
            }
        }
        for (Iterator<StoredCombo> i = this.storedComboList.iterator(); i.hasNext();) {
            Control control = i.next();
            if (control instanceof StoredCombo) {
                this.valueMap.put(control.getData(FIELD_NAME), ((StoredCombo) control).getText());
            }
        }
        for (Iterator<Combo> i = this.combosList.iterator(); i.hasNext();) {
            Control control = i.next();
            if (control instanceof Combo) {
                this.valueMap.put(control.getData(FIELD_NAME), ((Combo) control).getText());
            }
        }
        this.controlList = null;
        this.combosList = null;
        super.okPressed();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.window.Window#open()
     */
    @Override
    public int open() {
        applyDialogFont(this.panel);
        return super.open();
    }

    /**
     * Method to access value held by field with given name (key)
     * 
     * @param key name of the field
     * @return value held by field of a given key
     */
    public Object getValue(final String key) {
        return this.valueMap.get(key);
    }

    /**
     * Method to access String value held by field with given name (key)
     * 
     * @param key name of the field
     * @return String value held by field of a given key
     */
    public String getStringValue(final String key) {
        return (String) getValue(key);
    }

    private String getDialogSettingsSectionName() {
        return IDebugUIConstants.PLUGIN_ID + ".MULTIPLE_INPUT_DIALOG_2"; //$NON-NLS-1$
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings()
     */
    @Override
    protected IDialogSettings getDialogBoundsSettings() {
        IDialogSettings settings = Activator.getDefault().getDialogSettings();
        IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
        if (section == null) {
            section = settings.addNewSection(getDialogSettingsSectionName());
        }
        return section;
    }

    /**
     * Method to add text field ({@link Text}) to {@link MultipleInputDialog}
     * 
     * @param labelText label to describe this field
     * @param initialValue initial value of this field
     * @param allowsEmpty indicates whether this field can be empty (if
     *            <code>false</code> dialog cannot be closed until this field
     *            holds some value)
     */
    public void addTextField(final String labelText, final String initialValue, final boolean allowsEmpty) {
        this.fieldList.add(new FieldSummary(FieldType.TEXT, labelText, initialValue, allowsEmpty));
    }

    /**
     * Method to add stored combo field ({@link StoredCombo}) to
     * {@link MultipleInputDialog}
     * 
     * @param labelText label to describe this field
     * @param initialValue initial value of this field
     * @param allowsEmpty indicates whether this field can be empty (if
     *            <code>false</code> dialog cannot be closed until this field
     *            holds some value)
     */
    public void addStoredComboField(final String labelText, final String initialValue, final boolean allowsEmpty,
            final String prefID) {
        this.fieldList.add(new FieldSummary(FieldType.STORED_COMBO, labelText, initialValue, allowsEmpty, prefID));
    }

    // TODO katis - is this method used
    // public void addVariablesField( final String labelText,
    // final String initialValue,
    // final boolean allowsEmpty )
    // {
    // this.fieldList.add( new FieldSummary( VARIABLE,
    // labelText,
    // initialValue,
    // allowsEmpty ) );
    // }
    protected class FieldSummary {

        FieldType type;
        String name;
        String initialValue;
        boolean allowsEmpty;
        boolean allowLocal;
        final String prefID;

        /**
         * Creates new instance of {@link FieldSummary}. By default this field will
         * allow local filesystem values. This constructor should be used by all
         * field types except form {@link MultipleInputDialog#BROWSE}.
         * 
         * @param type type of the field (see {@link MultipleInputDialog#BROWSE},
         *            {@link MultipleInputDialog#COMBO},
         *            {@link MultipleInputDialog#FIELD_NAME},
         *            {@link MultipleInputDialog#STORED_COMBO},
         *            {@link MultipleInputDialog#TEXT} and
         *            {@link MultipleInputDialog#VARIABLE})
         * @param name name of the field (used to access this field's value by
         *            method {@link MultipleInputDialog#getValue(String)} or
         *            {@link MultipleInputDialog#getStringValue(String)}
         * @param initialValue initial value to set this field to
         * @param allowsEmpty indicates whether this field can be empty (if
         *            <code>false</code> dialog cannot be closed until this field
         *            holds some value)
         */
        public FieldSummary(final FieldType type, final String name, final String initialValue,
                final boolean allowsEmpty) {
            this(type, name, initialValue, allowsEmpty, true);
        }

        /**
         * Creates new instance of {@link FieldSummary}
         * 
         * @param type type of the field (see {@link MultipleInputDialog#BROWSE},
         *            {@link MultipleInputDialog#COMBO},
         *            {@link MultipleInputDialog#FIELD_NAME},
         *            {@link MultipleInputDialog#STORED_COMBO},
         *            {@link MultipleInputDialog#TEXT} and
         *            {@link MultipleInputDialog#VARIABLE})
         * @param name name of the field (used to access this field's value by
         *            method {@link MultipleInputDialog#getValue(String)} or
         *            {@link MultipleInputDialog#getStringValue(String)}
         * @param initialValue initial value to set this field to
         * @param allowsEmpty indicates whether this field can be empty (if
         *            <code>false</code> dialog cannot be closed until this field
         *            holds some value)
         * @param allowLocal if <code>false</code> this field will accept only
         *            remote filesystems values, all values otherwise. For now this
         *            setting works only for {@link MultipleInputDialog#BROWSE}
         *            field.
         */
        public FieldSummary(final FieldType type, final String name, final String initialValue,
                final boolean allowsEmpty, final boolean allowLocal) {
            this.type = type;
            this.name = name;
            this.initialValue = initialValue;
            this.allowsEmpty = allowsEmpty;
            this.allowLocal = allowLocal;
            this.prefID = ""; //$NON-NLS-1$
        }

        /**
         * @param type
         * @param name
         * @param initialValue
         * @param allowsEmpty
         * @param prefID
         */
        public FieldSummary(final FieldType type, final String name, final String initialValue,
                final boolean allowsEmpty, final String prefID) {
            this.type = type;
            this.name = name;
            this.initialValue = initialValue;
            this.allowsEmpty = allowsEmpty;
            this.prefID = prefID;
        }
    }

    protected class Validator {

        boolean validate() {
            return true;
        }
    }

    enum FieldType {
        TEXT, BROWSE, COMBO, STORED_COMBO
    }
}