org.talend.designer.dbmap.managers.UIManager.java Source code

Java tutorial

Introduction

Here is the source code for org.talend.designer.dbmap.managers.UIManager.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.dbmap.managers;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.lang.ArrayUtils;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.ToolItem;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.commons.ui.runtime.image.ImageUtils;
import org.talend.commons.ui.runtime.swt.tableviewer.selection.ILineSelectionListener;
import org.talend.commons.ui.runtime.swt.tableviewer.selection.LineSelectionEvent;
import org.talend.commons.ui.swt.tableviewer.IModifiedBeanListener;
import org.talend.commons.ui.swt.tableviewer.ModifiedBeanEvent;
import org.talend.commons.ui.swt.tableviewer.TableViewerCreator;
import org.talend.commons.ui.utils.image.ImageCapture;
import org.talend.commons.utils.data.list.IListenableListListener;
import org.talend.commons.utils.data.list.ListenableListEvent;
import org.talend.commons.utils.data.list.ListenableListEvent.TYPE;
import org.talend.core.model.metadata.IMetadataColumn;
import org.talend.core.model.metadata.IMetadataTable;
import org.talend.core.model.process.IProcess;
import org.talend.core.ui.metadata.editor.AbstractMetadataTableEditorView;
import org.talend.core.ui.metadata.editor.MetadataTableEditor;
import org.talend.core.ui.metadata.editor.MetadataTableEditorView;
import org.talend.core.utils.KeywordsValidator;
import org.talend.designer.abstractmap.managers.AbstractMapperManager;
import org.talend.designer.abstractmap.managers.AbstractUIManager;
import org.talend.designer.abstractmap.model.table.IDataMapTable;
import org.talend.designer.abstractmap.model.tableentry.IColumnEntry;
import org.talend.designer.abstractmap.model.tableentry.ITableEntry;
import org.talend.designer.abstractmap.ui.dnd.DraggingInfosPopup;
import org.talend.designer.abstractmap.ui.listener.DropTargetOperationListener;
import org.talend.designer.abstractmap.ui.visualmap.link.IMapperLink;
import org.talend.designer.abstractmap.ui.visualmap.link.LinkState;
import org.talend.designer.abstractmap.ui.visualmap.link.PointLinkDescriptor;
import org.talend.designer.core.model.components.EParameterName;
import org.talend.designer.dbmap.external.connection.IOConnection;
import org.talend.designer.dbmap.external.data.ExternalDbMapUiProperties;
import org.talend.designer.dbmap.i18n.Messages;
import org.talend.designer.dbmap.language.generation.DbGenerationManager;
import org.talend.designer.dbmap.model.table.AbstractInOutTable;
import org.talend.designer.dbmap.model.table.InputTable;
import org.talend.designer.dbmap.model.table.OutputTable;
import org.talend.designer.dbmap.model.tableentry.AbstractInOutTableEntry;
import org.talend.designer.dbmap.model.tableentry.FilterTableEntry;
import org.talend.designer.dbmap.model.tableentry.InputColumnTableEntry;
import org.talend.designer.dbmap.model.tableentry.OutputColumnTableEntry;
import org.talend.designer.dbmap.model.tableentry.TableEntryLocation;
import org.talend.designer.dbmap.ui.MapperUI;
import org.talend.designer.dbmap.ui.commands.DataMapTableViewSelectedCommand;
import org.talend.designer.dbmap.ui.tabs.TabFolderEditors;
import org.talend.designer.dbmap.ui.visualmap.TableEntryProperties;
import org.talend.designer.dbmap.ui.visualmap.link.Link;
import org.talend.designer.dbmap.ui.visualmap.link.StyleLinkFactory;
import org.talend.designer.dbmap.ui.visualmap.table.DataMapTableView;
import org.talend.designer.dbmap.ui.visualmap.table.EntryState;
import org.talend.designer.dbmap.ui.visualmap.table.InputDataMapTableView;
import org.talend.designer.dbmap.ui.visualmap.table.OutputDataMapTableView;
import org.talend.designer.dbmap.ui.visualmap.zone.InputsZone;
import org.talend.designer.dbmap.ui.visualmap.zone.OutputsZone;
import org.talend.designer.dbmap.ui.visualmap.zone.Zone;
import org.talend.designer.dbmap.ui.visualmap.zone.scrollable.TablesZoneView;
import org.talend.designer.dbmap.ui.visualmap.zone.toolbar.ToolbarInputZone;
import org.talend.designer.dbmap.ui.visualmap.zone.toolbar.ToolbarOutputZone;
import org.talend.designer.dbmap.ui.visualmap.zone.toolbar.ToolbarZone;
import org.talend.designer.dbmap.utils.DataMapExpressionParser;
import org.talend.designer.dbmap.utils.ParseExpressionResult;

/**
 * DOC amaumont class global comment. Detailled comment <br/>
 * 
 * $Id: UIManager.java 2077 2007-02-15 11:16:46Z amaumont $
 * 
 */
public class UIManager extends AbstractUIManager {

    private MapperManager mapperManager;

    private MapperUI mapperUI;

    private Composite refComposite;

    private int mapperResponse = SWT.NONE;

    private TableManager tableManager;

    private ILineSelectionListener inputsSelectionChangedListener;

    private ILineSelectionListener outputsSelectionChangedListener;

    private List<IColumnEntry> lastCreatedInOutColumnEntries = new ArrayList<IColumnEntry>();

    private ExternalDbMapUiProperties uiProperties;

    private OutputDataMapTableView currentSelectedOutputTableView;

    private InputDataMapTableView currentSelectedInputTableView;

    private Zone previousSelectedZone;

    private boolean previousSelectedTableIsConstraint;

    private DisposeListener commonMetadataDisposeListener;

    private StyleLinkFactory drawableLinkFactory;

    private IModifiedBeanListener<IMetadataColumn> inputModifiedBeanListener;

    private IModifiedBeanListener<IMetadataColumn> outputModifiedBeanListener;

    /**
     * DOC amaumont UIManager constructor comment.
     * 
     * @param tableManager
     * @param manager
     */
    public UIManager(MapperManager mapperManager, TableManager tableManager) {
        super();
        this.mapperManager = mapperManager;
        this.tableManager = tableManager;
    }

    /**
     * Select a table view.
     * 
     * @param dataMapTableView
     * @param useNewCommand
     * @param selectAllEntries TODO
     */
    public void selectDataMapTableView(final DataMapTableView dataMapTableView, boolean useNewCommand,
            boolean selectAllEntries) {

        TabFolderEditors tabFolderEditors = mapperUI.getTabFolderEditors();
        // tabFolderEditors.setSelection(TabFolderEditors.INDEX_TAB_METADATA_EDITOR);
        MetadataTableEditorView metadataTableEditorView = null;
        MetadataTableEditorView otherMetadataTableEditorView = null;
        final Zone currentZone = dataMapTableView.getZone();

        List<? extends IDataMapTable> tables = null;

        DataMapTableView previousSelectedTableView = null;
        DataMapTableView newSelectedTableView = null;

        if (currentZone == Zone.INPUTS) {
            metadataTableEditorView = tabFolderEditors.getInputMetaEditor();
            otherMetadataTableEditorView = tabFolderEditors.getOutputMetaEditor();
            tables = mapperManager.getInputTables();
            previousSelectedTableView = this.currentSelectedInputTableView;
            setCurrentSelectedInputTableView((InputDataMapTableView) dataMapTableView);
            newSelectedTableView = dataMapTableView;
        } else if (currentZone == Zone.OUTPUTS) {
            metadataTableEditorView = tabFolderEditors.getOutputMetaEditor();
            otherMetadataTableEditorView = tabFolderEditors.getInputMetaEditor();
            tables = mapperManager.getOutputTables();
            previousSelectedTableView = this.currentSelectedOutputTableView;
            newSelectedTableView = dataMapTableView;
            setCurrentSelectedOutputTableView((OutputDataMapTableView) dataMapTableView);
        }

        updateToolbarButtonsStates(currentZone);

        final AbstractInOutTable abstractDataMapTable = (AbstractInOutTable) mapperManager
                .retrieveIDataMapTable(dataMapTableView);
        MetadataTableEditor currentMetadataTableEditor = metadataTableEditorView.getMetadataTableEditor();
        final TableViewerCreator dataMapTVCreator = dataMapTableView.getTableViewerCreatorForColumns();
        final TableViewer dataMapTableViewer = dataMapTableView.getTableViewerCreatorForColumns().getTableViewer();
        if (currentMetadataTableEditor == null
                || currentMetadataTableEditor != null && newSelectedTableView != previousSelectedTableView) {

            if (useNewCommand) {
                DataMapTableViewSelectedCommand command = new DataMapTableViewSelectedCommand(this,
                        previousSelectedTableView, dataMapTableView);
                mapperManager.executeCommand(command);
            }

            currentMetadataTableEditor = new MetadataTableEditor(abstractDataMapTable.getMetadataTable(),
                    abstractDataMapTable.getTitle());

            currentMetadataTableEditor.setModifiedBeanListenable(metadataTableEditorView.getTableViewerCreator());

            final MetadataTableEditorView metadataTableEditorViewFinal = metadataTableEditorView;
            final TableViewerCreator metadataTVCreator = metadataTableEditorViewFinal.getTableViewerCreator();
            final MetadataTableEditor metadataTableEditor = currentMetadataTableEditor;

            modifySelectionChangedListener(currentZone, metadataTableEditorViewFinal, metadataTVCreator,
                    metadataTableEditor, dataMapTableView, previousSelectedTableView);

            // init actions listeners for list which contains metadata
            metadataTableEditor.addAfterOperationListListener(new IListenableListListener() {

                /**
                 * DOC acer Comment method "handleEvent".
                 * 
                 * @param event
                 */
                @Override
                public void handleEvent(ListenableListEvent event) {

                    DataMapTableView view = mapperManager.retrieveIDataMapTableView(abstractDataMapTable);
                    if (event.type == TYPE.ADDED) {
                        // metadataEditorTableViewer.refresh();
                        List<IMetadataColumn> metadataColumns = (List<IMetadataColumn>) event.addedObjects;

                        lastCreatedInOutColumnEntries.clear();
                        if (event.index != null) {
                            int index = event.index;
                            for (IMetadataColumn metadataColumn : metadataColumns) {
                                lastCreatedInOutColumnEntries.add(
                                        mapperManager.addNewColumnEntry(dataMapTableView, metadataColumn, index++));
                            }
                        } else if (event.indicesTarget != null) {
                            List<Integer> indicesTarget = event.indicesTarget;
                            int lstSize = indicesTarget.size();
                            for (int i = 0; i < lstSize; i++) {
                                Integer indice = indicesTarget.get(i);
                                IMetadataColumn metadataColumn = metadataColumns.get(i);
                                lastCreatedInOutColumnEntries.add(
                                        mapperManager.addNewColumnEntry(dataMapTableView, metadataColumn, indice));
                            }

                        } else {
                            throw new IllegalStateException(Messages.getString("UIManager.1")); //$NON-NLS-1$
                        }
                        refreshBackground(false, false);
                        if (event.index != null) {
                            dataMapTableView.changeSize(view.getPreferredSize(true, false, false), true, true);
                            dataMapTableViewer.refresh();
                            dataMapTVCreator.getSelectionHelper().setSelection(event.index);
                        } else if (event.indicesTarget != null) {
                            dataMapTableViewer.refresh();
                            dataMapTableView.changeSize(view.getPreferredSize(false, true, false), true, true);
                            int[] selection = ArrayUtils
                                    .toPrimitive((Integer[]) event.indicesTarget.toArray(new Integer[0]));
                            dataMapTVCreator.getSelectionHelper().setSelection(selection);
                        }
                        mapperManager.getProblemsManager().checkProblemsForAllEntriesOfAllTables(true);
                    }

                    if (event.type == TYPE.REMOVED) {
                        // metadataEditorTableViewer.refresh();
                        List<IMetadataColumn> metadataColumns = (List<IMetadataColumn>) event.removedObjects;
                        for (IMetadataColumn metadataColumn : metadataColumns) {
                            ITableEntry metadataTableEntry = mapperManager
                                    .retrieveTableEntry(new TableEntryLocation(abstractDataMapTable.getName(),
                                            metadataColumn.getLabel()));
                            mapperManager.removeTableEntry(metadataTableEntry);
                        }
                        dataMapTableViewer.refresh();
                        dataMapTableView.resizeAtExpandedSize();
                        resizeTablesZoneViewAtComputedSize(dataMapTableView.getZone());
                        moveScrollBarZoneAtSelectedTable(dataMapTableView.getZone());
                        refreshBackground(true, false);
                        mapperManager.getProblemsManager().checkProblemsForAllEntriesOfAllTables(true);
                    }

                    if (event.type == TYPE.SWAPED) {
                        List<Integer> listIndexTarget = event.indicesTarget;
                        abstractDataMapTable.swapColumnElements(event.indicesOrigin, listIndexTarget);
                        // dataMapTableViewer.refresh();
                        refreshBackground(true, false);
                    }

                }

            });
            metadataTableEditorView.getTableViewerCreator().getSelectionHelper()
                    .setActiveFireSelectionChanged(false);
            metadataTableEditorView.setMetadataTableEditor(metadataTableEditor);
            metadataTableEditorView.getTableViewerCreator().getSelectionHelper()
                    .setActiveFireSelectionChanged(true);
            metadataTableEditorView.getExtendedToolbar().updateEnabledStateOfButtons();

            dataMapTVCreator.getSelectionHelper().setActiveFireSelectionChanged(false);
            metadataTableEditorView.getTableViewerCreator().getSelectionHelper()
                    .setSelection(dataMapTableViewer.getTable().getSelectionIndices());
            dataMapTVCreator.getSelectionHelper().setActiveFireSelectionChanged(true);

            // disable highlight for other DataMapTableView and highlight selected DataMapTableView
            for (IDataMapTable table : tables) {
                DataMapTableView otherDataMapTableView = mapperManager.retrieveIDataMapTableView(table);
                otherDataMapTableView
                        .setBackground(dataMapTableView.getDisplay().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
            }
            dataMapTableView.setBackground(dataMapTableView.getDisplay().getSystemColor(SWT.COLOR_YELLOW));
        }

        if (selectAllEntries) {
            dataMapTVCreator.getTable().selectAll();
            selectAllLinks(dataMapTableView);
            metadataTableEditorView.getTableViewerCreator().getTable().selectAll();
            metadataTableEditorView.getToolBar().updateEnabledStateOfButtons();
            if (currentZone == Zone.OUTPUTS) {
                dataMapTableView.getTableViewerCreatorForWhereFilters().getTable().selectAll();
                dataMapTableView.getTableViewerCreatorForOtherFilters().getTable().selectAll();
            }
        }

        if (otherMetadataTableEditorView != null) {
            otherMetadataTableEditorView.getExtendedToolbar().updateEnabledStateOfButtons();
        }

    }

    /**
     * DOC amaumont Comment method "updateToolbarButtonsStates".
     * 
     * @param currentZone
     */
    public void updateToolbarButtonsStates(Zone currentZone) {
        ToolbarZone toolbar = null;
        if (currentZone == Zone.INPUTS) {
            toolbar = getInputsZone().getToolbar();
            ((ToolbarInputZone) toolbar).setEnabledRemoveAliasButton(currentSelectedInputTableView != null);
            toolbar.setEnabledMinimizeTablesButton(getInputsTablesView().size() > 0);
        } else if (currentZone == Zone.OUTPUTS) {
            toolbar = getOutputsZone().getToolbar();
            ((ToolbarOutputZone) toolbar).setEnabledRemoveTableButton(currentSelectedOutputTableView != null);
            toolbar.setEnabledMinimizeTablesButton(getOutputsTablesView().size() > 0);
        }
        toolbar.setEnabledMoveTableButton(true, isTableViewMoveable(currentZone, true));
        toolbar.setEnabledMoveTableButton(false, isTableViewMoveable(currentZone, false));
    }

    private void modifySelectionChangedListener(final Zone currentZone,
            final MetadataTableEditorView metadataTableEditorViewFinal, final TableViewerCreator metadataTVCreator,
            final MetadataTableEditor metadataTableEditor, final DataMapTableView dataMapTableView,
            DataMapTableView previousSelectedTableView) {

        final TableViewer tableViewer = dataMapTableView.getTableViewerCreatorForColumns().getTableViewer();

        IModifiedBeanListener<IMetadataColumn> modifiedBeanListener = new IModifiedBeanListener<IMetadataColumn>() {

            @Override
            public void handleEvent(ModifiedBeanEvent<IMetadataColumn> event) {
                if (AbstractMetadataTableEditorView.ID_COLUMN_NAME.equals(event.column.getId())
                        && !event.previousValue.equals(event.newValue)) {
                    IMetadataColumn modifiedObject = event.bean;
                    if (modifiedObject != null) {
                        TableEntryLocation tableEntryLocation = new TableEntryLocation(
                                dataMapTableView.getDataMapTable().getName(), (String) event.previousValue);
                        final ITableEntry dataMapTableEntry = mapperManager.retrieveTableEntry(tableEntryLocation);
                        processColumnNameChanged((String) event.previousValue, (String) event.newValue,
                                dataMapTableView, dataMapTableEntry, false);
                    }
                    // dataMapTableViewer.refresh(event.bean, true);
                    tableViewer.refresh(true);
                    mapperManager.getProblemsManager().checkProblemsForAllEntriesOfAllTables(true);
                } else if (AbstractMetadataTableEditorView.ID_COLUMN_KEY.equals(event.column.getId())) {
                    tableViewer.refresh(true);
                    IColumnEntry entry = dataMapTableView.getDataMapTable().getColumnEntries().get(event.index);
                    parseExpression(entry.getExpression(), entry, false, false, false);
                } else if (AbstractMetadataTableEditorView.ID_COLUMN_TYPE.equals(event.column.getId())
                        || AbstractMetadataTableEditorView.ID_COLUMN_NULLABLE.equals(event.column.getId())) {
                    mapperManager.getProblemsManager().checkProblemsForAllEntriesOfAllTables(true);
                }
            }

        };

        ILineSelectionListener metadataEditorViewerSelectionChangedListener = new ILineSelectionListener() {

            @Override
            public void handle(LineSelectionEvent e) {
                // System.out.println("LineSelectionEvent");

                if (metadataTableEditorViewFinal.getTableViewerCreator() == e.source) {
                    if (metadataTableEditorViewFinal.getExtendedTableViewer().isExecuteSelectionEvent()) {
                        mapperManager.getUiManager().selectLinkedTableEntries(
                                metadataTableEditor.getMetadataTable(),
                                metadataTVCreator.getTable().getSelectionIndices());
                    }
                } else {
                    // if (dataMapTableView.getExtendedTableViewerForColumns().isExecuteSelectionEvent()) {
                    // int[] selectionIndices =
                    // dataMapTableView.getTableViewerCreatorForColumns().getTable().getSelectionIndices();
                    // mapperManager.getUiManager().selectLinkedMetadataEditorEntries(dataMapTableView,
                    // selectionIndices);
                    // }

                }
            }

        };

        // ISelectionChangedListener previousSelectionChangedListener = null;
        ILineSelectionListener previousSelectionChangedListener = null;
        IModifiedBeanListener<IMetadataColumn> previousModifiedBeanListener = null;
        if (currentZone == Zone.INPUTS) {
            previousSelectionChangedListener = inputsSelectionChangedListener;
            previousModifiedBeanListener = inputModifiedBeanListener;
        } else if (currentZone == Zone.OUTPUTS) {
            previousSelectionChangedListener = outputsSelectionChangedListener;
            previousModifiedBeanListener = outputModifiedBeanListener;
        }
        if (previousSelectionChangedListener != null) {
            // metadataTVCreator.removeSelectionChangedListener(previousSelectionChangedListener);
            metadataTVCreator.getSelectionHelper().removeAfterSelectionListener(previousSelectionChangedListener);
            if (previousSelectedTableView != null) {
                previousSelectedTableView.getTableViewerCreatorForColumns().getSelectionHelper()
                        .removeAfterSelectionListener(previousSelectionChangedListener);
            }
        }

        if (previousModifiedBeanListener != null) {
            metadataTableEditor.removeModifiedBeanListener(previousModifiedBeanListener);
        }

        if (currentZone == Zone.INPUTS) {
            inputsSelectionChangedListener = metadataEditorViewerSelectionChangedListener;
            inputModifiedBeanListener = modifiedBeanListener;
        } else if (currentZone == Zone.OUTPUTS) {
            outputsSelectionChangedListener = metadataEditorViewerSelectionChangedListener;
            outputModifiedBeanListener = modifiedBeanListener;
        }
        // metadataTVCreator.addSelectionChangedListener(metadataEditorViewerSelectionChangedListener);
        metadataTVCreator.getSelectionHelper()
                .addAfterSelectionListener(metadataEditorViewerSelectionChangedListener);
        dataMapTableView.getTableViewerCreatorForColumns().getSelectionHelper()
                .addAfterSelectionListener(metadataEditorViewerSelectionChangedListener);
        metadataTableEditor.addModifiedBeanListener(modifiedBeanListener);

        if (this.commonMetadataDisposeListener == null) {
            this.commonMetadataDisposeListener = new DisposeListener() {

                @Override
                public void widgetDisposed(DisposeEvent e) {
                    if (inputsSelectionChangedListener != null) {
                        getMetadataEditorView(Zone.INPUTS).getTableViewerCreator().getSelectionHelper()
                                .removeAfterSelectionListener(inputsSelectionChangedListener);
                    }
                    if (outputsSelectionChangedListener != null) {
                        getMetadataEditorView(Zone.OUTPUTS).getTableViewerCreator().getSelectionHelper()
                                .removeAfterSelectionListener(outputsSelectionChangedListener);
                    }
                    if (inputModifiedBeanListener != null) {
                        MetadataTableEditor metadataTableEditor = getMetadataEditorView(Zone.INPUTS)
                                .getMetadataTableEditor();
                        if (metadataTableEditor != null) {
                            metadataTableEditor.removeModifiedBeanListener(inputModifiedBeanListener);
                        }
                    }
                    if (outputModifiedBeanListener != null) {
                        MetadataTableEditor metadataTableEditor = getMetadataEditorView(Zone.OUTPUTS)
                                .getMetadataTableEditor();
                        if (metadataTableEditor != null) {
                            metadataTableEditor.removeModifiedBeanListener(outputModifiedBeanListener);
                        }
                    }
                }
            };
            metadataTVCreator.getTable().addDisposeListener(this.commonMetadataDisposeListener);
        }

    }

    public void setMapperUI(MapperUI mapperUI) {
        this.mapperUI = mapperUI;
    }

    /**
     * DOC amaumont Comment method "refreshBackground".
     * 
     * @param firstExecutionAfterTime
     */
    @Override
    public void refreshBackground(boolean forceRecalculate, boolean firstExecutionAfterTime) {
        if (forceRecalculate) {
            mapperUI.getBackgroundRefreshLimiterForceRecalculate().startIfExecutable(firstExecutionAfterTime, null);
        } else {
            mapperUI.getBackgroundRefreshLimiter().startIfExecutable(firstExecutionAfterTime, null);
        }
    }

    /**
     * DOC amaumont Comment method "refreshBackground".
     */
    public void refreshBackground(boolean forceRecalculate, int timeBeforeNewRefresh, boolean executeAfterTime) {
        if (forceRecalculate) {
            mapperUI.getBackgroundRefreshLimiterForceRecalculate().setTimeBeforeNewExecution(timeBeforeNewRefresh);
        } else {
            mapperUI.getBackgroundRefreshLimiter().setTimeBeforeNewExecution(timeBeforeNewRefresh);
        }
        refreshBackground(forceRecalculate, executeAfterTime);
    }

    public Composite getReferenceComposite() {
        if (this.refComposite == null) {
            this.refComposite = mapperUI.getVisualMapReferenceComposite();
        }
        return this.refComposite;
    }

    public int getVerticalScrolledOffsetBar(Zone zone) {
        switch (zone) {
        case INPUTS:
            return -mapperUI.getScollbarSelectionZoneInputs();

        case OUTPUTS:
            return -mapperUI.getScollbarSelectionZoneOutputs();

        default:
            throw new RuntimeException(
                    Messages.getString("UIManager.2") + zone + Messages.getString("UIManager.3")); //$NON-NLS-1$ //$NON-NLS-2$
        }
    }

    public ScrollBar getVerticalScrollBar(Zone zone) {
        switch (zone) {
        case INPUTS:
            return mapperUI.getScollbarZoneInputs();
        case OUTPUTS:
            return mapperUI.getScollbarZoneOutputs();

        default:
            throw new RuntimeException("The zone " + zone + " does'nt exist !"); //$NON-NLS-1$ //$NON-NLS-2$
        }
    }

    /**
     * DOC amaumont Comment method "setDialogResponse".
     * 
     * @param ok
     */
    public void setMapperResponse(int mapperResponse) {
        this.mapperResponse = mapperResponse;
    }

    public int getMapperResponse() {
        return this.mapperResponse;
    }

    /**
     * DOC amaumont Comment method "closeMapperDialog".
     * 
     * @param ok
     */
    public void closeMapper(int response) {
        setMapperResponse(response);
        Composite parent = mapperUI.getMapperUIParent();
        saveCurrentUIProperties();

        if (response == SWT.OK) {
            createVisualMapImage();
        }

        mapperManager.updateEmfParameters(EParameterName.PREVIEW.getName());

        if (parent instanceof Shell) {
            ((Shell) parent).close();
        }
    }

    /**
     * DOC amaumont Comment method "createVisualMapImage".
     */
    private void createVisualMapImage() {
        String previewFilePath = mapperManager.getPreviewFilePath();
        if (previewFilePath != null) {
            Image image = ImageCapture.capture(mapperUI.getDatasFlowViewSashForm());
            image = ImageUtils.scale(image, 50);
            ImageUtils.save(image, previewFilePath, SWT.IMAGE_BMP);
        }
    }

    /**
     * DOC amaumont Comment method "saveUiProperties".
     */
    private void saveCurrentUIProperties() {
        uiProperties = new ExternalDbMapUiProperties();
        uiProperties.setWeightsMainSashForm(mapperUI.getMainSashForm().getWeights());
        uiProperties.setWeightsDatasFlowViewSashForm(mapperUI.getDatasFlowViewSashForm().getWeights());
        uiProperties.setShellMaximized(getMapperContainer().getShell().getMaximized());
        if (!uiProperties.isShellMaximized()) {
            uiProperties.setBoundsMapper(getMapperContainer().getBounds());
        }
    }

    /**
     * DOC amaumont Comment method "selectTableEntries".
     * 
     * @param metadataTable
     * @param selectedTableEntries
     * @param selectionIndices
     */
    public void selectLinkedTableEntries(IMetadataTable metadataTable, int[] selectionIndices) {
        DataMapTableView dataMapTableView = tableManager.getView(metadataTable);

        if (dataMapTableView == null) {
            return;
        }

        dataMapTableView.setTableSelection(selectionIndices);

        List<ITableEntry> list = extractSelectedTableEntries(
                dataMapTableView.getTableViewerCreatorForColumns().getTableViewer().getSelection());
        selectLinks(dataMapTableView, list, false, false);
    }

    /**
     * DOC amaumont Comment method "selectTableEntries".
     * 
     * @param view
     * @param selectedTableEntries
     * @param selectionIndices
     */
    public void selectLinkedMetadataEditorEntries(DataMapTableView view, int[] selectionIndices) {
        MetadataTableEditorView metadataTableEditorView = null;
        MetadataTableEditorView otherMetadataTableEditorView = null;
        if (view.getZone() == Zone.INPUTS) {
            metadataTableEditorView = getInputMetaEditorView();
            otherMetadataTableEditorView = getOutputMetaEditorView();
        } else if (view.getZone() == Zone.OUTPUTS) {
            metadataTableEditorView = getOutputMetaEditorView();
            otherMetadataTableEditorView = getInputMetaEditorView();
        }
        if (metadataTableEditorView != null) {
            metadataTableEditorView.getTableViewerCreator().getSelectionHelper()
                    .setActiveFireSelectionChanged(false);
            metadataTableEditorView.getExtendedTableViewer().getTableViewerCreator().getSelectionHelper()
                    .setSelection(selectionIndices);
            metadataTableEditorView.getTableViewerCreator().getSelectionHelper()
                    .setActiveFireSelectionChanged(true);
            metadataTableEditorView.getExtendedToolbar().updateEnabledStateOfButtons();

        }
        if (otherMetadataTableEditorView != null) {
            otherMetadataTableEditorView.getExtendedToolbar().updateEnabledStateOfButtons();
        }
    }

    public void selectAllLinks(DataMapTableView dataMapTableView) {
        selectLinks(dataMapTableView, null, false, false);
    }

    /**
     * Highlight links and linked cells which have are referenced by the selected items.
     * 
     * @param dataMapTableView
     * @param selectedMetadataTableEntries, source or targets entries which must be highlighted, can be null to select
     * all links of a same DataMapTableView
     * @param isFilterTableSelected TODO
     * @param forceResetHighlightLinksForOtherTables TODO
     */
    @SuppressWarnings("unchecked")
    public void selectLinks(DataMapTableView dataMapTableView, List<ITableEntry> selectedMetadataTableEntries,
            boolean isFilterTableSelected, boolean forceResetHighlightLinksForOtherTables) {

        boolean selectColumnAndFiltersLinks = (selectedMetadataTableEntries == null);

        UIManager uiManager = mapperManager.getUiManager();
        TableViewerCreator<ITableEntry> currentTableViewer = null;
        TableViewerCreator<ITableEntry> whereFilterCreator = null;
        TableViewerCreator<ITableEntry> otherFilterCreator = null;

        if (isFilterTableSelected) {
            currentTableViewer = dataMapTableView.getTableViewerCreatorForWhereFilters();
        } else {
            currentTableViewer = dataMapTableView.getTableViewerCreatorForColumns();
        }

        // Color selectedColor = dataMapTableView.getDisplay().getSystemColor(SWT.COLOR_YELLOW);
        Color unselectedColor = dataMapTableView.getDisplay().getSystemColor(SWT.COLOR_WHITE);

        Zone currentZone = dataMapTableView.getZone();

        Set<ITableEntry> hashSelectedMetadataTableEntries = new HashSet<ITableEntry>();
        if (selectColumnAndFiltersLinks) {
            hashSelectedMetadataTableEntries
                    .addAll(dataMapTableView.getTableViewerCreatorForColumns().getInputList());
            if (currentZone == Zone.OUTPUTS) {
                hashSelectedMetadataTableEntries
                        .addAll(dataMapTableView.getTableViewerCreatorForWhereFilters().getInputList());
                hashSelectedMetadataTableEntries
                        .addAll(dataMapTableView.getTableViewerCreatorForOtherFilters().getInputList());
            }
        } else {
            hashSelectedMetadataTableEntries.addAll(selectedMetadataTableEntries);
        }

        // ////////////////////////////////////////////////////////////////////////
        // Unselect all links and tableEntries if Ctrl or Shift keys are not pressed or if zone different of last
        // selection
        boolean zoneHasChanged = previousSelectedZone == Zone.INPUTS && currentZone == Zone.OUTPUTS
                || currentZone == Zone.INPUTS && previousSelectedZone == Zone.OUTPUTS;
        boolean tableTypeHasChanged = previousSelectedTableIsConstraint != isFilterTableSelected
                && currentZone == Zone.OUTPUTS;
        boolean resetHighlightObjectsForOtherTables = !uiManager.isDragging()
                && (!uiManager.isCtrlPressed() && !uiManager.isShiftPressed() || zoneHasChanged);
        if (resetHighlightObjectsForOtherTables || forceResetHighlightLinksForOtherTables) {
            for (IMapperLink link : mapperManager.getLinks()) {
                if (!hashSelectedMetadataTableEntries.contains(link.getPointLinkDescriptor1().getTableEntry())
                        && !hashSelectedMetadataTableEntries
                                .contains(link.getPointLinkDescriptor2().getTableEntry())) {
                    link.setState(LinkState.UNSELECTED);
                    ITableEntry sourceITableEntry = link.getPointLinkDescriptor1().getTableEntry();
                    TableItem tableItem = mapperManager.retrieveTableItem(sourceITableEntry);
                    tableItem.setBackground(unselectedColor);
                    ITableEntry targetITableEntry = link.getPointLinkDescriptor2().getTableEntry();
                    tableItem = mapperManager.retrieveTableItem(targetITableEntry);
                    tableItem.setBackground(unselectedColor);
                }
            }

            if (currentZone == Zone.INPUTS) {
                unselectAllOutputMetaDataEntries();
            } else if (currentZone == Zone.OUTPUTS) {
                unselectAllInputMetaDataEntries();
            }

            Collection<DataMapTableView> tablesToDeselectEntries = mapperManager.getTablesView();
            for (DataMapTableView viewToDeselectEntries : tablesToDeselectEntries) {
                if (viewToDeselectEntries != dataMapTableView) {
                    viewToDeselectEntries.unselectAllEntries();
                } else if (viewToDeselectEntries == dataMapTableView && tableTypeHasChanged) {
                    if (isFilterTableSelected) {
                        viewToDeselectEntries.unselectAllColumnEntries();
                    } else {
                        viewToDeselectEntries.unselectAllConstraintEntries();
                    }
                }
            }
        }
        // ////////////////////////////////////////////////////////////////////////

        // ////////////////////////////////////////////////////////////////////////
        // Select or unselect links and tableEntries
        List<ITableEntry> allEntriesOfCurrentTableView = new ArrayList<ITableEntry>();
        if (currentTableViewer != null) {
            allEntriesOfCurrentTableView.addAll(currentTableViewer.getInputList());
            if (selectColumnAndFiltersLinks && currentZone == Zone.OUTPUTS) {
                allEntriesOfCurrentTableView
                        .addAll(dataMapTableView.getTableViewerCreatorForWhereFilters().getInputList());
                allEntriesOfCurrentTableView
                        .addAll(dataMapTableView.getTableViewerCreatorForOtherFilters().getInputList());
            }
        }
        int lstSize = allEntriesOfCurrentTableView.size();
        Set<IMapperLink> linksAlreadySelected = new HashSet<IMapperLink>();
        for (int i = 0; i < lstSize; i++) {
            ITableEntry entry = allEntriesOfCurrentTableView.get(i);
            Set<IMapperLink> linksFromSource = mapperManager.getGraphicalLinksFromSource(entry);
            Set<IMapperLink> linksFromTarget = mapperManager.getGraphicalLinksFromTarget(entry);
            LinkState linkState = null;
            if (hashSelectedMetadataTableEntries.contains(entry)) {
                linkState = LinkState.SELECTED;
            } else {
                linkState = LinkState.UNSELECTED;
            }
            for (IMapperLink link : linksFromSource) {
                ITableEntry targetITableEntry = link.getPointLinkDescriptor2().getTableEntry();
                if (linkState == LinkState.SELECTED
                        || !linksAlreadySelected.contains(link) && linkState == LinkState.UNSELECTED) {
                    link.setState(linkState);
                    if (linkState == LinkState.SELECTED) {
                        linksAlreadySelected.add(link);
                    }
                }
                EntryState entryState = (link.getState() == LinkState.SELECTED ? EntryState.HIGHLIGHT
                        : EntryState.NONE);
                setEntryState(mapperManager, entryState, targetITableEntry);
            }
            for (IMapperLink link : linksFromTarget) {
                ITableEntry sourceITableEntry = link.getPointLinkDescriptor1().getTableEntry();
                if (linkState == LinkState.SELECTED
                        || !linksAlreadySelected.contains(link) && linkState == LinkState.UNSELECTED) {
                    link.setState(linkState);
                    if (linkState == LinkState.SELECTED) {
                        linksAlreadySelected.add(link);
                    }
                }
                EntryState entryState = (link.getState() == LinkState.SELECTED ? EntryState.HIGHLIGHT
                        : EntryState.NONE);
                setEntryState(mapperManager, entryState, sourceITableEntry);
            }
        }
        // ////////////////////////////////////////////////////////////////////////

        // order links to place selected links at last position (last drawn)
        mapperManager.orderLinks();

        uiManager.refreshBackground(false, false);

        previousSelectedZone = dataMapTableView.getZone();
        previousSelectedTableIsConstraint = isFilterTableSelected;
    }

    public void unselectAllInputMetaDataEntries() {
        getInputMetaEditorView().getTable().deselectAll();
    }

    public void unselectAllOutputMetaDataEntries() {
        getOutputMetaEditorView().getTable().deselectAll();
    }

    public void setEntryState(MapperManager pMapperManager, EntryState entryState, ITableEntry entry) {
        TableItem tableItem = pMapperManager.retrieveTableItem(entry);
        tableItem.setBackground(entryState.getColor());
    }

    /**
     * DOC amaumont Comment method "extractTableEntries".
     * 
     * @param selection
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<ITableEntry> extractSelectedTableEntries(ISelection selection) {
        StructuredSelection currentSelection = (StructuredSelection) selection;
        return currentSelection.toList();
    }

    /**
     * DOC amaumont Comment method "getTableEntryPosition".
     * 
     * @param manager TODO
     * @param tableEntry
     * @param forceRecalculate TODO
     * @return
     */
    public Point getTableEntryPosition(ITableEntry tableEntry, boolean forceRecalculate) {
        TableEntryProperties tableEntryProperties = mapperManager.getTableEntryProperties(tableEntry);
        Point returnedPoint = tableEntryProperties.position;
        if (forceRecalculate || returnedPoint == null) {
            TableItem tableItem = mapperManager.retrieveTableItem(tableEntry);
            DataMapTableView dataMapTableView = mapperManager.retrieveDataMapTableView(tableEntry);
            Rectangle tableViewBounds = dataMapTableView.getBounds();
            Table table = tableItem.getParent();
            Rectangle boundsTableItem = tableItem.getBounds(1);// FIX for issue 1225 ("1" parameter added)

            int x = 0;
            int y = boundsTableItem.y + table.getItemHeight() / 2 + dataMapTableView.getBorderWidth();
            if (y < 0) {
                y = 0;
            }

            Point point = new Point(x, y);

            Display display = dataMapTableView.getDisplay();
            Point pointFromTableViewOrigin = display.map(tableItem.getParent(), dataMapTableView, point);

            if (pointFromTableViewOrigin.y > tableViewBounds.height - TableEntriesManager.HEIGHT_REACTION) {
                pointFromTableViewOrigin.y = tableViewBounds.height - TableEntriesManager.HEIGHT_REACTION;
            }

            returnedPoint = convertPointToReferenceOrigin(getReferenceComposite(), pointFromTableViewOrigin,
                    dataMapTableView);
            tableEntryProperties.position = returnedPoint;
        }
        return returnedPoint;
    }

    public Point convertPointToReferenceOrigin(final Composite referenceComposite, Point point, Composite child) {
        Point returnedPoint = new Point(point.x, point.y);
        while (child != referenceComposite) {
            Rectangle bounds = child.getBounds();
            child = child.getParent();
            ScrollBar vScrollBar = child.getVerticalBar();
            if (vScrollBar != null) {
                returnedPoint.y += vScrollBar.getSelection();
            }
            returnedPoint.x += bounds.x;
            returnedPoint.y += bounds.y;
        }
        return returnedPoint;
    }

    public MetadataTableEditorView getInputMetaEditorView() {
        return mapperUI.getTabFolderEditors().getInputMetaEditor();
    }

    public MetadataTableEditorView getOutputMetaEditorView() {
        return mapperUI.getTabFolderEditors().getOutputMetaEditor();
    }

    /**
     * DOC amaumont Comment method "processNewExpression".
     * 
     * @param appliedOrCanceled TODO
     * @param text
     * @param newSelectedDataMapTableView
     * @param currentModifiedObject
     */
    public void parseNewExpression(String expression, ITableEntry currentModifiedITableEntry,
            boolean appliedOrCanceled) {
        ParseExpressionResult result = parseExpression(expression, currentModifiedITableEntry, true, true,
                appliedOrCanceled);
        if (result.isAtLeastOneLinkHasBeenAddedOrRemoved()) {
            mapperManager.getUiManager().refreshBackground(false, false);
        }

    }

    /**
     * DOC amaumont Comment method "processAllExpressions".
     */
    @SuppressWarnings("unchecked")
    public void parseAllExpressionsForAllTables() {
        List<DataMapTableView> tablesView = tableManager.getInputsTablesView();
        tablesView.addAll(tableManager.getVarsTablesView());
        tablesView.addAll(tableManager.getOutputsTablesView());
        for (DataMapTableView view : tablesView) {
            parseAllExpressions(view, false);
        }
    }

    /**
     * DOC amaumont Comment method "processAllExpressions".
     * 
     * @param newLinksMustHaveSelectedState TODO
     */
    @SuppressWarnings("unchecked")
    public void parseAllExpressions(DataMapTableView dataMapTableView, boolean newLinksMustHaveSelectedState) {
        List<IColumnEntry> columnsEntriesList = dataMapTableView.getDataMapTable().getColumnEntries();
        parseAllExpressions(columnsEntriesList, newLinksMustHaveSelectedState);
        if (dataMapTableView.getZone() == Zone.OUTPUTS) {
            List<ITableEntry> constraintEntriesList = dataMapTableView.getTableViewerCreatorForWhereFilters()
                    .getInputList();
            parseAllExpressions(constraintEntriesList, newLinksMustHaveSelectedState);
            constraintEntriesList = dataMapTableView.getTableViewerCreatorForOtherFilters().getInputList();
            parseAllExpressions(constraintEntriesList, newLinksMustHaveSelectedState);
        }
    }

    private void parseAllExpressions(List<? extends ITableEntry> entriesList,
            boolean newLinksMustHaveSelectedState) {
        for (ITableEntry entry : entriesList) {
            parseExpression(entry.getExpression(), entry, newLinksMustHaveSelectedState, false, false);
        }
    }

    /**
     * 
     * 
     * @param expression
     * @param currentModifiedITableEntry
     * @param linkMustHaveSelectedState
     * @param checkInputKeyAutomatically TODO
     * @param inputExpressionAppliedOrCanceled TODO
     * @param newSelectedDataMapTableView
     * @return true if a link has been added or removed, false else
     */
    public ParseExpressionResult parseExpression(String expression, ITableEntry currentModifiedITableEntry,
            boolean linkMustHaveSelectedState, boolean checkInputKeyAutomatically,
            boolean inputExpressionAppliedOrCanceled) {

        DataMapTableView dataMapTableView = mapperManager.retrieveDataMapTableView(currentModifiedITableEntry);
        boolean linkHasBeenAdded = false;
        boolean linkHasBeenRemoved = false;

        DataMapExpressionParser dataMapExpressionParser = new DataMapExpressionParser(
                mapperManager.getCurrentLanguage());
        TableEntryLocation[] tableEntriesLocationsSources = dataMapExpressionParser
                .parseTableEntryLocations(expression);
        Set<TableEntryLocation> alreadyProcessed = new HashSet<TableEntryLocation>();
        Set<ITableEntry> sourcesForTarget = mapperManager.getSourcesForTarget(currentModifiedITableEntry);
        Set<ITableEntry> sourcesForTargetToDelete = new HashSet<ITableEntry>(sourcesForTarget);

        boolean isInputEntry = currentModifiedITableEntry instanceof InputColumnTableEntry;

        for (TableEntryLocation tableEntriesLocationsSource : tableEntriesLocationsSources) {
            TableEntryLocation location = tableEntriesLocationsSource;

            if (!alreadyProcessed.contains(location)
                    && checkSourceLocationIsValid(location, currentModifiedITableEntry)) {
                ITableEntry sourceTableEntry = mapperManager.retrieveTableEntry(location);
                sourcesForTargetToDelete.remove(sourceTableEntry);
                if (sourceTableEntry != null && !sourcesForTarget.contains(sourceTableEntry)

                ) {
                    DataMapTableView sourceDataMapTableView = mapperManager
                            .retrieveDataMapTableView(sourceTableEntry);
                    IMapperLink link = new Link(
                            new PointLinkDescriptor(sourceTableEntry, sourceDataMapTableView.getZone()),
                            new PointLinkDescriptor(currentModifiedITableEntry, dataMapTableView.getZone()),
                            mapperManager);
                    link.setState(linkMustHaveSelectedState ? LinkState.SELECTED : LinkState.UNSELECTED);
                    mapperManager.addLink(link);
                    linkHasBeenAdded = true;
                }
                alreadyProcessed.add(location);
            }
        }

        Set<IMapperLink> targets = mapperManager.getGraphicalLinksFromTarget(currentModifiedITableEntry);
        Set<IMapperLink> linksFromTarget = new HashSet<IMapperLink>(targets);
        for (IMapperLink link : linksFromTarget) {
            if (sourcesForTargetToDelete.contains(link.getPointLinkDescriptor1().getTableEntry())) {
                mapperManager.removeLink(link, link.getPointLinkDescriptor2().getTableEntry());
                linkHasBeenRemoved = true;
            }
        }
        mapperManager.orderLinks();

        return new ParseExpressionResult(linkHasBeenAdded, linkHasBeenRemoved);
    }

    /**
     * DOC amaumont Comment method "refreshInOutTableAndMetaTable".
     * 
     * @param currentModifiedTableEntry can be null
     */
    private void refreshInOutTableAndMetaTable(AbstractInOutTableEntry currentModifiedTableEntry) {
        DataMapTableView dataMapTableView = mapperManager.retrieveDataMapTableView(currentModifiedTableEntry);
        IMetadataTable metadataTableTarget = ((AbstractInOutTable) dataMapTableView.getDataMapTable())
                .getMetadataTable();
        dataMapTableView.getTableViewerCreatorForColumns().getTableViewer().refresh(currentModifiedTableEntry);
        MetadataTableEditorView metadataEditorView = getMetadataEditorView(dataMapTableView.getZone());
        if (metadataEditorView != null && metadataEditorView.getMetadataTableEditor() != null
                && metadataEditorView.getMetadataTableEditor().getMetadataTable() == metadataTableTarget) {
            metadataEditorView.getTableViewerCreator().getTableViewer()
                    .refresh(currentModifiedTableEntry.getMetadataColumn());
            metadataEditorView.getTableViewerCreator().refreshTableEditorControls();
        }
    }

    /**
     * 
     * DOC amaumont Comment method "refreshInOutTableAndMetaTable".
     * 
     * @param dataMapTableView
     */
    private void refreshInOutTableAndMetaTable(DataMapTableView dataMapTableView) {
        IMetadataTable metadataTableTarget = ((AbstractInOutTable) dataMapTableView.getDataMapTable())
                .getMetadataTable();
        dataMapTableView.getTableViewerCreatorForColumns().getTableViewer().refresh();
        MetadataTableEditorView metadataEditorView = getMetadataEditorView(dataMapTableView.getZone());
        if (metadataEditorView != null && metadataEditorView.getMetadataTableEditor() != null
                && metadataEditorView.getMetadataTableEditor().getMetadataTable() == metadataTableTarget) {
            metadataEditorView.getTableViewerCreator().getTableViewer().refresh();
            metadataEditorView.getTableViewerCreator().refreshTableEditorControls();
        }
    }

    /**
     * DOC amaumont Comment method "processNewProcessColumnName".
     * 
     * @param previousColumnName TODO
     * @param dataMapTableView
     * @param renamingDependentEntries TODO
     * @param text
     * @param entry
     */
    public void processColumnNameChanged(final String previousColumnName, final String newColumnName,
            final DataMapTableView dataMapTableView, final ITableEntry currentModifiedITableEntry,
            boolean renamingDependentEntries) {

        mapperManager.changeColumnName(currentModifiedITableEntry, previousColumnName, newColumnName);
        Collection<DataMapTableView> tableViews = mapperManager.getTablesView();
        boolean atLeastOneLinkHasBeenRemoved = false;
        for (DataMapTableView view : tableViews) {
            IDataMapTable dataMapTable = view.getDataMapTable();
            List<IColumnEntry> metadataTableEntries = dataMapTable.getColumnEntries();
            for (IColumnEntry entry : metadataTableEntries) {
                if (parseExpression(entry.getExpression(), entry, true, true, false).isAtLeastOneLinkRemoved()) {
                    atLeastOneLinkHasBeenRemoved = true;
                }
            }
            if (dataMapTable instanceof OutputTable) {
                List<FilterTableEntry> constraintWhereEntries = ((OutputTable) dataMapTable)
                        .getWhereFilterEntries();
                for (FilterTableEntry entry : constraintWhereEntries) {
                    if (parseExpression(entry.getExpression(), entry, true, true, false)
                            .isAtLeastOneLinkRemoved()) {
                        atLeastOneLinkHasBeenRemoved = true;
                    }
                }
                List<FilterTableEntry> constraintOtherEntries = ((OutputTable) dataMapTable)
                        .getOtherFilterEntries();
                for (FilterTableEntry entry : constraintOtherEntries) {
                    if (parseExpression(entry.getExpression(), entry, true, true, false)
                            .isAtLeastOneLinkRemoved()) {
                        atLeastOneLinkHasBeenRemoved = true;
                    }
                }
            }
        }
        mapperManager.getUiManager().refreshBackground(false, false);
        dataMapTableView.getTableViewerCreatorForColumns().getTableViewer().refresh(currentModifiedITableEntry);

        TableEntryLocation previousLocation = new TableEntryLocation(currentModifiedITableEntry.getParentName(),
                previousColumnName);
        TableEntryLocation newLocation = new TableEntryLocation(currentModifiedITableEntry.getParentName(),
                newColumnName);
        mapperManager.replacePreviousLocationInAllExpressions(previousLocation, newLocation);
        refreshSqlExpression();

        if (!renamingDependentEntries) {

            AbstractInOutTable currentTable = (AbstractInOutTable) currentModifiedITableEntry.getParent();
            if (currentTable instanceof InputTable) {

                InputTable currentInputTable = (InputTable) currentTable;
                String physicalTableName = currentInputTable.getTableName();

                String alias = currentInputTable.getAlias();

                InputTable physicalInputTable = null;
                List<InputTable> inputTables = mapperManager.getInputTables();

                if (alias != null) {

                    for (InputTable table : inputTables) {
                        if (table.equals(physicalTableName)) {
                            physicalInputTable = table;
                        }
                    }

                } else {
                    physicalInputTable = currentInputTable;
                }

                if (physicalInputTable == null) {

                    List<IOConnection> incomingConnections = mapperManager.getComponent().getMapperMain()
                            .getIoInputConnections();
                    IOConnection connectionFound = null;
                    for (IOConnection connection : incomingConnections) {
                        if (connection.getName().equals(physicalTableName)) {
                            connectionFound = connection;
                        }
                    }
                    IMetadataColumn metadataColumn = connectionFound.getTable().getColumn(previousColumnName);
                    if (metadataColumn != null) {
                        metadataColumn.setLabel(newColumnName);
                    }
                }

                for (InputTable table : inputTables) {
                    if ((
                    // Physical table parent
                    alias != null && table.getAlias() == null && table.getName().equals(physicalTableName) ||
                    // Alias table
                            alias == null && table.getAlias() != null
                                    && table.getTableName().equals(physicalTableName))) {

                        TableEntryLocation location = new TableEntryLocation(table.getName(), previousColumnName);
                        DataMapTableView aliasTableView = mapperManager.retrieveDataMapTableView(location);
                        ITableEntry aliasTableEntry = mapperManager.retrieveTableEntry(location);
                        if (aliasTableEntry != null) {
                            processColumnNameChanged(previousColumnName, newColumnName, aliasTableView,
                                    aliasTableEntry, true);
                        }

                    }
                }

            }

        }

        // if (atLeastOneLinkHasBeenRemoved) {
        // new AsynchronousThreading(20, false, dataMapTableView.getDisplay(), new Runnable() {
        //
        // public void run() {
        // TableViewerCreator tableViewerCreatorForColumns = dataMapTableView
        // .getTableViewerCreatorForColumns();
        // boolean propagate = MessageDialog.openQuestion(tableViewerCreatorForColumns.getTable().getShell(),
        // Messages.getString("UIManager.propagateTitle"), //$NON-NLS-1$
        // Messages.getString("UIManager.propagateMessage")); //$NON-NLS-1$
        // if (propagate) {
        // TableEntryLocation previousLocation = new TableEntryLocation(currentModifiedITableEntry
        // .getParentName(), previousColumnName);
        // TableEntryLocation newLocation = new TableEntryLocation(currentModifiedITableEntry
        // .getParentName(), newColumnName);
        // mapperManager.replacePreviousLocationInAllExpressions(previousLocation, newLocation);
        // refreshSqlExpression();
        // }
        // }
        // }).start();
        // }
    }

    public OutputDataMapTableView createNewOutputTableView(Control previousControl,
            IDataMapTable abstractDataMapTable, Composite parent) {
        OutputDataMapTableView dataMapTableView = new OutputDataMapTableView(parent, SWT.BORDER,
                abstractDataMapTable, mapperManager);
        FormData formData = new FormData();
        formData.left = new FormAttachment(0, 0);
        formData.right = new FormAttachment(100, 0);
        formData.top = new FormAttachment(previousControl);
        dataMapTableView.setLayoutData(formData);
        dataMapTableView.minimizeTable(abstractDataMapTable.isMinimized());
        dataMapTableView.registerStyledExpressionEditor(getTabFolderEditors().getStyledTextHandler());
        this.mapperUI.getOutputMouseSrolledListener().addMouseWheelListener(dataMapTableView);
        return dataMapTableView;
    }

    public InputDataMapTableView createNewInputTableView(Control previousControl, InputTable inputTable,
            Composite parent) {

        InputDataMapTableView dataMapTableView = new InputDataMapTableView(parent, SWT.BORDER, inputTable,
                mapperManager);
        FormData formData = new FormData();
        formData.left = new FormAttachment(0, 0);
        formData.right = new FormAttachment(100, 0);
        formData.top = new FormAttachment(previousControl);
        dataMapTableView.setLayoutData(formData);
        dataMapTableView.minimizeTable(inputTable.isMinimized());
        dataMapTableView.registerStyledExpressionEditor(getTabFolderEditors().getStyledTextHandler());
        this.mapperUI.getInputMouseSrolledListener().addMouseWheelListener(dataMapTableView);
        return dataMapTableView;
    }

    public TablesZoneView getTablesZoneViewOutputs() {
        return this.mapperUI.getOutputTablesZoneView();
    }

    public TablesZoneView getTablesZoneViewInputs() {
        return this.mapperUI.getInputTablesZoneView();
    }

    public TablesZoneView getTablesZoneViewVars() {
        return this.mapperUI.getVarsTableZoneView();
    }

    public ScrolledComposite getScrolledCompositeViewOutputs() {
        return this.mapperUI.getScrolledCompositeViewOutputs();
    }

    public ScrolledComposite getScrolledCompositeViewInputs() {
        return this.mapperUI.getScrolledCompositeViewInputs();
    }

    public InputsZone getInputsZone() {
        return this.mapperUI.getInputsZone();
    }

    public OutputsZone getOutputsZone() {
        return this.mapperUI.getOutputsZone();
    }

    /**
     * DOC amaumont Comment method "getMetadataEditorView".
     * 
     * @param newSelectedDataMapTableView
     */
    public MetadataTableEditorView getMetadataEditorView(Zone zone) {
        if (zone == Zone.INPUTS) {
            return getInputMetaEditorView();
        }
        if (zone == Zone.OUTPUTS) {
            return getOutputMetaEditorView();
        }
        return null;
    }

    public List<IColumnEntry> getLastCreatedInOutColumnEntries() {
        return this.lastCreatedInOutColumnEntries;
    }

    public void clearLastCreatedInOutColumnEntries() {
        this.lastCreatedInOutColumnEntries.clear();
    }

    public Composite getMapperContainer() {
        return mapperUI.getMapperUIParent();
    }

    public ExternalDbMapUiProperties getUiProperties() {
        if (this.uiProperties == null) {
            this.uiProperties = new ExternalDbMapUiProperties();
        }
        return this.uiProperties;
    }

    public void setUiProperties(ExternalDbMapUiProperties uiProperties) {
        this.uiProperties = uiProperties;
    }

    public OutputDataMapTableView getCurrentSelectedOutputTableView() {
        return this.currentSelectedOutputTableView;
    }

    public InputDataMapTableView getCurrentSelectedInputTableView() {
        return this.currentSelectedInputTableView;
    }

    public TabFolderEditors getTabFolderEditors() {
        return this.mapperUI.getTabFolderEditors();
    }

    /**
     * DOC amaumont Comment method "openAddNewOutputDialog".
     */
    public String openNewOutputCreationDialog() {
        final IProcess process = mapperManager.getComponent().getProcess();
        String outputName = process.generateUniqueConnectionName("newOutput"); //$NON-NLS-1$
        InputDialog id = new InputDialog(getMapperContainer().getShell(),
                Messages.getString("UIManager.addNewOutputTable"), //$NON-NLS-1$
                Messages.getString("UIManager.typeTableName"), outputName, new IInputValidator() { //$NON-NLS-1$

                    @Override
                    public String isValid(String newText) {
                        if (KeywordsValidator.isKeyword(newText) || KeywordsValidator.isSqlKeyword(newText)) {
                            return Messages.getString("UIManager.tableNameIsNotValid"); //$NON-NLS-1$
                        }
                        if (newText != null && !process.checkValidConnectionName(newText, true)) {
                            return Messages.getString("UIManager.nameExistOrNull"); //$NON-NLS-1$
                        }
                        return null;
                    }

                });
        int response = id.open();
        if (response == InputDialog.OK) {
            return id.getValue();
        }
        return null;
    }

    /**
     * DOC amaumont Comment method "getTablesZoneView".
     * 
     * @param dataMapTableViewTarget
     */
    public TablesZoneView getTablesZoneView(DataMapTableView dataMapTableViewTarget) {
        Zone zone = dataMapTableViewTarget.getZone();
        if (zone == Zone.OUTPUTS) {
            return getTablesZoneViewOutputs();
        } else if (zone == Zone.INPUTS) {
            return getTablesZoneViewInputs();
        } else {
            throw new IllegalArgumentException("Case not found"); //$NON-NLS-1$
        }
    }

    public DropTargetOperationListener getDropTargetOperationListener() {
        return this.mapperUI.getDropTargetOperationListener();
    }

    @Override
    public DraggingInfosPopup getDraggingInfosPopup() {
        return this.mapperUI.getDraggingInfosPopup();
    }

    public void moveOutputScrollBarZoneToMax() {
        ScrolledComposite scrolledCompositeViewOutputs = getScrolledCompositeViewOutputs();
        setPositionOfVerticalScrollBarZone(scrolledCompositeViewOutputs,
                scrolledCompositeViewOutputs.getVerticalBar().getMaximum());
    }

    public void moveInputScrollBarZoneToMax() {
        ScrolledComposite scrolledCompositeViewInputs = getScrolledCompositeViewInputs();
        setPositionOfVerticalScrollBarZone(scrolledCompositeViewInputs,
                scrolledCompositeViewInputs.getVerticalBar().getMaximum());
    }

    public void moveScrollBarZoneAtSelectedTable(Zone zone) {
        if (zone == Zone.INPUTS) {
            moveInputScrollBarZoneAtSelectedTable();
        } else if (zone == Zone.OUTPUTS) {
            moveOutputScrollBarZoneAtSelectedTable();
        }
    }

    private void moveOutputScrollBarZoneAtSelectedTable() {
        Rectangle bounds = currentSelectedOutputTableView.getBounds();
        int selection = bounds.y - 30;
        ScrolledComposite scrolledCompositeViewOutputs = getScrolledCompositeViewOutputs();
        setPositionOfVerticalScrollBarZone(scrolledCompositeViewOutputs, selection);
    }

    private void moveInputScrollBarZoneAtSelectedTable() {
        Rectangle bounds = currentSelectedInputTableView.getBounds();
        int selection = bounds.y - 30;
        ScrolledComposite scrolledCompositeViewInputs = getScrolledCompositeViewInputs();
        setPositionOfVerticalScrollBarZone(scrolledCompositeViewInputs, selection);
    }

    private void setPositionOfVerticalScrollBarZone(ScrolledComposite scrollComposite, int scrollBarSelection) {
        ScrollBar verticalBar = scrollComposite.getVerticalBar();
        verticalBar.setSelection(scrollBarSelection);
        scrollComposite.setOrigin(0, scrollBarSelection);
    }

    /**
     * DOC amaumont Comment method "getDisplay".
     */
    public Display getDisplay() {
        return getMapperContainer().getDisplay();
    }

    /**
     * 
     * DOC amaumont Comment method "moveSelectedTable".
     * 
     * @param zone
     * @param moveUp true to move up, else false to move down
     */
    public void moveSelectedTable(Zone zone, boolean moveUp) {
        if (zone == Zone.INPUTS) {
            List<DataMapTableView> inputsTablesView = getInputsTablesView();
            if (moveUp) {
                moveSelectTableUp(currentSelectedInputTableView, inputsTablesView, 1);
            } else {
                moveSelectedTableDown(currentSelectedInputTableView, inputsTablesView, 0);
            }
            updateDropDownJoinTypeForInputs();
            moveInputScrollBarZoneAtSelectedTable();
        } else if (zone == Zone.OUTPUTS) {
            List<DataMapTableView> outputsTablesView = getOutputsTablesView();
            if (moveUp) {
                moveSelectTableUp(currentSelectedOutputTableView, outputsTablesView, 1);
            } else {
                moveSelectedTableDown(currentSelectedOutputTableView, outputsTablesView, 0);
            }
            moveOutputScrollBarZoneAtSelectedTable();
        }
        updateToolbarButtonsStates(zone);
        refreshBackground(true, false);
        refreshSqlExpression();
    }

    /**
     * DOC amaumont Comment method "updateDropDownJoinTypeForInputs".
     */
    public void updateDropDownJoinTypeForInputs() {
        List<DataMapTableView> inputsTablesView;
        inputsTablesView = getInputsTablesView();
        if (inputsTablesView.size() >= 1) {
            InputDataMapTableView inputView0 = (InputDataMapTableView) inputsTablesView.get(0);
            inputView0.setEnableJoinTypeDropDown(false);
        }
        if (inputsTablesView.size() >= 2) {
            InputDataMapTableView inputView1 = (InputDataMapTableView) inputsTablesView.get(1);
            inputView1.setEnableJoinTypeDropDown(true);
        }
    }

    public boolean isTableViewMoveable(Zone zone, boolean moveUp) {
        if (zone == Zone.INPUTS) {
            if (currentSelectedInputTableView == null) {
                return false;
            }
            List<DataMapTableView> tablesView = getInputsTablesView();
            int indexCurrentTable = tablesView.indexOf(currentSelectedInputTableView);
            if (moveUp) {
                if (indexCurrentTable > 0) {
                    return true;
                }
                return false;
            } else {
                if (indexCurrentTable < tablesView.size() - 1 && indexCurrentTable >= 0) {
                    return true;
                }
                return false;
            }
        } else if (zone == Zone.OUTPUTS) {
            if (currentSelectedOutputTableView == null) {
                return false;
            }
            List<DataMapTableView> tablesView = getOutputsTablesView();
            int indexCurrentTable = tablesView.indexOf(currentSelectedOutputTableView);
            if (moveUp) {
                if (indexCurrentTable > 0) {
                    return true;
                }
                return false;
            } else {
                if (indexCurrentTable < tablesView.size() - 1) {
                    return true;
                }
                return false;
            }
        }
        return false;
    }

    /**
     * 
     * DOC amaumont Comment method "moveSelectTableUp".
     * 
     * @param currentSelectedTableView
     * @param tablesView
     * @param indexStartMovedAuthorized
     */
    private void moveSelectTableUp(DataMapTableView currentSelectedTableView, List<DataMapTableView> tablesView,
            int indexStartMovedAuthorized) {
        int indexCurrentTable = tablesView.indexOf(currentSelectedTableView);

        if (indexCurrentTable < indexStartMovedAuthorized) {
            return;
        }

        FormData formDataCurrent = (FormData) currentSelectedTableView.getLayoutData();
        DataMapTableView beforePreviousTableView = null;
        if (indexCurrentTable - 2 >= 0) {
            beforePreviousTableView = tablesView.get(indexCurrentTable - 2);
            formDataCurrent.top.control = beforePreviousTableView;
        } else {
            formDataCurrent.top.control = null;
        }

        DataMapTableView previousTableView = null;
        if (indexCurrentTable - 1 >= 0) {
            previousTableView = tablesView.get(indexCurrentTable - 1);
            FormData formDataPrevious = (FormData) previousTableView.getLayoutData();
            formDataPrevious.top.control = currentSelectedTableView;
        }

        if (indexCurrentTable + 1 <= tablesView.size() - 1) {
            DataMapTableView nextTableView = tablesView.get(indexCurrentTable + 1);
            FormData formDataNext = (FormData) nextTableView.getLayoutData();
            formDataNext.top.control = previousTableView;
        }

        tableManager.swapWithPreviousTable(currentSelectedTableView.getDataMapTable());
        currentSelectedTableView.getParent().layout();
        parseAllExpressions(currentSelectedTableView, false);
        parseAllExpressions(previousTableView, false);

        mapperManager.getProblemsManager().checkProblemsForAllEntries(currentSelectedTableView, true);
        mapperManager.getProblemsManager().checkProblemsForAllEntries(previousTableView, true);
    }

    private void moveSelectedTableDown(DataMapTableView currentSelectedTableView, List<DataMapTableView> tablesView,
            int indexStartMovedAuthorized) {
        int indexCurrentTable = tablesView.indexOf(currentSelectedTableView);

        if (indexCurrentTable < indexStartMovedAuthorized || indexCurrentTable == tablesView.size() - 1) {
            return;
        }
        DataMapTableView nextTableView = tablesView.get(indexCurrentTable + 1);

        FormData formDataCurrent = (FormData) currentSelectedTableView.getLayoutData();
        formDataCurrent.top.control = nextTableView;

        if (indexCurrentTable + 2 <= tablesView.size() - 1) {
            DataMapTableView afterNextTableView = tablesView.get(indexCurrentTable + 2);
            FormData formDataAfterNext = (FormData) afterNextTableView.getLayoutData();
            formDataAfterNext.top.control = currentSelectedTableView;
        }

        FormData formDataNext = (FormData) nextTableView.getLayoutData();
        if (indexCurrentTable - 1 >= 0) {
            formDataNext.top.control = tablesView.get(indexCurrentTable - 1);
        } else {
            formDataNext.top.control = null;
        }

        tableManager.swapWithNextTable(currentSelectedTableView.getDataMapTable());

        currentSelectedTableView.getParent().layout();
        parseAllExpressions(currentSelectedTableView, false);
        parseAllExpressions(nextTableView, false);

        mapperManager.getProblemsManager().checkProblemsForAllEntries(currentSelectedTableView, true);
        mapperManager.getProblemsManager().checkProblemsForAllEntries(nextTableView, true);
    }

    public void minimizeAllTables(Zone zone, boolean minimize, ToolItem minimizeButton) {

        List<DataMapTableView> tablesView = null;
        TablesZoneView tablesZoneView = null;
        if (zone == Zone.INPUTS) {
            tablesView = getInputsTablesView();
            tablesZoneView = getTablesZoneViewInputs();
        } else if (zone == Zone.OUTPUTS) {
            tablesZoneView = getTablesZoneViewOutputs();
            tablesView = getOutputsTablesView();
        } else {
            throw new RuntimeException("Case not found:" + zone); //$NON-NLS-1$
        }

        Layout layout = tablesZoneView.getLayout();

        try {
            tablesZoneView.setLayout(null);
            for (DataMapTableView view : tablesView) {
                view.minimizeTable(minimize);
            }
        } catch (RuntimeException e) {
            ExceptionHandler.process(e);
        } finally {
            tablesZoneView.setLayout(layout);
        }

        tablesZoneView.layout();
        for (DataMapTableView view : tablesView) {
            view.layout();
        }
        resizeTablesZoneViewAtComputedSize(zone);

        moveScrollBarZoneAtSelectedTable(zone);
    }

    /**
     * recalculate parent size don't hide DataMapTableView when resized.
     */
    public void resizeTablesZoneViewAtComputedSize(Zone zone) {
        TablesZoneView tablesZoneView = null;
        if (zone == Zone.INPUTS) {
            tablesZoneView = getTablesZoneViewInputs();
        } else if (zone == Zone.OUTPUTS) {
            tablesZoneView = getTablesZoneViewOutputs();
        }
        tablesZoneView.setSize(tablesZoneView.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    }

    /**
     * Call mapperManager.removeSelectedOutput() to remove a table view.
     * 
     * @param dataMapTableViewToRemove
     */
    public void removeOutputTableView(OutputDataMapTableView dataMapTableViewToRemove) {
        List<DataMapTableView> outputsTablesView = getOutputsTablesView();
        int sizeList = outputsTablesView.size();
        for (int i = 0; i < sizeList; i++) {
            Control control = outputsTablesView.get(i);
            if (control == dataMapTableViewToRemove && i < sizeList - 1 && i > 0) {
                FormData formData = (FormData) outputsTablesView.get(i + 1).getLayoutData();
                formData.top = new FormAttachment(outputsTablesView.get(i - 1));
                break;
            }
        }
        mapperManager.removeTablePair(dataMapTableViewToRemove);
        MetadataTableEditorView outputMetaEditorView = getOutputMetaEditorView();
        OutputTable outputTable = (OutputTable) dataMapTableViewToRemove.getDataMapTable();

        if (outputMetaEditorView.getMetadataTableEditor().getMetadataTable() == outputTable.getMetadataTable()) {
            getOutputMetaEditorView().setMetadataTableEditor(null);
        }
        dataMapTableViewToRemove.dispose();
        dataMapTableViewToRemove = null;

        getTablesZoneViewOutputs().layout();
        refreshBackground(true, false);
        setCurrentSelectedOutputTableView(null);
    }

    /**
     * Call mapperManager.removeSelectedOutput() to remove a table view.
     * 
     * @param dataMapTableViewToRemove
     */
    public void removeInputTableView(InputDataMapTableView dataMapTableViewToRemove) {
        List<DataMapTableView> outputsTablesView = getInputsTablesView();
        int sizeList = outputsTablesView.size();
        for (int i = 0; i < sizeList; i++) {
            Control control = outputsTablesView.get(i);
            if (control == dataMapTableViewToRemove && i < sizeList - 1 && i > 0) {
                FormData formData = (FormData) outputsTablesView.get(i + 1).getLayoutData();
                formData.top = new FormAttachment(outputsTablesView.get(i - 1));
                break;
            }
        }
        mapperManager.removeTablePair(dataMapTableViewToRemove);
        MetadataTableEditorView outputMetaEditorView = getInputMetaEditorView();
        if (outputMetaEditorView.getMetadataTableEditor()
                .getMetadataTable() == ((InputTable) dataMapTableViewToRemove.getDataMapTable())
                        .getMetadataTable()) {
            getInputMetaEditorView().setMetadataTableEditor(null);
        }
        dataMapTableViewToRemove.dispose();
        dataMapTableViewToRemove = null;
        getTablesZoneViewInputs().layout();
        refreshBackground(true, false);
        setCurrentSelectedInputTableView(null);
    }

    public void registerCustomPaint() {
        List<DataMapTableView> tablesView = getOutputsTablesView();
        tablesView.addAll(getInputsTablesView());
        for (DataMapTableView view : tablesView) {
            view.getTableViewerCreatorForColumns().setUseCustomItemColoring(false);
        }

    }

    public void unregisterCustomPaint() {
        List<DataMapTableView> tablesView = getOutputsTablesView();
        tablesView.addAll(getInputsTablesView());
        for (DataMapTableView view : tablesView) {
            view.getTableViewerCreatorForColumns().setUseCustomItemColoring(false);
        }
    }

    /**
     * Getter for drawableLinkFactory.
     * 
     * @return the drawableLinkFactory
     */
    public StyleLinkFactory getStyleLinkFactory() {
        if (this.drawableLinkFactory == null) {
            this.drawableLinkFactory = new StyleLinkFactory(getLinkStyle());
        }
        return this.drawableLinkFactory;
    }

    public void unselectAllEntriesOfAllTables() {
        List<DataMapTableView> tablesView = getOutputsTablesView();
        tablesView.addAll(getInputsTablesView());
        tablesView.addAll(getVarsTablesView());
        for (DataMapTableView view : tablesView) {
            view.unselectAllEntries();
        }

    }

    /**
     * DOC amaumont Comment method "enlargeLeftMarginForInputTables".
     */
    public void enlargeLeftMarginForInputTables(int countOfLevels) {
        int marginLeft = mapperUI.getInputTablesZoneView().getMarginLeft();
        int calculatedMarginLeft = calculateInputsLeftMarginFromLevelsCount(countOfLevels);
        if (calculatedMarginLeft >= marginLeft) {
            mapperUI.getInputTablesZoneView().setMarginLeft(calculatedMarginLeft + 5);
        }

    }

    private int calculateInputsLeftMarginFromLevelsCount(int countOfLevels) {
        return 5 + countOfLevels * 5;
    }

    public List<DataMapTableView> getInputsTablesView() {
        return this.tableManager.getInputsTablesView();
    }

    public List<DataMapTableView> getOutputsTablesView() {
        return this.tableManager.getOutputsTablesView();
    }

    public List<DataMapTableView> getVarsTablesView() {
        return this.tableManager.getVarsTablesView();
    }

    /**
     * Refresh Sql select query in the bottom tab and its title.
     */
    public void refreshSqlExpression() {
        if (getTabFolderEditors().getSelectionIndex() == 2) {
            mapperManager.getComponent().restoreMapperModelFromInternalData();
            OutputDataMapTableView selectedOutputTableView = getCurrentSelectedOutputTableView();
            if (selectedOutputTableView == null) {

            } else {
                IDataMapTable dataMapTable = selectedOutputTableView.getDataMapTable();
                String tableName = dataMapTable.getName();
                DbGenerationManager generationMnager = mapperManager.getComponent().getGenerationManager();
                String sql = generationMnager.buildSqlSelect(mapperManager.getComponent(), tableName);
                getTabFolderEditors().getItem(2)
                        .setText(Messages.getString("TabFolderEditors.SqlSelectQuery", new Object[] { tableName })); //$NON-NLS-1$
                getTabFolderEditors().getStyledSqlText().setText(sql);
            }
        }
    }

    /**
     * Sets the currentSelectedOutputTableView.
     * 
     * @param currentSelectedOutputTableView the currentSelectedOutputTableView to set
     */
    protected void setCurrentSelectedOutputTableView(OutputDataMapTableView currentSelectedOutputTableView) {
        this.currentSelectedOutputTableView = currentSelectedOutputTableView;
        refreshSqlExpression();
    }

    /**
     * Sets the currentSelectedInputTableView.
     * 
     * @param currentSelectedInputTableView the currentSelectedInputTableView to set
     */
    protected void setCurrentSelectedInputTableView(InputDataMapTableView currentSelectedInputTableView) {
        this.currentSelectedInputTableView = currentSelectedInputTableView;
    }

    public Shell getShell() {
        return mapperUI.getShell();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.designer.abstractmap.managers.AbstractUIManager#getAbstractMapperManager()
     */
    @Override
    public AbstractMapperManager getAbstractMapperManager() {
        return mapperManager;
    }

    public boolean checkSourceLocationIsValid(ITableEntry entrySource, ITableEntry entryTarget) {

        if (entrySource instanceof InputColumnTableEntry && entryTarget instanceof InputColumnTableEntry
        // && entrySource.getParent() != entryTarget.getParent()
        ) {
            // List<InputTable> inputTables = getInputTables();
            // int indexTableSource = inputTables.indexOf(entrySource.getParent());
            // int indexTableTarget = inputTables.indexOf(entryTarget.getParent());
            // if (indexTableSource < indexTableTarget) {
            return true;
            // }
        } else if (entryTarget instanceof OutputColumnTableEntry || entryTarget instanceof FilterTableEntry) {
            if (entrySource instanceof InputColumnTableEntry || entrySource instanceof OutputColumnTableEntry
                    && entrySource.getParent() == entryTarget.getParent()) {
                return true;
            }
        }
        return false;
    }

    /**
     * DOC amaumont Comment method "checkLocationIsValid".
     * 
     * @param couple
     * @param currentModifiedITableEntry
     * @param manager TODO
     * @param locationSource TODO
     * @param entryTarget TODO
     * @return
     */
    public boolean checkSourceLocationIsValid(TableEntryLocation locationSource, ITableEntry entryTarget) {
        return checkSourceLocationIsValid(mapperManager.retrieveTableEntry(locationSource), entryTarget);
    }

}