org.talend.designer.filemultischemas.ui.MultiSchemasUI.java Source code

Java tutorial

Introduction

Here is the source code for org.talend.designer.filemultischemas.ui.MultiSchemasUI.java

Source

// ============================================================================
//
// Copyright (C) 2006-2015 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.designer.filemultischemas.ui;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.ExpandEvent;
import org.eclipse.swt.events.ExpandListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.ExpandBar;
import org.eclipse.swt.widgets.ExpandItem;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.PlatformUI;
import org.talend.commons.ui.command.CommandStackForComposite;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.commons.ui.runtime.image.EImage;
import org.talend.commons.ui.runtime.image.ImageProvider;
import org.talend.commons.ui.swt.formtools.Form;
import org.talend.commons.ui.swt.formtools.LabelledCombo;
import org.talend.commons.ui.swt.formtools.LabelledFileField;
import org.talend.commons.ui.swt.formtools.LabelledText;
import org.talend.commons.ui.utils.PathUtils;
import org.talend.core.CorePlugin;
import org.talend.core.language.ECodeLanguage;
import org.talend.core.language.LanguageManager;
import org.talend.core.model.metadata.EMetadataEncoding;
import org.talend.core.model.metadata.IMetadataTable;
import org.talend.core.model.metadata.MetadataToolHelper;
import org.talend.core.model.metadata.builder.connection.DelimitedFileConnection;
import org.talend.core.model.metadata.builder.connection.Escape;
import org.talend.core.model.metadata.builder.connection.FieldSeparator;
import org.talend.core.model.metadata.builder.connection.FileFormat;
import org.talend.core.model.metadata.builder.connection.RowSeparator;
import org.talend.core.model.utils.TalendTextUtils;
import org.talend.core.prefs.ITalendCorePrefConstants;
import org.talend.core.ui.metadata.dialog.MetadataDialog;
import org.talend.core.utils.CsvArray;
import org.talend.designer.core.model.components.EParameterName;
import org.talend.designer.filemultischemas.MultiSchemasComponent;
import org.talend.designer.filemultischemas.data.CSVArrayAndSeparator;
import org.talend.designer.filemultischemas.data.ExternalMultiSchemasUIProperties;
import org.talend.designer.filemultischemas.data.MultiMetadataColumn;
import org.talend.designer.filemultischemas.data.SchemasKeyData;
import org.talend.designer.filemultischemas.managers.MultiSchemasManager;
import org.talend.designer.filemultischemas.managers.UIManager;
import org.talend.designer.filemultischemas.ui.dialog.AddRowDialog;
import org.talend.designer.filemultischemas.ui.dialog.MultiSchemaEventListener;
import org.talend.designer.filemultischemas.ui.preview.MultiSchemasShadowProcessPreview;
import org.talend.designer.filemultischemas.ui.preview.MultiSchemasUIThreadProcessor;
import org.talend.designer.filemultischemas.ui.provider.SchemasTreeContentProvider;
import org.talend.designer.filemultischemas.ui.provider.SchemasTreeLabelProvider;
import org.talend.metadata.managment.ui.preview.ProcessDescription;
import org.talend.metadata.managment.ui.preview.ShadowProcessPreview;
import org.talend.metadata.managment.ui.utils.ShadowProcessHelper;
import org.talend.repository.i18n.Messages;

/**
 * cLi class global comment. Detailled comment
 */
public class MultiSchemasUI {

    protected int maximumRowsToPreview = CorePlugin.getDefault().getPreferenceStore()
            .getInt(ITalendCorePrefConstants.PREVIEW_LIMIT);

    private static final String EMPTY_VALUE = Messages.getString("FileStep2.empty"); //$NON-NLS-1$

    private static final String[] TEXT_ENCLOSURE_DATA = { EMPTY_VALUE, TalendTextUtils.addQuotes("\""), //$NON-NLS-1$
            TalendTextUtils.addQuotes("\'"), TalendTextUtils.addQuotes("\\\\") }; //$NON-NLS-1$ //$NON-NLS-2$

    private static final String[] ESCAPE_CHAR_DATA = { EMPTY_VALUE, TalendTextUtils.addQuotes("\""), //$NON-NLS-1$
            TalendTextUtils.addQuotes("\'"), TalendTextUtils.addQuotes("\\\\") }; //$NON-NLS-1$ //$NON-NLS-2$

    private MultiSchemasManager multiSchemaManager;

    private static final String SCHEMA_NAME_PATTERN = "^[a-zA-Z0-9\\_]+[a-zA-Z0-9\\_]*$"; //$NON-NLS-1$

    /**
     * for schema details viewer.
     */

    private SchameDetailsPropertyAction propertyAction;

    private SchameDetailsColumnAction columnAction;

    /**
     * 
     */
    private Composite uiParent;

    private LabelledFileField fileField;

    private LabelledCombo encodingCombo;

    private LabelledCombo fieldSeparatorCombo;

    private LabelledCombo rowSeparatorCombo;

    private LabelledText rowSeparatorText;

    private LabelledText fieldSeparatorText;

    private LabelledText cardText;

    private Button csvRadio, delimitedRadio;

    private LabelledCombo escapeCharCombo, textEnclosureCombo;

    private Label escapeCharFlag, textEnclosureFlag;

    private Button previewBtn;

    private Button fetchBtn, leftBtn, rightBtn;

    private Button addRow, removeRow, editSchema;

    private TreeViewer schemaTreeViewer;

    private TreeViewer schemaDetailsViewer;

    private Label previewInformationLabel;

    private CTabFolder tabFolder;

    private CTabItem previewTabItem;

    private CTabItem outputTabItem;

    private Composite outputComposite;

    private SashForm allContentForm;

    private SashForm headerSashForm;

    private Button useMultiSaparators;

    private LabelledText multiSeparatorsText;

    private LabelledText keyValuesText;

    private LabelledText keyIndexText;

    /**
     * 
     */
    private MultiSchemasShadowProcessPreview multiSchemasFilePreview;

    private MultiSchemasUIThreadProcessor processor;

    private MultiSchemaEventListener listener;

    public int getSelectedColumnIndex() {
        return multiSchemaManager.getSelectedColumnIndex();
    }

    public void setSelectedColumnIndex(int selectedColumn) {
        multiSchemaManager.setSelectedColumnIndex(selectedColumn);
    }

    public MultiSchemasUI(Composite uiParent, MultiSchemasManager multiSchemaManager) {
        super();
        this.uiParent = uiParent;
        this.multiSchemaManager = multiSchemaManager;
        this.processor = new MultiSchemasUIThreadProcessor(this);
    }

    private DelimitedFileConnection getConnection() {
        return multiSchemaManager.getRecordConnection();
    }

    /**
     * Sets the listener.
     * 
     * @param listener the listener to set
     */
    public void addListener(MultiSchemaEventListener listener) {
        this.listener = listener;
    }

    private Shell getShell() {
        return this.uiParent.getShell();
    }

    public void init() {
        uiParent.setLayout(new GridLayout());

        Composite composite = new Composite(uiParent, SWT.NONE);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
        composite.setLayout(new FillLayout());

        ExpandBar bar = new ExpandBar(composite, SWT.V_SCROLL);

        final Composite fileGroup = new Composite(bar, SWT.NONE);
        createFileGroup(fileGroup);
        final ExpandItem settingItem = new ExpandItem(bar, SWT.NONE, 0);
        settingItem.setText(ExternalMultiSchemasUIProperties.SETTINGS_LABEL);
        settingItem.setHeight(fileGroup.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
        settingItem.setControl(fileGroup);
        settingItem.setExpanded(true);

        allContentForm = new SashForm(bar, SWT.NONE);
        createViewers(allContentForm);
        final ExpandItem previewItem = new ExpandItem(bar, SWT.NONE, 1);
        previewItem.setText(ExternalMultiSchemasUIProperties.PREVIEW_LABEL);
        previewItem.setHeight(allContentForm.computeSize(SWT.DEFAULT, SWT.DEFAULT).y + 100);
        previewItem.setControl(allContentForm);
        previewItem.setExpanded(true);

        bar.addExpandListener(new ExpandListener() {

            public void itemExpanded(ExpandEvent e) {
                if (e.item != null && e.item instanceof ExpandItem) {
                    if (((ExpandItem) e.item).getText().equals(ExternalMultiSchemasUIProperties.PREVIEW_LABEL)) {
                        if (settingItem.getExpanded()) {
                            previewItem.setHeight(allContentForm.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
                        } else {
                            previewItem.setHeight(allContentForm.computeSize(SWT.DEFAULT, SWT.DEFAULT).y
                                    + fileGroup.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
                        }
                    } else if (((ExpandItem) e.item).getText()
                            .equals(ExternalMultiSchemasUIProperties.SETTINGS_LABEL)) {
                        settingItem.setHeight(fileGroup.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
                    }
                }
            }

            public void itemCollapsed(ExpandEvent e) {
                if (e.item != null && e.item instanceof ExpandItem) {
                    if (((ExpandItem) e.item).getText().equals(ExternalMultiSchemasUIProperties.PREVIEW_LABEL)) {
                        // settingItem.setHeight(allContentForm.computeSize(SWT.DEFAULT, SWT.DEFAULT).y
                        // + fileGroup.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
                    } else if (((ExpandItem) e.item).getText()
                            .equals(ExternalMultiSchemasUIProperties.SETTINGS_LABEL)) {
                        previewItem.setHeight(allContentForm.computeSize(SWT.DEFAULT, SWT.DEFAULT).y
                                + fileGroup.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
                    }
                }
            }
        });

        initFieldValues();
        // listener
        addFieldListeners();
        addButtonListeners();
        addFieldsListenersGroupFileSettings();
        addFieldsListenersGroupsEscapeChar();
        // preview
        refreshPreview();
        checkDialog();
        // reload
        reloadSchemaDataFromNode();
    }

    private void reloadSchemaDataFromNode() {
        SchemasKeyData rootData = this.getMultiSchemaManager().retrievePropertiesFromNode();
        schemaTreeViewer.setInput(rootData);
        schemaTreeViewer.refresh();
        getUIManager().packSchemaTreeFirstColumn(schemaTreeViewer);
    }

    protected MultiSchemasComponent getMultiSchemasComponent() {
        return getMultiSchemaManager().getMultiSchemasComponent();
    }

    protected MultiSchemasManager getMultiSchemaManager() {
        return this.multiSchemaManager;
    }

    private void initFieldValues() {
        // hywang add for feature 7373
        String selectedColumn = getMultiSchemaManager().getParameterValue(EParameterName.COLUMNINDEX);
        selectedColumn = TalendTextUtils.removeQuotes(selectedColumn);
        if (selectedColumn != null && !selectedColumn.equals("")) {
            multiSchemaManager.setSelectedColumnIndex(Integer.parseInt(selectedColumn));
        }

        String filePath = getMultiSchemaManager().getParameterValue(EParameterName.FILENAME);
        getConnection().setFilePath(filePath);
        fileField.setText(getConnection().getFilePath());
        getConnection()
                .setFieldSeparatorValue(getMultiSchemaManager().getParameterValue(EParameterName.FIELDSEPARATOR));
        getConnection()
                .setFieldSeparatorType(getFieldSeparatorFromString(getConnection().getFieldSeparatorValue()));

        boolean isUseMuliSaparator = (Boolean) getMultiSchemaManager()
                .getParameterObjectValue(EParameterName.USE_MULTISEPARATORS);
        useMultiSaparators.setSelection(isUseMuliSaparator);

        String encoding = getMultiSchemaManager().getParameterValue(EParameterName.ENCODING);
        getConnection().setEncoding(TalendTextUtils.removeQuotes(encoding));
        encodingCombo.setText(getConnection().getEncoding());

        getConnection()
                .setCsvOption((Boolean) getMultiSchemaManager().getParameterObjectValue(EParameterName.CSV_OPTION));
        if (isUseMuliSaparator || getConnection().isCsvOption()) {
            getConnection().setEscapeType(Escape.CSV);
        } else {
            getConnection().setEscapeType(Escape.DELIMITED);
        }
        getConnection().setTextEnclosure(getMultiSchemaManager().getParameterValue(EParameterName.TEXT_ENCLOSURE));
        getConnection().setEscapeChar(getMultiSchemaManager().getParameterValue(EParameterName.ESCAPE_CHAR));

        getConnection()
                .setRowSeparatorValue(getMultiSchemaManager().getParameterValue(EParameterName.ROWSEPARATOR));
        getConnection().setRowSeparatorType(getRowSeparatorFromString(getConnection().getRowSeparatorValue()));
        rowSeparatorCombo.setText(getConnection().getRowSeparatorType().getLiteral());
        rowSeparatorText.setText(getConnection().getRowSeparatorValue());

        rowSeparatorManager();
        fieldSeparatorCombo.setText(getConnection().getFieldSeparatorType().getName());
        fieldSeparatorText.setText(getConnection().getFieldSeparatorValue());
        multiSeparatorsText.setText(getMultiSchemaManager().getParameterValue(EParameterName.MULTI_SEPARATORS));
        keyIndexText.setText(TalendTextUtils
                .removeQuotes(getMultiSchemaManager().getParameterValue(EParameterName.COLUMNINDEX)));
        keyValuesText.setText(getMultiSchemaManager().getParameterValue(EParameterName.MULTI_KEYVALUES));
        fieldSeparatorCombo.setEnabled(!isUseMuliSaparator);
        fieldSeparatorText.setEditable(!isUseMuliSaparator);
        multiSeparatorsText.setEditable(isUseMuliSaparator);
        keyIndexText.setEditable(isUseMuliSaparator);
        keyValuesText.setEditable(isUseMuliSaparator);
        csvRadio.setSelection(isUseMuliSaparator || getConnection().isCsvOption());
        delimitedRadio.setSelection(!isUseMuliSaparator && !getConnection().isCsvOption());
        delimitedRadio.setEnabled(!(isUseMuliSaparator && getConnection().isCsvOption()));
        escapeCharCombo.setEnabled(isUseMuliSaparator || getConnection().isCsvOption());
        textEnclosureCombo.setEnabled(isUseMuliSaparator || getConnection().isCsvOption());
        fieldSeparatorManager();
        if (!isUseMuliSaparator) {
            getConnection().setFieldSeparatorValue(
                    getMultiSchemaManager().getParameterValue(EParameterName.FIELDSEPARATOR));
        } else {
            getConnection().setFieldSeparatorValue(
                    getMultiSchemaManager().getParameterValue(EParameterName.MULTI_SEPARATORS));

        }

        // Fields to the Group Escape Char Settings
        textEnclosureCombo.select(0);
        escapeCharCombo.select(0);

        if (Escape.DELIMITED.equals(getConnection().getEscapeType())) {
            csvRadio.setSelection(false);
            delimitedRadio.setSelection(true);
            textEnclosureCombo.setEnabled(false);
            escapeCharCombo.setEnabled(false);
        }
        if (Escape.CSV.equals(getConnection().getEscapeType())) {
            csvRadio.setSelection(true);
            delimitedRadio.setSelection(false);
        }

        String s = getConnection().getEscapeChar();
        if (!(s == null) && !s.equals("") && !s.equals(EMPTY_VALUE)) { //$NON-NLS-1$
            escapeCharCombo.setText(s);
        }
        s = getConnection().getTextEnclosure();
        if (!(s == null) && !s.equals("") && !s.equals(EMPTY_VALUE)) { //$NON-NLS-1$
            textEnclosureCombo.setText(s);
        }

        // clearSelection of the selected combo
        encodingCombo.clearSelection();
        fieldSeparatorCombo.clearSelection();
        rowSeparatorCombo.clearSelection();
        escapeCharCombo.clearSelection();
        textEnclosureCombo.clearSelection();

    }

    private void adapteReadOnly() {
        fileField.setReadOnly(isReadOnly());
        fieldSeparatorCombo.setReadOnly(isReadOnly());
        fieldSeparatorText.setEditable(!isReadOnly());
        rowSeparatorCombo.setReadOnly(isReadOnly());
        rowSeparatorText.setEditable(!isReadOnly());
        encodingCombo.setReadOnly(isReadOnly());
        csvRadio.setEnabled(!isReadOnly());
        delimitedRadio.setEnabled(!isReadOnly());
        leftBtn.setEnabled(!isReadOnly());
        rightBtn.setEnabled(!isReadOnly());
        cardText.setEditable(!isReadOnly());
    }

    private void createFileGroup(Composite fileGroup) {
        fileGroup.setLayout(new GridLayout(3, false));

        fileField = new LabelledFileField(fileGroup, ExternalMultiSchemasUIProperties.FILE_LABEL,
                ExternalMultiSchemasUIProperties.FILE_EXTENSIONS, 1, SWT.BORDER) {

            @Override
            protected void setFileFieldValue(String result) {
                if (result != null) {
                    getTextControl().setText(TalendTextUtils.addQuotes(PathUtils.getPortablePath(result)));
                }
            }

        };
        Composite settings = new Composite(fileGroup, SWT.NONE);
        GridData layoutData = new GridData(GridData.FILL_HORIZONTAL);
        layoutData.horizontalSpan = 3;
        settings.setLayoutData(layoutData);
        settings.setLayout(new GridLayout(2, false));

        addGroupMultiSchemaSettings(settings);
        addGroupEscapeChar(settings);

    }

    private void addGroupMultiSchemaSettings(final Composite mainComposite) {
        Group group = Form.createGroup(mainComposite, 1, Messages.getString("FileStep2.groupDelimitedFileSettings"), //$NON-NLS-1$
                280);

        Composite composite = new Composite(group, SWT.NONE);
        GridLayout gridLayout = new GridLayout(4, false);
        gridLayout.marginHeight = 1;
        composite.setLayout(gridLayout);
        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        composite.setLayoutData(gd);

        EMetadataEncoding[] values = EMetadataEncoding.values();
        String[] encodingData = new String[values.length];
        for (int j = 0; j < values.length; j++) {
            encodingData[j] = values[j].getName();
        }

        encodingCombo = new LabelledCombo(composite, Messages.getString("FileStep2.encoding"), Messages //$NON-NLS-1$
                .getString("FileStep2.encodingTip"), encodingData, 3, true, SWT.NONE); //$NON-NLS-1$

        // Field Separator Combo & Text
        String[] fieldSeparatorData = getFieldSeparatorStyleSupportByLanguage();

        fieldSeparatorCombo = new LabelledCombo(composite, Messages.getString("FileStep2.fieldSeparator"), Messages //$NON-NLS-1$
                .getString("FileStep2.fieldSeparatorDelimitedTip"), fieldSeparatorData, 1, true, SWT.READ_ONLY); //$NON-NLS-1$

        fieldSeparatorText = new LabelledText(composite, "", 1, true, SWT.RIGHT); //$NON-NLS-1$

        // Dimension of columb of Separator Text
        GridData gridData = new GridData(SWT.FILL, SWT.BOTTOM, true, false);
        gridData.minimumWidth = 80;
        fieldSeparatorText.setLayoutData(gridData);

        // Row Separator Combo & Text
        String[] rowSeparatorData = { RowSeparator.STANDART_EOL_LITERAL.getLiteral(),
                RowSeparator.CUSTOM_STRING_LITERAL.getLiteral() };
        rowSeparatorCombo = new LabelledCombo(composite, Messages.getString("FileStep2.rowSeparator"), Messages //$NON-NLS-1$
                .getString("FileStep2.rowSeparatorTip"), rowSeparatorData, 1, true, SWT.READ_ONLY); //$NON-NLS-1$
        rowSeparatorText = new LabelledText(composite, "", 1, true, SWT.RIGHT); //$NON-NLS-1$

        useMultiSaparators = new Button(group, SWT.CHECK);
        Composite multiComp = new Composite(group, SWT.NONE);
        gridLayout = new GridLayout(2, false);
        gridLayout.marginHeight = 1;
        multiComp.setLayout(gridLayout);
        gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        multiComp.setLayoutData(gd);

        useMultiSaparators.setText(Messages.getString("MultiSchemasUI.useMultiSchemabtn"));
        multiSeparatorsText = new LabelledText(multiComp, "Multiple Separators", 1, true); //$NON-NLS-1$
        multiSeparatorsText.setEditable(false);
        keyValuesText = new LabelledText(multiComp, Messages.getString("MultiSchemasUI.keyValues"), 1, true); //$NON-NLS-1$
        keyValuesText.setEditable(false);
        keyIndexText = new LabelledText(multiComp, Messages.getString("MultiSchemasUI.keyIndex"), 1, true); //$NON-NLS-1$
        keyIndexText.setEditable(false);

    }

    private String[] getFieldSeparatorStyleSupportByLanguage() {
        ECodeLanguage language = LanguageManager.getCurrentLanguage();
        String[] styles = { FieldSeparator.SEMICOLON_LITERAL.getName(), FieldSeparator.COMMA_LITERAL.getName(),
                FieldSeparator.TABULATION_LITERAL.getName(), FieldSeparator.SPACE_LITERAL.getName(),
                FieldSeparator.ALT_65_LITERAL.getName(), FieldSeparator.CUSTOM_ANSI_LITERAL.getName(),
                FieldSeparator.CUSTOM_UTF8_LITERAL.getName(), FieldSeparator.CUSTOM_REG_EXP_LITERAL.getName() };
        switch (language) {
        case JAVA:
            String[] javaStyles = new String[styles.length - 1];
            System.arraycopy(styles, 0, javaStyles, 0, javaStyles.length);
            return javaStyles;
        default: // PERL
            return styles;
        }
    }

    /**
     * rowSeparator : Adapt Custom Label and set the field Text.
     */
    protected void rowSeparatorManager() {
        RowSeparator separator = RowSeparator.getByName(rowSeparatorCombo.getText());
        getConnection().setRowSeparatorType(separator);

        if (rowSeparatorCombo.getSelectionIndex() == 1) {
            // Adapt Custom Label
            rowSeparatorText.setLabelText(rowSeparatorCombo.getText());
            // rowSeparatorText.forceFocus();
        } else {
            // set the Flag width the char value of the Combo
            // { "Standard EOL", "Custom String" };
            if (rowSeparatorCombo.getSelectionIndex() == 0) {
                if (getConnection().getFormat().toString().equals(FileFormat.MAC_LITERAL.getName())) {
                    rowSeparatorText
                            .setText(TalendTextUtils.QUOTATION_MARK + "\\r" + TalendTextUtils.QUOTATION_MARK); //$NON-NLS-1$
                } else {
                    rowSeparatorText
                            .setText(TalendTextUtils.QUOTATION_MARK + "\\n" + TalendTextUtils.QUOTATION_MARK); //$NON-NLS-1$
                }
            }
            // Init Custom Label
            rowSeparatorText.setLabelText(Messages.getString("FileStep2.correspondingCharacter")); //$NON-NLS-1$
            getConnection().setRowSeparatorValue(rowSeparatorText.getText());
        }
    }

    private RowSeparator getRowSeparatorFromString(String separator) {
        if (separator == null || !separator.equals(TalendTextUtils.addQuotes("\\n"))) {
            return RowSeparator.CUSTOM_STRING_LITERAL;
        }
        return RowSeparator.STANDART_EOL_LITERAL;
    }

    /**
     * fieldSeparator : Adapt Custom Label and set the field Text.
     */
    protected void fieldSeparatorManager() {
        FieldSeparator seperator = FieldSeparator.getByName(fieldSeparatorCombo.getText());
        getConnection().setFieldSeparatorType(seperator);

        if (fieldSeparatorCombo.getSelectionIndex() >= 5) {
            // Adapt Custom Label
            fieldSeparatorText.setLabelText(fieldSeparatorCombo.getText());
            fieldSeparatorText.setText(getConnection().getFieldSeparatorValue());
            fieldSeparatorText.forceFocus();

        } else {
            // set the Flag width the char value of the Combo
            // { "Tabulation", "Semicolon", "Comma", "Space", "''(Alt 65, #A4)", "Custom ANSI", "Custom UTF8",
            switch (fieldSeparatorCombo.getSelectionIndex()) {
            case 0:
                fieldSeparatorText.setText(TalendTextUtils.addQuotes(";")); //$NON-NLS-1$
                break;
            case 1:
                fieldSeparatorText.setText(TalendTextUtils.addQuotes(",")); //$NON-NLS-1$
                break;
            case 2:
                fieldSeparatorText.setText(TalendTextUtils.addQuotes("\\t")); //$NON-NLS-1$
                break;
            case 3:
                fieldSeparatorText.setText(TalendTextUtils.addQuotes(" ")); //$NON-NLS-1$
                break;
            case 4:
                fieldSeparatorText.setText(TalendTextUtils.addQuotes("''")); //$NON-NLS-1$
                break;
            default:
                break;
            }

            // Init Custom Label
            getConnection().setFieldSeparatorValue(fieldSeparatorText.getText());
            fieldSeparatorText.setLabelText(Messages.getString("FileStep2.correspondingCharacter")); //$NON-NLS-1$

        }
    }

    private FieldSeparator getFieldSeparatorFromString(String separator) {
        if (separator == null) {
            return FieldSeparator.SEMICOLON_LITERAL;
        }
        if (separator.equals(TalendTextUtils.addQuotes(";"))) {
            return FieldSeparator.SEMICOLON_LITERAL;
        } else if (separator.equals(TalendTextUtils.addQuotes(","))) {
            return FieldSeparator.COMMA_LITERAL;
        } else if (separator.equals(TalendTextUtils.addQuotes("\\t"))) {
            return FieldSeparator.TABULATION_LITERAL;
        } else if (separator.equals(TalendTextUtils.addQuotes(" "))) {
            return FieldSeparator.SPACE_LITERAL;
        } else if (separator.equals(TalendTextUtils.addQuotes("''"))) {
            return FieldSeparator.ALT_65_LITERAL;
        }
        return FieldSeparator.CUSTOM_UTF8_LITERAL;
    }

    private void addFieldsListenersGroupFileSettings() {
        // Event encodingCombo
        encodingCombo.addModifyListener(new ModifyListener() {

            public void modifyText(final ModifyEvent e) {
                getConnection().setEncoding(encodingCombo.getText());
                checkFieldsValue();
            }
        });

        // Separator Combo (field and row)
        fieldSeparatorCombo.addModifyListener(new ModifyListener() {

            public void modifyText(final ModifyEvent e) {
                // Label Custom of fieldSeparatorText
                fieldSeparatorManager();
            }
        });
        rowSeparatorCombo.addModifyListener(new ModifyListener() {

            public void modifyText(final ModifyEvent e) {
                // Label Custom of rowSeparatorText
                rowSeparatorManager();
            }
        });

        // Separator Text (field and row)
        fieldSeparatorText.addModifyListener(new ModifyListener() {

            public void modifyText(final ModifyEvent e) {
                getConnection().setFieldSeparatorValue(fieldSeparatorText.getText());
                checkFieldsValue();
            }
        });

        multiSeparatorsText.addModifyListener(new ModifyListener() {

            public void modifyText(final ModifyEvent e) {
                getConnection().setFieldSeparatorValue(multiSeparatorsText.getText());
                previewBtn.setEnabled(checkFieldsValue());
            }
        });

        keyIndexText.addKeyListener(new KeyAdapter() {

            @Override
            public void keyPressed(KeyEvent e) {
                if (e.character > '9' || e.character < '0') {
                    if (e.character != '\b' || e.keyCode == '\u0016') {
                        e.doit = false;
                    }
                }
            }

        });
        keyIndexText.addModifyListener(new ModifyListener() {

            public void modifyText(final ModifyEvent e) {
                boolean modify = false;
                if (keyIndexText.getText() == null || "".equals(keyIndexText.getText())) {
                    multiSchemaManager.setSelectedColumnIndex(0);
                    modify = true;
                } else {
                    int index = 0;
                    try {
                        index = Integer.parseInt(keyIndexText.getText());
                    } catch (Exception ex) {
                        index = 0;
                        keyIndexText.setText(String.valueOf(index));
                    }
                    multiSchemaManager.setSelectedColumnIndex(index);
                    modify = true;
                }
                if (modify) {
                    // refreshPreview();

                }
                previewBtn.setEnabled(checkFieldsValue());
                if (previewBtn.isEnabled()) {
                    refreshPreview();
                }

            }
        });

        keyValuesText.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                previewBtn.setEnabled(checkFieldsValue());
            }

        });
        rowSeparatorText.addModifyListener(new ModifyListener() {

            public void modifyText(final ModifyEvent e) {
                getConnection().setRowSeparatorValue(rowSeparatorText.getText());
                checkFieldsValue();
            }
        });
        cardText.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                IStructuredSelection selection = (IStructuredSelection) schemaTreeViewer.getSelection();
                Object element = selection.getFirstElement();
                if (element != null && (element instanceof SchemasKeyData)) {
                    ((SchemasKeyData) element).setCard(cardText.getText());
                }

            }

        });
    }

    private void addFieldsListenersGroupsEscapeChar() {
        // Radio csvRadio/delimitedRadio : Event modify
        ArrayList<Button> radio2Control = new ArrayList<Button>();
        radio2Control.add(csvRadio);
        radio2Control.add(delimitedRadio);

        Iterator<Button> iButton;
        Button button;

        for (iButton = radio2Control.iterator(); iButton.hasNext();) {
            button = iButton.next();
            // RADIO ONLY
            button.addSelectionListener(new SelectionListener() {

                String escapeCharComboOldValue = ""; //$NON-NLS-1$

                String textEnclosureComboOldValue = ""; //$NON-NLS-1$

                public void widgetDefaultSelected(SelectionEvent e) {
                }

                public void widgetSelected(SelectionEvent e) {
                    Boolean b = !(csvRadio.getSelection());
                    getConnection().setEscapeType(b ? Escape.DELIMITED : Escape.CSV);
                    textEnclosureCombo.setEnabled(!b);
                    escapeCharCombo.setEnabled(!b);
                    if (b) {
                        escapeCharComboOldValue = escapeCharCombo.getText();
                        textEnclosureComboOldValue = textEnclosureCombo.getText();
                        textEnclosureCombo.select(0);
                        escapeCharCombo.select(0);
                        textEnclosureFlag.setText(" "); //$NON-NLS-1$
                        escapeCharFlag.setText(" "); //$NON-NLS-1$
                        checkFieldsValue();
                    } else {
                        // select the old value to the two fields
                        if ((!"".equals(escapeCharComboOldValue)) //$NON-NLS-1$
                                && (!escapeCharComboOldValue.equals(EMPTY_VALUE))) {
                            escapeCharCombo.setText(escapeCharComboOldValue);
                            escapeCharFlag.setText(escapeCharCombo.getText());
                        }
                        if ((!"".equals(textEnclosureComboOldValue)) //$NON-NLS-1$
                                && (!textEnclosureComboOldValue.equals(EMPTY_VALUE))) {
                            textEnclosureCombo.setText(textEnclosureComboOldValue);
                            textEnclosureFlag.setText(textEnclosureCombo.getText());
                        }
                    }
                }
            });
        }

        // Escape Char Combo
        escapeCharCombo.addModifyListener(new ModifyListener() {

            public void modifyText(final ModifyEvent e) {
                if (escapeCharCombo.getText() != null && !("").equals(escapeCharCombo.getText()) //$NON-NLS-1$
                        && !(EMPTY_VALUE).equals(escapeCharCombo.getText())) {
                    getConnection().setEscapeChar(escapeCharCombo.getText());
                } else {
                    getConnection().setEscapeChar(null);
                }
                checkFieldsValue();
            }
        });
        textEnclosureCombo.addModifyListener(new ModifyListener() {

            public void modifyText(final ModifyEvent e) {
                if (textEnclosureCombo.getText() != null && !("").equals(textEnclosureCombo.getText()) //$NON-NLS-1$
                        && !(EMPTY_VALUE).equals(textEnclosureCombo.getText())) {
                    getConnection().setTextEnclosure(textEnclosureCombo.getText());
                } else {
                    getConnection().setTextEnclosure(null);
                }
                checkFieldsValue();
            }
        });
    }

    private void addGroupEscapeChar(final Composite mainComposite) {

        // Composite Escape Char
        Group group = Form.createGroup(mainComposite, 3, Messages.getString("FileStep2.groupEscapeCharSettings"), //$NON-NLS-1$
                100);

        // CSV or Positionel Radio
        csvRadio = new Button(group, SWT.RADIO);
        csvRadio.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                getConnection().setCsvOption(csvRadio.getSelection());
                if (csvRadio.getSelection()) {
                    getConnection().setSplitRecord(false);
                }
            }
        });

        csvRadio.setText(Messages.getString("FileStep2.csv")); //$NON-NLS-1$
        delimitedRadio = new Button(group, SWT.RADIO);
        delimitedRadio.setText(Messages.getString("FileStep2.delimited")); //$NON-NLS-1$
        GridData gridData = new GridData(SWT.FILL, SWT.BOTTOM, true, false);
        gridData.horizontalSpan = 2;
        delimitedRadio.setLayoutData(gridData);
        getConnection().setCsvOption(false);
        delimitedRadio.setSelection(true);
        // escape Char Combo
        escapeCharCombo = new LabelledCombo(group, Messages.getString("FileStep2.escapeChar"), Messages //$NON-NLS-1$
                .getString("FileStep2.escapeCharTip"), ESCAPE_CHAR_DATA, 1, false, SWT.READ_ONLY); //$NON-NLS-1$
        escapeCharFlag = new Label(group, SWT.NONE);
        escapeCharFlag.setText("    "); //$NON-NLS-1$
        // Text Enclosure Combo
        textEnclosureCombo = new LabelledCombo(group, Messages.getString("FileStep2.textEnclosure"), Messages //$NON-NLS-1$
                .getString("FileStep2.textEnclosureTip"), TEXT_ENCLOSURE_DATA, 1, false, SWT.READ_ONLY); //$NON-NLS-1$
        textEnclosureFlag = new Label(group, SWT.NONE);
        textEnclosureFlag.setText("    "); //$NON-NLS-1$

    }

    private void createViewers(SashForm allContentForm) {
        allContentForm.setLayout(new FillLayout());
        allContentForm.setOrientation(SWT.VERTICAL);
        allContentForm.setSashWidth(ExternalMultiSchemasUIProperties.SASHFORM_WIDTH);

        createHeader(allContentForm);
        creatButtom(allContentForm);

        allContentForm.setWeights(ExternalMultiSchemasUIProperties.getAllSashformWeights());

    }

    private void creatButtom(SashForm allContentForm) {
        //
        Composite composite = new Composite(allContentForm, SWT.NONE);
        GridLayout layout = new GridLayout(2, false);
        layout.marginWidth = 2;
        layout.marginHeight = 0;
        composite.setLayout(layout);

        schemaDetailsViewer = new TreeViewer(composite,
                SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
        final Tree tree = schemaDetailsViewer.getTree();
        tree.setHeaderVisible(true);
        tree.setLinesVisible(true);
        tree.setLayoutData(new GridData(GridData.FILL_BOTH));

        createCardComposite(composite);

        getUIManager().changeSchemasDetailView(schemaDetailsViewer, getSchemaDetailModel());
    }

    private void createCardComposite(Composite parent) {

        Composite cardComposite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout(2, false);
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        cardComposite.setLayout(layout);
        GridData layoutData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
        cardComposite.setLayoutData(layoutData);

        final ToolBar menuBar = new ToolBar(cardComposite, SWT.FLAT | SWT.NO_BACKGROUND);
        GridDataFactory.swtDefaults().align(SWT.LEFT, SWT.TOP).span(2, 1).applyTo(menuBar);
        createMenuBar(menuBar);

        cardText = new LabelledText(cardComposite, "Cardinality");
        layoutData = new GridData();
        layoutData.minimumWidth = 90;
        layoutData.widthHint = 90;
        cardText.getTextControl().setLayoutData(layoutData);
        cardText.setEnabled(false);
    }

    private void createMenuBar(final ToolBar menuBar) {
        ToolItem pullDownButton = new ToolItem(menuBar, SWT.PUSH);
        // Image hoverImage = WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_LCL_RENDERED_VIEW_MENU);
        Image hoverImage = PlatformUI.getWorkbench().getSharedImages().getImage("IMG_LCL_RENDERED_VIEW_MENU"); //$NON-NLS-1$
        pullDownButton.setDisabledImage(hoverImage);
        pullDownButton.setImage(hoverImage);
        pullDownButton.setToolTipText("Menu");
        pullDownButton.setWidth(5);

        MenuManager menuManager = new MenuManager("MultiSchema");//$NON-NLS-1$

        columnAction = new SchameDetailsColumnAction(schemaDetailsViewer);
        columnAction.setChecked(!ExternalMultiSchemasUIProperties.isSchemaDetailsModel());
        menuManager.add(columnAction);

        propertyAction = new SchameDetailsPropertyAction(schemaDetailsViewer);
        propertyAction.setChecked(ExternalMultiSchemasUIProperties.isSchemaDetailsModel());
        menuManager.add(propertyAction);

        final Menu aMenu = menuManager.createContextMenu(menuBar.getParent());

        pullDownButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                Point toolbarSize = menuBar.getSize();
                toolbarSize = menuBar.toDisplay(0, toolbarSize.y);
                aMenu.setLocation(toolbarSize);
                aMenu.setVisible(true);
            }
        });
    }

    private void createHeader(SashForm allContentForm) {
        //
        tabFolder = new CTabFolder(allContentForm, SWT.NULL);
        tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));

        previewTabItem = new CTabItem(tabFolder, SWT.NONE);
        previewTabItem.setText(ExternalMultiSchemasUIProperties.PREVIEW_LABEL);
        tabFolder.setSelection(previewTabItem);

        outputTabItem = new CTabItem(tabFolder, SWT.BORDER);
        outputTabItem.setText(ExternalMultiSchemasUIProperties.OUTPUT_LABEL);
        outputComposite = Form.startNewGridLayout(tabFolder, 1);
        outputTabItem.setControl(outputComposite);

        Composite headerComposite = new Composite(tabFolder, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        headerComposite.setLayout(layout);
        previewTabItem.setControl(headerComposite);

        createHeaderStatus(headerComposite);

        createHeaderSashForm(headerComposite);
    }

    private void createHeaderStatus(Composite headerComposite) {
        Composite previewComposite = new Composite(headerComposite, SWT.NONE);
        GridData layoutData = new GridData(GridData.FILL_HORIZONTAL);
        layoutData.verticalIndent = 3;
        previewComposite.setLayoutData(layoutData);
        GridLayout layout = new GridLayout(2, false);
        layout.verticalSpacing = 2;
        previewComposite.setLayout(layout);

        previewBtn = new Button(previewComposite, SWT.PUSH);
        previewBtn.setText(ExternalMultiSchemasUIProperties.PREVIEW_STRING);
        layoutData = new GridData();
        layoutData.horizontalIndent = 50;
        previewBtn.setLayoutData(layoutData);

        previewInformationLabel = new Label(previewComposite, SWT.NONE);
        layoutData = new GridData(GridData.FILL_HORIZONTAL);
        layoutData.horizontalIndent = 20;
        previewInformationLabel.setLayoutData(layoutData);
        previewInformationLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
    }

    private void createHeaderSashForm(Composite headerComposite) {
        GridLayout layout;
        headerSashForm = new SashForm(headerComposite, SWT.NONE);
        headerSashForm.setLayout(new FillLayout());
        headerSashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
        headerSashForm.setSashWidth(ExternalMultiSchemasUIProperties.SASHFORM_WIDTH);
        //
        multiSchemasFilePreview = new MultiSchemasShadowProcessPreview(this, headerSashForm);
        multiSchemasFilePreview.newTablePreview();

        Composite struComp = new Composite(headerSashForm, SWT.NONE);
        layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        struComp.setLayout(layout);
        headerSashForm.setWeights(ExternalMultiSchemasUIProperties.getHeaderSashformWeights());
        //
        fetchBtn = new Button(struComp, SWT.PUSH);
        fetchBtn.setText(ExternalMultiSchemasUIProperties.FETCH_LABEL);
        fetchBtn.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));

        //
        schemaTreeViewer = new TreeViewer(struComp, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
        Tree tree = schemaTreeViewer.getTree();
        tree.setLayoutData(new GridData(GridData.FILL_BOTH));
        tree.setHeaderVisible(true);
        tree.setLinesVisible(true);
        schemaTreeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
        // SchemasTreeDnD dnd = new SchemasTreeDnD(schemaTreeViewer);
        // dnd.addDragAndDrop();

        schemaTreeViewer.setContentProvider(new SchemasTreeContentProvider());
        schemaTreeViewer.setLabelProvider(new SchemasTreeLabelProvider());

        // schemaTreeViewer.setSorter(new ViewerSorter() {
        //
        // @SuppressWarnings("unchecked")
        // @Override
        // public int compare(Viewer viewer, Object e1, Object e2) {
        // if (e1 instanceof SchemasKeyData && e2 instanceof SchemasKeyData) {
        // return getComparator().compare(((SchemasKeyData) e1).getKeyName(), ((SchemasKeyData) e2).getKeyName());
        // }
        // return super.compare(viewer, e1, e2);
        // }
        //
        // });
        TreeColumn column = new TreeColumn(tree, SWT.LEFT);
        column.setWidth(55);
        column.setText("Schema");//$NON-NLS-1$
        column.setResizable(true);

        column = new TreeColumn(tree, SWT.LEFT);
        column.setWidth(100);
        column.setText("Record");//$NON-NLS-1$
        column.setResizable(true);

        column = new TreeColumn(tree, SWT.LEFT);
        column.setWidth(20);
        column.setText("Separator");//$NON-NLS-1$
        column.setResizable(true);
        schemaTreeViewer.setColumnProperties(new String[] { ExternalMultiSchemasUIProperties.COLUMN_KEY,
                ExternalMultiSchemasUIProperties.COLUMN_RECORD,
                ExternalMultiSchemasUIProperties.COLUMN_SEPARATOR });

        // hywang for 10263
        int columnCount = schemaTreeViewer.getTree().getColumnCount();
        CellEditor[] editors = new CellEditor[columnCount];
        for (int i = 0; i < columnCount; i++) {
            editors[i] = new TextCellEditor(schemaTreeViewer.getTree());
        }
        schemaTreeViewer.setCellEditors(editors);
        schemaTreeViewer.setCellModifier(new ICellModifier() {

            public void modify(Object element, String property, Object value) {
                if (element != null) {
                    if (element instanceof TreeItem) {
                        TreeItem item = (TreeItem) element;
                        if (item.getData() != null) {
                            if (item.getData() instanceof SchemasKeyData) {
                                SchemasKeyData key = (SchemasKeyData) item.getData();
                                if (property.equals(ExternalMultiSchemasUIProperties.COLUMN_KEY)) {
                                    final boolean flag = checkKeyValue(key.getUniqueRecord(), value.toString());
                                    if (flag) {
                                        key.setUniqueRecord(value.toString());
                                    }
                                }
                                if (property.equals(ExternalMultiSchemasUIProperties.COLUMN_RECORD)) {
                                    key.setRecordType(value.toString());
                                }
                                if (property.equals(ExternalMultiSchemasUIProperties.COLUMN_SEPARATOR)) {
                                    key.setSeparator(value.toString());
                                }
                                // Object input = schemaTreeViewer.getInput();
                                // SchemasKeyData in = (SchemasKeyData) input;
                                // if (in.getChildren().contains(key)) {
                                // in.getChildren().remove(in.getChildren().indexOf(key));
                                // List<MultiMetadataColumn> colums = multiSchemaManager.createPropertiesColumns(key);
                                // key.setMetadataColumns(colums);
                                // in.getChildren().add(key);
                                // }
                            }
                            schemaTreeViewer.refresh();
                        }
                    }
                }
            }

            public Object getValue(Object element, String property) {
                String record = "";
                if (element != null) {
                    if (element instanceof SchemasKeyData) {
                        SchemasKeyData key = (SchemasKeyData) element;
                        if (property.equals(ExternalMultiSchemasUIProperties.COLUMN_KEY)) {
                            record = key.getUniqueRecord();
                        }
                        if (property.equals(ExternalMultiSchemasUIProperties.COLUMN_RECORD)) {
                            record = key.getRecordType();
                        }
                        if (property.equals(ExternalMultiSchemasUIProperties.COLUMN_SEPARATOR)) {
                            record = key.getSeparator();
                        }
                    }
                }
                return record;
            }

            public boolean canModify(Object element, String property) {
                return true;
            }
        });

        Composite operateTreeComposite = new Composite(struComp, SWT.NONE);
        operateTreeComposite.setLayout(new GridLayout(3, false));
        operateTreeComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
        addRow = new Button(operateTreeComposite, SWT.NONE);
        addRow.setText("Add");
        removeRow = new Button(operateTreeComposite, SWT.NONE);
        removeRow.setText("Remove");
        removeRow.setEnabled(false);
        editSchema = new Button(operateTreeComposite, SWT.NONE);
        editSchema.setText("Edit Columns");
        editSchema.setEnabled(false);

        Composite operation = new Composite(struComp, SWT.NONE);
        operation.setLayout(new GridLayout(2, false));
        operation.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));

        leftBtn = new Button(operation, SWT.PUSH);
        leftBtn.setToolTipText("Left");
        leftBtn.setImage(ImageProvider.getImage(EImage.LEFT_ICON));
        leftBtn.setEnabled(false);

        rightBtn = new Button(operation, SWT.PUSH);
        rightBtn.setToolTipText("Right");
        rightBtn.setImage(ImageProvider.getImage(EImage.RIGHT_ICON));
        rightBtn.setEnabled(false);
    }

    private void addFieldListeners() {
        fileField.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                getConnection().setFilePath(fileField.getText());
                previewBtn.setEnabled(checkFieldsValue());
                clearPreview();
                refreshPreview();
            }
        });
        rowSeparatorText.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                getConnection().setRowSeparatorValue(rowSeparatorText.getText());
                previewBtn.setEnabled(checkFieldsValue());
                clearPreview();

            }
        });
        fieldSeparatorText.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                getConnection().setFieldSeparatorValue(fieldSeparatorText.getText());
                previewBtn.setEnabled(checkFieldsValue());
                clearPreview();

            }
        });

        useMultiSaparators.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                boolean selected = useMultiSaparators.getSelection();
                fieldSeparatorCombo.setEnabled(!selected);
                fieldSeparatorText.setEditable(!selected);
                multiSeparatorsText.setEditable(selected);
                keyValuesText.setEditable(selected);
                keyIndexText.setEditable(selected);
                escapeCharCombo.setEnabled(selected);
                textEnclosureCombo.setEnabled(selected);
                csvRadio.setSelection(selected);
                delimitedRadio.setSelection(!selected);
                delimitedRadio.setEnabled(!selected);
                if (selected) {
                    getConnection().setFieldSeparatorValue(multiSeparatorsText.getText());
                    multiSchemaManager.setSelectedColumnIndex(Integer.parseInt(keyIndexText.getText()));
                } else {
                    getConnection().setFieldSeparatorValue(fieldSeparatorText.getText());
                }
                clearPreview();
                previewBtn.setEnabled(checkFieldsValue());
                if (previewBtn.isEnabled()) {
                    refreshPreview();
                }
            }

        });

        schemaTreeViewer.getTree().addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                getUIManager().refreshSchemasDetailView(schemaTreeViewer, schemaDetailsViewer,
                        getSchemaDetailModel());
            }
        });
        schemaTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent event) {
                removeRow.setEnabled(true);
                editSchema.setEnabled(true);
                if (isReadOnly()) {
                    leftBtn.setEnabled(false);
                    rightBtn.setEnabled(false);
                } else {
                    leftBtn.setEnabled(getUIManager().enableMovedRecord(schemaTreeViewer, true));
                    rightBtn.setEnabled(getUIManager().enableMovedRecord(schemaTreeViewer, false));
                }
                IStructuredSelection selection = (IStructuredSelection) schemaTreeViewer.getSelection();
                Object element = selection.getFirstElement();
                if (element != null && (element instanceof SchemasKeyData)
                        && ((SchemasKeyData) element).getTagLevel() > 0) {
                    cardText.setText(((SchemasKeyData) element).getCard());
                    cardText.setEnabled(true);
                } else {
                    cardText.setText(""); //$NON-NLS-1$
                    cardText.setEnabled(false);
                }
            }
        });
        schemaTreeViewer.getTree().addKeyListener(new KeyAdapter() {

            @Override
            public void keyPressed(KeyEvent e) {
                //
            }

            @Override
            public void keyReleased(KeyEvent e) {
                //
            }
        });
        schemaTreeViewer.addTreeListener(new ITreeViewerListener() {

            public void treeCollapsed(TreeExpansionEvent event) {
                // getUIManager().packSchemaTreeFirstColumn(schemaTreeViewer);
            }

            public void treeExpanded(TreeExpansionEvent event) {
                // getUIManager().packSchemaTreeFirstColumn(schemaTreeViewer);
            }
        });
    }

    protected void addButtonListeners() {

        // Event PreviewButton
        previewBtn.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                refreshPreview();
            }
        });
        fetchBtn.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                fetchCodes();
            }
        });
        leftBtn.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                getUIManager().moveRecord(schemaTreeViewer, true);
                getUIManager().packSchemaTreeFirstColumn(schemaTreeViewer);
            }
        });
        rightBtn.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                getUIManager().moveRecord(schemaTreeViewer, false);
                getUIManager().packSchemaTreeFirstColumn(schemaTreeViewer);
            }
        });
        addRow.addSelectionListener(new SelectionAdapter() { // hywang for 10263

            @Override
            public void widgetSelected(SelectionEvent e) {
                SchemasKeyData root = (SchemasKeyData) schemaTreeViewer.getInput();
                AddRowDialog dialog = new AddRowDialog(MultiSchemasUI.this.getShell(), root);
                if (Window.OK == dialog.open()) {
                    Object input = schemaTreeViewer.getInput();
                    if (input instanceof SchemasKeyData) {

                        SchemasKeyData data = (SchemasKeyData) input;
                        List<SchemasKeyData> all = data.getChildren();
                        SchemasKeyData newData = new SchemasKeyData(dialog.getRecordValue());
                        newData.setSeparator(dialog.getSepValue());
                        newData.setUniqueRecord(dialog.getKeyValue());

                        final IMetadataTable metadataTable = MetadataToolHelper
                                .getMetadataTableFromNode(getMultiSchemasComponent(), dialog.getKeyValue());
                        if (metadataTable != null) {
                            multiSchemaManager.createMultiSchemasColumns(newData, metadataTable.clone(true));
                        } else {
                            List<MultiMetadataColumn> colums = multiSchemaManager.createPropertiesColumns(newData);
                            newData.setMetadataColumns(colums);
                        }
                        all.add(newData);
                        data.addChild(newData);
                        newData.setParent(data);
                        schemaTreeViewer.refresh();
                        int len = schemaTreeViewer.getTree().getItems().length;
                        schemaTreeViewer.getTree().select(schemaTreeViewer.getTree().getItems()[len - 1]);
                    }
                    getUIManager().refreshSchemasDetailView(schemaTreeViewer, schemaDetailsViewer,
                            getSchemaDetailModel());
                }
            }
        });
        removeRow.addSelectionListener(new SelectionAdapter() { // hywang for 10263

            @Override
            public void widgetSelected(SelectionEvent e) {
                boolean needRefresh = false;
                if (schemaTreeViewer == null) {
                    return;
                }
                SchemasKeyData removeData = null;
                ISelection selection = schemaTreeViewer.getSelection();
                Object input = schemaTreeViewer.getInput();
                if (selection instanceof IStructuredSelection) {
                    Object element = ((IStructuredSelection) selection).getFirstElement();
                    if (element instanceof SchemasKeyData) {
                        removeData = (SchemasKeyData) element;
                    }
                }
                if (input instanceof SchemasKeyData) {
                    SchemasKeyData data = (SchemasKeyData) input;
                    List<SchemasKeyData> all = data.getChildren();
                    if (all.contains(removeData)) {
                        all.remove(removeData);
                        schemaTreeViewer.setInput(data);
                        needRefresh = true;
                    }
                    if (needRefresh) {
                        schemaTreeViewer.refresh();
                        int len = schemaTreeViewer.getTree().getItems().length;
                        if (len > 0) {
                            schemaTreeViewer.getTree().select(schemaTreeViewer.getTree().getItems()[len - 1]);
                        }
                        removeRow.setEnabled(!all.isEmpty());
                        editSchema.setEnabled(!all.isEmpty());
                        getUIManager().refreshSchemasDetailView(schemaTreeViewer, schemaDetailsViewer,
                                getSchemaDetailModel());
                    }
                }
            }
        });

        editSchema.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                ISelection selection = schemaTreeViewer.getSelection();
                SchemasKeyData selectedData = null;
                if (selection instanceof IStructuredSelection) {
                    Object element = ((IStructuredSelection) selection).getFirstElement();
                    if (element instanceof SchemasKeyData) {
                        selectedData = (SchemasKeyData) element;
                        IMetadataTable metadataTable = MetadataToolHelper.getMetadataTableFromNode(
                                getMultiSchemasComponent(), selectedData.getUniqueRecord());
                        if (metadataTable == null) {
                            metadataTable = new org.talend.core.model.metadata.MetadataTable();
                        }
                        metadataTable.getListColumns().clear();
                        SchemasKeyData keydata = (SchemasKeyData) schemaTreeViewer.getInput();
                        for (int i = 0; i < keydata.getChildren().size(); i++) {
                            if (selectedData.getUniqueRecord()
                                    .equals(keydata.getChildren().get(i).getUniqueRecord())) {
                                metadataTable.getListColumns()
                                        .addAll(keydata.getChildren().get(i).getMetadataColumns());
                                break;
                            }
                        }

                        MetadataDialog dialog = new MetadataDialog(MultiSchemasUI.this.getShell(), metadataTable,
                                getMultiSchemasComponent(),
                                new CommandStackForComposite(MultiSchemasUI.this.getShell()));
                        dialog.setText("Schema of " + selectedData.getUniqueRecord());
                        if (Window.OK == dialog.open()) {
                            metadataTable = dialog.getOutputMetaData();
                            if (!selectedData.getMetadataColumns().isEmpty()) {
                                selectedData.getMetadataColumns().clear();
                            }
                            multiSchemaManager.createMultiSchemasColumns(selectedData, metadataTable);
                            getUIManager().refreshSchemasDetailView(schemaTreeViewer, schemaDetailsViewer,
                                    getSchemaDetailModel());
                        }
                    }
                }
            }

        });

    }

    @SuppressWarnings("restriction")
    private void fetchCodes() {
        try {
            final ProgressMonitorDialog dialog = new ProgressMonitorDialog(getShell());
            dialog.run(true, false, new IRunnableWithProgress() {

                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    monitor.beginTask("Fetch...", IProgressMonitor.UNKNOWN);
                    monitor.setCanceled(false);

                    final CsvArray csvArray = processor.getCsvArray();

                    Display.getDefault().syncExec(new Runnable() {

                        public void run() {
                            SchemasKeyData schemasModel = null;
                            boolean checked = (csvArray != null && csvArray.getRows().size() > 0);
                            CSVArrayAndSeparator uniqueCsvArray = null;

                            if (useMultiSaparators.getSelection()) {
                                getMultiSchemaManager().setKeyValues(keyValuesText.getText());
                            }

                            if (multiSchemasFilePreview.getSelectColumnIndex() < 0
                                    && multiSchemaManager.getSelectedColumnIndex() != 0) {
                                uniqueCsvArray = getMultiSchemaManager().retrieveCsvArrayInUniqueModel(
                                        getProcessDescription(), checked,
                                        multiSchemaManager.getSelectedColumnIndex(),
                                        useMultiSaparators.getSelection());

                                schemasModel = getMultiSchemaManager().createSchemasTree(uniqueCsvArray,
                                        multiSchemaManager.getSelectedColumnIndex());

                            } else {

                                uniqueCsvArray = getMultiSchemaManager().retrieveCsvArrayInUniqueModel(
                                        getProcessDescription(), checked,
                                        multiSchemasFilePreview.getSelectColumnIndex(),
                                        useMultiSaparators.getSelection());

                                schemasModel = getMultiSchemaManager().createSchemasTree(uniqueCsvArray,
                                        multiSchemasFilePreview.getSelectColumnIndex());
                                getMultiSchemaManager()
                                        .setSelectedColumnIndex(multiSchemasFilePreview.getSelectColumnIndex());
                                schemaTreeViewer.setInput(schemasModel);
                                getUIManager().packSchemaTreeFirstColumn(schemaTreeViewer);
                                clearSchemaDetail();
                                checkDialog();
                            }
                        }
                    });
                    monitor.done();
                }
            });

        } catch (InvocationTargetException e) {
            ExceptionHandler.process(e);
        } catch (InterruptedException e) {
            ExceptionHandler.process(e);
        }

    }

    /**
     * clear the table preview.
     */
    void clearPreview() {
        multiSchemasFilePreview.removePreviewContent();
        this.processor.clearCsvArray();
    }

    void clearSchemaTree() {
        schemaTreeViewer.setInput(null);
    }

    void clearSchemaDetail() {
        schemaDetailsViewer.setInput(null);
        // dipose other columns, except first.
        // getUIManager().updateColumns(schemaDetailsViewer.getTree(), 0);
    }

    private UIManager getUIManager() {
        return getMultiSchemaManager().getUIManager();
    }

    /**
     * refreshPreview use ShadowProcess to refresh the preview.
     */
    void refreshPreview() {

        Display.getCurrent().asyncExec(new Runnable() {

            public void run() {
                if (checkFieldsValue()) {
                    if (useMultiSaparators.getSelection()) {
                        launch();
                    } else {
                        processor.execute();
                    }
                    setFetchButtonStatus(true);
                }
            }
        });
    }

    private void launch() {
        try {
            String filePath = this.multiSchemaManager.getOriginalValue(this.getConnection().getFilePath());
            CsvArray csvArray = getMultiSchemaManager().getCsvArrayForMultiSchemaDelimited(filePath,
                    multiSeparatorsText.getText(), encodingCombo.getText(), keyValuesText.getText(),
                    multiSchemaManager.getSelectedColumnIndex());
            processor.setCsvArray(csvArray);

            Display.getDefault().asyncExec(new Runnable() {

                public void run() {
                    processor.execute2();

                }
            });

        } catch (FileNotFoundException e) {
            ExceptionHandler.process(e);
        } catch (IOException e) {
            ExceptionHandler.process(e);
        }

    }

    private String getFile() {
        return this.multiSchemaManager.getOriginalValue(this.getConnection().getFilePath());
    }

    private String getRowSeperator() {
        return this.multiSchemaManager.getOriginalValue(this.getConnection().getRowSeparatorValue());
    }

    private String getFieldSeperator(boolean useMultiSeparator) {
        if (useMultiSeparator) {
            return multiSeparatorsText.getText();
        } else {
            return this.multiSchemaManager.getOriginalValue(this.getConnection().getFieldSeparatorValue());
        }

    }

    private boolean checkString(String value) {
        if (value != null && !"".equals(value)) {
            return true;
        }
        return false;
    }

    protected boolean checkFieldsValue() {
        if (!checkString(getFile())) {
            previewInformationLabel.setText(Messages.getString("FileStep2.filePathIncomplete")); //$NON-NLS-1$ 
            return false;
        } else {
            String file = TalendTextUtils.removeQuotes(getFile());
            if (!new File(file).exists()) {
                previewInformationLabel.setText("File not found");
                return false;
            }
        }
        boolean checkFieldSeparator = false;

        if (!checkString(getRowSeperator()) || !checkString(getFieldSeperator(useMultiSaparators.getSelection()))) {
            previewInformationLabel.setText(Messages.getString("FileStep2.settingsIncomplete")); //$NON-NLS-1$ 
            return false;
        }
        // escape Char Combo
        if (escapeCharCombo.getText() == "") { //$NON-NLS-1$
            previewInformationLabel.setText(Messages.getString("FileStep2.escapeCharAlert")); //$NON-NLS-1$
            return false;
        }
        if (textEnclosureCombo.getText() == "") { //$NON-NLS-1$
            previewInformationLabel.setText(Messages.getString("FileStep2.textEnclosureAlert")); //$NON-NLS-1$
            return false;
        }
        previewInformationLabel.setText(""); //$NON-NLS-1$
        return true;
    }

    public ProcessDescription getProcessDescription() {

        ProcessDescription processDescription = ShadowProcessHelper.getProcessDescription(getConnection());

        processDescription.setHeaderRow(-1);
        processDescription.setFooterRow(0);
        processDescription.setLimitRows(maximumRowsToPreview);
        processDescription.setSplitRecord(getConnection().isSplitRecord());
        processDescription.setCSVOption(getConnection().isCsvOption());
        // add by wzhang to fix 8039.
        processDescription.setFilepath(PathUtils.getPortablePath(getConnection().getFilePath()));
        String curFilePath = processDescription.getFilepath();
        String orignalPath;
        if (curFilePath != null) {
            orignalPath = multiSchemaManager.getOriginalValue(curFilePath);
            processDescription.setFilepath(orignalPath);
        }
        processDescription
                .setFieldSeparator(multiSchemaManager.getOriginalValue(processDescription.getFieldSeparator()));
        processDescription
                .setRowSeparator(multiSchemaManager.getOriginalValue(processDescription.getRowSeparator()));

        return processDescription;
    }

    public Label getPreviewInformationLabel() {
        return this.previewInformationLabel;
    }

    public ShadowProcessPreview getMultiSchemasFilePreview() {
        return this.multiSchemasFilePreview;
    }

    public CTabFolder getTabFolder() {
        return this.tabFolder;
    }

    public CTabItem getOutputTabItem() {
        return this.outputTabItem;
    }

    public Composite getOutputComposite() {
        return this.outputComposite;
    }

    /**
     * 
     * cLi Comment method "preCheckProcessStart".
     * 
     * for processor
     */
    public boolean preCheckProcessStart() {
        previewBtn.setText(Messages.getString("FileStep2.stop"));

        clearPreview();
        if (!checkFieldsValue()) {
            return false;
        }

        previewInformationLabel.setText(Messages.getString("FileStep2.previewProgress")); //$NON-NLS-1$ 
        return true;
    }

    /**
     * 
     * cLi Comment method "updateUIInThreadIfThreadFinally".
     * 
     * for processor
     */
    public void updateUIInThreadIfThreadFinally() {
        if (!previewBtn.isDisposed()) {
            previewBtn.setText(ExternalMultiSchemasUIProperties.PREVIEW_STRING);
            previewBtn.setEnabled(true);

        }
    }

    /**
     * 
     * cLi Comment method "postProcessCancle".
     * 
     * for processor
     */
    public void postProcessCancle() {
        previewBtn.setEnabled(false);
    }

    public void setFetchButtonStatus(final boolean status) {
        fetchBtn.setEnabled(status);
    }

    public void checkDialog() {
        if (this.listener != null) {
            this.listener.checkPerformed(canFinished());
        }
    }

    boolean isReadOnly() {
        return getMultiSchemaManager().isReadOnly();
    }

    public boolean canFinished() {
        final Object input = schemaTreeViewer.getInput();
        if (input != null && input instanceof SchemasKeyData) {
            return true;
        }
        return false;
    }

    /**
     * 
     * cLi Comment method "saveProperties".
     * 
     * 
     */
    public void saveProperties() {
        TableColumn[] tcs = this.multiSchemasFilePreview.getTable().getColumns();
        int currentIndexIntable = 0;
        for (int i = 0; i < this.multiSchemasFilePreview.getTable().getColumnCount(); i++) {
            if (tcs[i].getImage().equals(ImageProvider.getImage(EImage.CHECKED_ICON))) {
                currentIndexIntable = i;
            }
        }

        final Object input = schemaTreeViewer.getInput();
        if (input != null) {
            getMultiSchemaManager().savePropertiesToComponent((SchemasKeyData) input,
                    fetchNewParamters(currentIndexIntable), currentIndexIntable);
        }
    }

    private Map<EParameterName, String> fetchNewParamters(int index) {
        String empty = "\"\"\"";//$NON-NLS-1$
        Map<EParameterName, String> paramsMap = new HashMap<EParameterName, String>();
        paramsMap.put(EParameterName.FILENAME, fileField.getText());
        paramsMap.put(EParameterName.ENCODING_TYPE, encodingCombo.getText());
        paramsMap.put(EParameterName.ENCODING, TalendTextUtils.addQuotes(encodingCombo.getText()));
        paramsMap.put(EParameterName.FIELDSEPARATOR, fieldSeparatorText.getText());
        paramsMap.put(EParameterName.ROWSEPARATOR, rowSeparatorText.getText());
        String textEnclosure = textEnclosureCombo.getText();
        if (EMPTY_VALUE.equals(textEnclosure)) {
            textEnclosure = empty;
        }
        paramsMap.put(EParameterName.TEXT_ENCLOSURE, textEnclosure);
        String escapeChar = escapeCharCombo.getText();
        if (EMPTY_VALUE.equals(escapeChar)) {
            escapeChar = empty;
        }
        paramsMap.put(EParameterName.ESCAPE_CHAR, escapeChar);
        paramsMap.put(EParameterName.CSV_OPTION, String.valueOf(csvRadio.getSelection()));
        paramsMap.put(EParameterName.COLUMNINDEX, TalendTextUtils.addQuotes(String.valueOf(index)));
        paramsMap.put(EParameterName.USE_MULTISEPARATORS, String.valueOf(useMultiSaparators.getSelection()));
        paramsMap.put(EParameterName.MULTI_SEPARATORS, multiSeparatorsText.getText());
        paramsMap.put(EParameterName.MULTI_KEYVALUES, keyValuesText.getText());
        return paramsMap;
    }

    public void prepareClosing(int dialogResponse) {
        multiSchemaManager.getUIManager().setDialogResponse(dialogResponse);
        if (dialogResponse == SWT.OK) {
            ExternalMultiSchemasUIProperties.setShellMaximized(getShell().getMaximized());
            ExternalMultiSchemasUIProperties.setBoundsMapper(getShell().getBounds());
            ExternalMultiSchemasUIProperties.setAllSashformWeights(this.allContentForm.getWeights());
            ExternalMultiSchemasUIProperties.setHeaderSashformWeights(this.headerSashForm.getWeights());
            ExternalMultiSchemasUIProperties.setSchemaDetailsModel(getSchemaDetailModel());
        }

    }

    private boolean getSchemaDetailModel() {
        if (propertyAction != null) {
            return propertyAction.isChecked();
        }
        return ExternalMultiSchemasUIProperties.isSchemaDetailsModel(); // default
    }

    class SchameDetailsPropertyAction extends Action {

        private final TreeViewer schemaDetailsViewer;

        public SchameDetailsPropertyAction(final TreeViewer schemaDetailsViewer) {
            super("Property model", IAction.AS_RADIO_BUTTON);
            this.schemaDetailsViewer = schemaDetailsViewer;
        }

        @Override
        public void run() {
            if (isChecked()) {
                changeSchemaDetailsView();
            }
        }

    }

    class SchameDetailsColumnAction extends Action {

        private final TreeViewer schemaDetailsViewer;

        public SchameDetailsColumnAction(final TreeViewer schemaDetailsViewer) {
            super("Column model", IAction.AS_RADIO_BUTTON);
            this.schemaDetailsViewer = schemaDetailsViewer;
        }

        @Override
        public void run() {
            if (isChecked()) {
                changeSchemaDetailsView();
            }
        }
    }

    private boolean checkKeyValue(String oldValue, String newValue) {
        String errorMsg = null;
        boolean canModify = true;
        if (!Pattern.matches(SCHEMA_NAME_PATTERN, newValue)) {
            errorMsg = "'" + newValue + "' is invalid value.";
        } else {
            final Object input = schemaTreeViewer.getInput();
            if (input instanceof SchemasKeyData) {
                List<String> list = new ArrayList<String>();
                final List<SchemasKeyData> children = ((SchemasKeyData) input).getChildren();
                for (SchemasKeyData schema : children) {
                    final String name = schema.getUniqueRecord();
                    if (!name.equals(oldValue)) {
                        list.add(name.toUpperCase());
                    }
                }
                if (newValue != null && list.contains(newValue.toUpperCase())) {
                    errorMsg = "'" + newValue + "' already exist.";
                }
            }
        }
        if (errorMsg != null) {
            MessageDialog.openError(schemaTreeViewer.getTree().getShell(), "Invalid value", errorMsg);
            canModify = false;
        }
        return canModify;
    }

    private void changeSchemaDetailsView() {
        final Tree tree = schemaDetailsViewer.getTree();
        for (TreeItem item : tree.getItems()) {
            item.dispose();
        }
        schemaDetailsViewer.setInput(null);

        getUIManager().changeSchemasDetailView(schemaDetailsViewer, getSchemaDetailModel());
        getUIManager().refreshSchemasDetailView(schemaTreeViewer, schemaDetailsViewer, getSchemaDetailModel());
    }

    public LabelledText getKeyIndexText() {
        return this.keyIndexText;
    }

    public void setKeyIndexText(LabelledText keyIndexText) {
        this.keyIndexText = keyIndexText;
    }

    public Button getUseMultiSaparators() {
        return this.useMultiSaparators;
    }

    public void setUseMultiSaparators(Button useMultiSaparators) {
        this.useMultiSaparators = useMultiSaparators;
    }

}