hydrograph.ui.propertywindow.widgets.dialogs.join.JoinMapDialog.java Source code

Java tutorial

Introduction

Here is the source code for hydrograph.ui.propertywindow.widgets.dialogs.join.JoinMapDialog.java

Source

/*******************************************************************************
 * Copyright 2017 Capital One Services, LLC and Bitwise, Inc.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/
package hydrograph.ui.propertywindow.widgets.dialogs.join;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TableViewerEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.ExpandBar;
import org.eclipse.swt.widgets.ExpandItem;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

import hydrograph.ui.common.util.Constants;
import hydrograph.ui.common.util.CustomColorRegistry;
import hydrograph.ui.common.util.ImagePathConstant;
import hydrograph.ui.common.util.ParameterUtil;
import hydrograph.ui.datastructure.property.FilterProperties;
import hydrograph.ui.datastructure.property.GridRow;
import hydrograph.ui.datastructure.property.JoinConfigProperty;
import hydrograph.ui.datastructure.property.JoinMappingGrid;
import hydrograph.ui.datastructure.property.LookupMapProperty;
import hydrograph.ui.datastructure.property.Schema;
import hydrograph.ui.graph.model.Component;
import hydrograph.ui.propertywindow.messages.Messages;
import hydrograph.ui.propertywindow.propertydialog.PropertyDialogButtonBar;
import hydrograph.ui.propertywindow.widgets.dialogs.join.support.JoinMappingEditingSupport;
import hydrograph.ui.propertywindow.widgets.dialogs.join.utils.JoinMapDialogConstants;
import hydrograph.ui.propertywindow.widgets.utility.WidgetUtility;

/**
 * 
 * Join mapping dialog
 * 
 * @author Bitwise
 *
 */
public class JoinMapDialog extends Dialog {
    private Component component;
    private JoinMappingGrid joinMappingGrid;
    private List<List<FilterProperties>> inputPorts;
    private PropertyDialogButtonBar propertyDialogButtonBar;
    private int inputPortValue;
    private TableViewer mappingTableViewer;
    private List<LookupMapProperty> mappingTableItemList;
    private Map<String, Button> radioButtonMap;
    private JoinMappingGrid oldJoinMappingGrid;
    private JoinMappingGrid newJoinMappingGrid;
    private List<String> allInputFields;
    private Button btnPull;
    private Button btnDown;
    private Button btnUp;
    private Button btnDelete;
    private Button btnAdd;

    private static final String PORT_ID_KEY = "PORT_ID";
    private static final String NO_COPY = "None";
    private static final String INPUT_PORT_ID_PREFIX = "in";
    private static final String COPY_RADIO_BUTTON_TEXT_PREFIX = "Copy of in";
    private static final String EXPAND_ITEM_TEXT_PREFIX = "Port in";

    private static final String FIELD_TOOLTIP_MESSAGE_NO_SUCH_INPUT_FIELD = "No such input field";
    private static final String FIELD_TOOLTIP_MESSAGE_FIELD_CANT_BE_EMPTY = "Field can not be empty";
    private static final String FIELD_TOOLTIP_MESSAGE_DUPLICATE_FIELDS = "Duplicate field";
    private static final String MAPPING_TABLE_ITEM_DELIMILATOR = "#";

    private static final String PULL_TOOLTIP = "Pull schema";

    private static final String INPUT_TABLE_COLUMN_TEXT = "Input Fields";
    private static final String DIALOG_TITLE = "Join Mapping Dialog";
    private boolean ctrlKeyPressed = false;
    private Table table;
    private JoinMappingEditingSupport outputEditingSupport;
    private JoinMappingEditingSupport inputEditingSupport;

    /**
     * Create the dialog.
     * 
     * @param parentShell
     * @wbp.parser.constructor
     */
    @Deprecated
    public JoinMapDialog(Shell parentShell) {
        super(parentShell);

        setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.WRAP | SWT.APPLICATION_MODAL | SWT.RESIZE);
    }

    public JoinMapDialog(Shell parentShell, Component component, JoinMappingGrid joinPropertyGrid,
            PropertyDialogButtonBar propertyDialogButtonBar) {
        super(parentShell);

        setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.WRAP | SWT.APPLICATION_MODAL | SWT.RESIZE);
        this.joinMappingGrid = joinPropertyGrid;
        this.component = component;
        radioButtonMap = new LinkedHashMap<>();
        inputPorts = new ArrayList<>();

        this.propertyDialogButtonBar = propertyDialogButtonBar;
        allInputFields = new LinkedList<>();
    }

    /**
     * Create contents of the dialog.
     * 
     * @param parent
     */
    @Override
    protected Control createDialogArea(Composite parent) {
        Composite container = (Composite) super.createDialogArea(parent);
        container.setLayout(new GridLayout(1, false));
        container.getShell().setText(DIALOG_TITLE);

        SashForm composite = new SashForm(container, SWT.SMOOTH);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        createInputFieldExpandBarSection(composite);

        creatFieldMappingSection(composite);

        createCopyInputToOutputFieldSection(composite);
        composite.setWeights(new int[] { 215, 559, 116 });

        populateJoinMapDialog();

        return container;
    }

    private void createCopyInputToOutputFieldSection(Composite composite) {
        Composite composite_3 = new Composite(composite, SWT.NONE);
        GridLayout gl_composite_3 = new GridLayout(1, false);
        gl_composite_3.verticalSpacing = 0;
        gl_composite_3.marginWidth = 0;
        gl_composite_3.marginHeight = 0;
        gl_composite_3.horizontalSpacing = 0;
        composite_3.setLayout(gl_composite_3);
        GridData gd_composite_3 = new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1);
        gd_composite_3.widthHint = 121;
        composite_3.setLayoutData(gd_composite_3);
        composite_3.setBounds(0, 0, 64, 64);

        Composite composite_8 = new Composite(composite_3, SWT.BORDER);
        GridLayout gl_composite_8 = new GridLayout(1, false);
        gl_composite_8.verticalSpacing = 0;
        gl_composite_8.marginWidth = 0;
        gl_composite_8.horizontalSpacing = 0;
        gl_composite_8.marginHeight = 0;
        composite_8.setLayout(gl_composite_8);
        composite_8.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        ScrolledComposite scrolledComposite_2 = new ScrolledComposite(composite_8,
                SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        scrolledComposite_2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        scrolledComposite_2.setExpandHorizontal(true);
        scrolledComposite_2.setExpandVertical(true);
        scrolledComposite_2.setAlwaysShowScrollBars(false);
        attachMouseScrollButtonListener(scrolledComposite_2);

        Composite composite_12 = new Composite(scrolledComposite_2, SWT.NONE);
        composite_12.setLayout(new GridLayout(1, false));

        Button btnRadioButton_None = new Button(composite_12, SWT.RADIO);
        btnRadioButton_None.setText(NO_COPY);

        btnRadioButton_None.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {

                if (!mappingTableViewer.getTable().isEnabled()) {
                    joinMappingGrid.setButtonText(((Button) e.widget).getText());
                    joinMappingGrid.setIsSelected(false);
                    mappingTableItemList.clear();
                    mappingTableViewer.refresh();
                    mappingTableViewer.getTable().setEnabled(true);
                    btnAdd.setEnabled(true);
                    btnPull.setEnabled(true);
                }
            }
        });
        radioButtonMap.put(btnRadioButton_None.getText(), btnRadioButton_None);

        for (int i = 0; i < inputPortValue; i++) {
            Button btnRadioButton = new Button(composite_12, SWT.RADIO);
            btnRadioButton.setText(COPY_RADIO_BUTTON_TEXT_PREFIX + i);
            btnRadioButton.setData(PORT_ID_KEY, i);
            radioButtonMap.put(btnRadioButton.getText(), btnRadioButton);
            btnRadioButton.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    enableMappingTableButtonPanel(false);
                    joinMappingGrid.setButtonText(((Button) e.widget).getText());
                    joinMappingGrid.setIsSelected(true);
                    mappingTableViewer.getTable().setEnabled(false);

                    List<FilterProperties> inputFieldList = inputPorts
                            .get((int) ((Button) e.widget).getData(PORT_ID_KEY));

                    String inputPortID = INPUT_PORT_ID_PREFIX + ((Button) e.widget).getData(PORT_ID_KEY);

                    if (inputFieldList != null) {
                        copyFieldsWhenCopyOfIsSelected(inputFieldList, inputPortID);
                        mappingTableViewer.refresh();

                    }
                }
            });
        }

        scrolledComposite_2.setContent(composite_12);
        scrolledComposite_2.setMinSize(composite_12.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    }

    private void attachMouseScrollButtonListener(final ScrolledComposite scrolledComposite) {
        scrolledComposite.addListener(SWT.MouseWheel, new Listener() {
            @Override
            public void handleEvent(Event event) {
                int wheelCount = event.count;
                wheelCount = (int) Math.ceil(wheelCount / 3.0f);
                while (wheelCount < 0) {
                    scrolledComposite.getVerticalBar().setIncrement(4);
                    wheelCount++;
                }

                while (wheelCount > 0) {
                    scrolledComposite.getVerticalBar().setIncrement(-4);
                    wheelCount--;
                }
            }
        });
    }

    private void copyFieldsWhenCopyOfIsSelected(List<FilterProperties> inputFieldList, String inputPortID) {
        mappingTableItemList.clear();
        for (FilterProperties properties : inputFieldList) {
            LookupMapProperty property = new LookupMapProperty();
            property.setSource_Field(inputPortID + "." + properties.getPropertyname());
            property.setOutput_Field(properties.getPropertyname());
            mappingTableItemList.add(property);
        }
    }

    private void creatFieldMappingSection(Composite composite) {

        Composite composite_2 = new Composite(composite, SWT.NONE);
        GridLayout gl_composite_2 = new GridLayout(1, false);
        gl_composite_2.verticalSpacing = 0;
        gl_composite_2.marginWidth = 0;
        gl_composite_2.marginHeight = 0;
        gl_composite_2.horizontalSpacing = 0;
        composite_2.setLayout(gl_composite_2);
        composite_2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        composite_2.setBounds(0, 0, 64, 64);

        createButtonSectionInFieldMappingSection(composite_2);

        createMappingTableInFieldMappingSection(composite_2);
    }

    private void createMappingTableInFieldMappingSection(Composite composite_2) {
        Composite composite_5 = new Composite(composite_2, SWT.NONE);
        GridLayout gl_composite_5 = new GridLayout(1, false);
        gl_composite_5.verticalSpacing = 0;
        gl_composite_5.marginWidth = 0;
        gl_composite_5.marginHeight = 0;
        gl_composite_5.horizontalSpacing = 0;
        composite_5.setLayout(gl_composite_5);
        composite_5.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        ScrolledComposite scrolledComposite = new ScrolledComposite(composite_5,
                SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        scrolledComposite.setExpandHorizontal(true);
        scrolledComposite.setExpandVertical(true);

        Composite composite_6 = new Composite(scrolledComposite, SWT.NONE);
        GridLayout gl_composite_6 = new GridLayout(1, false);
        gl_composite_6.verticalSpacing = 0;
        gl_composite_6.marginWidth = 0;
        gl_composite_6.marginHeight = 0;
        gl_composite_6.horizontalSpacing = 0;
        composite_6.setLayout(gl_composite_6);

        table = createMappingTable(composite_6);
        attachShortcutListner();

        addTabFunctionalityInMappingTable();

        createInputFieldColumnInMappingTable();
        createOutputFieldColumnInMappingTable();

        setTableLayoutToMappingTable(table);

        mappingTableViewer.setInput(mappingTableItemList);

        attachDropFunctionalityToMappingTable();

        scrolledComposite.setContent(composite_6);
        scrolledComposite.setMinSize(composite_6.computeSize(SWT.DEFAULT, SWT.DEFAULT));

    }

    private void setTableLayoutToMappingTable(Table table) {
        TableColumnLayout layout = new TableColumnLayout();
        mappingTableViewer.getControl().getParent().setLayout(layout);

        for (int columnIndex = 0, n = table.getColumnCount(); columnIndex < n; columnIndex++) {
            table.getColumn(columnIndex).pack();
        }

        for (int i = 0; i < mappingTableViewer.getTable().getColumnCount(); i++) {
            layout.setColumnData(mappingTableViewer.getTable().getColumn(i), new ColumnWeightData(1));
        }
    }

    private void addTabFunctionalityInMappingTable() {
        TableViewerEditor.create(mappingTableViewer, new ColumnViewerEditorActivationStrategy(mappingTableViewer),
                ColumnViewerEditor.KEYBOARD_ACTIVATION | ColumnViewerEditor.TABBING_HORIZONTAL
                        | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | ColumnViewerEditor.TABBING_VERTICAL);
    }

    private Table createMappingTable(Composite composite_6) {
        mappingTableViewer = new TableViewer(composite_6, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
        Table table = mappingTableViewer.getTable();
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        GridData gd_table = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
        gd_table.widthHint = 374;
        table.setLayoutData(gd_table);
        mappingTableViewer.setContentProvider(new ArrayContentProvider());
        ColumnViewerToolTipSupport.enableFor(mappingTableViewer);
        return table;
    }

    private void attachDropFunctionalityToMappingTable() {
        Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
        int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
        DropTarget target = new DropTarget(mappingTableViewer.getTable(), operations);
        target.setTransfer(types);
        target.addDropListener(new DropTargetAdapter() {
            public void dragOver(DropTargetEvent event) {
                event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
            }

            public void drop(DropTargetEvent event) {
                if (event.data == null) {
                    event.detail = DND.DROP_NONE;
                    return;
                }

                String[] dropData = ((String) event.data).split(Pattern.quote(MAPPING_TABLE_ITEM_DELIMILATOR));
                List<String> tempOutputFieldList = getOutputFieldList();

                if (getDuplicateDropAllowed()) {
                    for (String data : dropData) {
                        dropItem(data);
                    }
                } else {
                    for (String data : dropData) {
                        dropItem(data);
                        //Currently, we allowed duplicate values
                        /*if(!tempOutputFieldList.contains(StringUtils.lowerCase(data.split("\\.")[1]))){
                        }
                        else{
                           WidgetUtility.errorMessage(Messages.MAPPING_WINDOW_DUPLICATE_FIELD);
                           break;
                        }*/
                    }
                }
                refreshButtonStatus();
            }
        });
    }

    private void dropItem(String data) {
        LookupMapProperty mappingTableItem = new LookupMapProperty();
        mappingTableItem.setSource_Field(data);
        mappingTableItem.setOutput_Field(data.split("\\.")[1]);
        mappingTableItemList.add(mappingTableItem);
        mappingTableViewer.refresh();
    }

    private List<String> getOutputFieldList() {
        List<String> outputFieldList = new LinkedList<>();
        for (LookupMapProperty lookupMapProperty : mappingTableItemList) {
            outputFieldList.add(StringUtils.lowerCase(lookupMapProperty.getOutput_Field()));
        }
        return outputFieldList;
    }

    private boolean getDuplicateDropAllowed() {
        List<JoinConfigProperty> configObject = (List) component.getProperties().get("join_config");
        if (configObject == null || configObject.size() == 0) {
            return false;
        } else {
            for (int i = 0; i < configObject.size(); i++) {
                if (configObject.get(i).getRecordRequired() == 0) {
                    return false;
                }
            }
        }
        return true;
    }

    private void createOutputFieldColumnInMappingTable() {
        TableViewerColumn tableViewerColumn_1 = new TableViewerColumn(mappingTableViewer, SWT.NONE);
        TableColumn tblclmnPropertyValue = tableViewerColumn_1.getColumn();
        tblclmnPropertyValue.setWidth(148);
        tblclmnPropertyValue.setText(JoinMapDialogConstants.OUTPUT_FIELD);
        outputEditingSupport = new JoinMappingEditingSupport(mappingTableViewer,
                JoinMapDialogConstants.OUTPUT_FIELD);
        WidgetUtility.addVerifyListnerToOutputEditingSupport(outputEditingSupport);
        tableViewerColumn_1.setEditingSupport(outputEditingSupport);
        tableViewerColumn_1.setLabelProvider(new ColumnLabelProvider() {

            String tooltipText;

            @Override
            public Image getImage(Object element) {
                Image image = ImagePathConstant.DELETE_ICON.getImageFromRegistry();

                LookupMapProperty lookupMapProperty = (LookupMapProperty) element;

                if (StringUtils.isBlank(lookupMapProperty.getOutput_Field()))
                    return image;
                else
                    return super.getImage(element);
            }

            private List<String> getOutputFieldList() {
                List<String> outputFieldList = new LinkedList<>();
                for (LookupMapProperty lookupMapProperty : mappingTableItemList) {
                    outputFieldList.add(lookupMapProperty.getOutput_Field());
                }
                return outputFieldList;
            }

            @Override
            public String getToolTipText(Object element) {
                tooltipText = null;

                int occurrences = Collections.frequency(getOutputFieldList(),
                        ((LookupMapProperty) element).getOutput_Field());
                if (occurrences > 1) {
                    tooltipText = FIELD_TOOLTIP_MESSAGE_DUPLICATE_FIELDS;
                }

                LookupMapProperty lookupMapProperty = (LookupMapProperty) element;
                if (StringUtils.isBlank(lookupMapProperty.getSource_Field()))
                    tooltipText = FIELD_TOOLTIP_MESSAGE_FIELD_CANT_BE_EMPTY;

                return tooltipText;
            }

            @Override
            public Color getForeground(Object element) {
                int occurrences = Collections.frequency(getOutputFieldList(),
                        ((LookupMapProperty) element).getOutput_Field());
                if (occurrences > 1) {
                    return CustomColorRegistry.INSTANCE.getColorFromRegistry(255, 0, 0);
                } else {
                    return super.getForeground(element);
                }

            }

            @Override
            public Color getBackground(Object element) {
                LookupMapProperty lookupMapProperty = (LookupMapProperty) element;

                if (StringUtils.isBlank(lookupMapProperty.getOutput_Field()))
                    return CustomColorRegistry.INSTANCE.getColorFromRegistry(0xFF, 0xDD, 0xDD);
                else
                    return super.getBackground(element);
            }

            @Override
            public String getText(Object element) {
                LookupMapProperty lookupMapProperty = (LookupMapProperty) element;

                if (ParameterUtil.isParameter(lookupMapProperty.getOutput_Field()))
                    lookupMapProperty.setSource_Field(lookupMapProperty.getOutput_Field());

                return lookupMapProperty.getOutput_Field();
            }
        });
    }

    private void createInputFieldColumnInMappingTable() {
        TableViewerColumn tableViewerColumn = new TableViewerColumn(mappingTableViewer, SWT.NONE);
        TableColumn tblclmnPropertyName = tableViewerColumn.getColumn();
        tblclmnPropertyName.setWidth(169);
        tblclmnPropertyName.setText(JoinMapDialogConstants.INPUT_FIELD);
        inputEditingSupport = new JoinMappingEditingSupport(mappingTableViewer, JoinMapDialogConstants.INPUT_FIELD);
        tableViewerColumn.setEditingSupport(inputEditingSupport);

        tableViewerColumn.setLabelProvider(new ColumnLabelProvider() {
            String tooltipText;

            @Override
            public Image getImage(Object element) {
                Image image = ImagePathConstant.DELETE_ICON.getImageFromRegistry();

                LookupMapProperty lookupMapProperty = (LookupMapProperty) element;

                if (StringUtils.isBlank(lookupMapProperty.getSource_Field()))
                    return image;
                else
                    return super.getImage(element);
            }

            @Override
            public String getToolTipText(Object element) {
                tooltipText = null;
                LookupMapProperty lookupMapProperty = (LookupMapProperty) element;
                if (!allInputFields.contains(lookupMapProperty.getSource_Field())
                        && !ParameterUtil.isParameter(lookupMapProperty.getSource_Field())) {
                    tooltipText = FIELD_TOOLTIP_MESSAGE_NO_SUCH_INPUT_FIELD;
                }

                if (StringUtils.isBlank(lookupMapProperty.getSource_Field()))
                    tooltipText = FIELD_TOOLTIP_MESSAGE_FIELD_CANT_BE_EMPTY;

                return tooltipText;
            }

            @Override
            public Color getForeground(Object element) {
                LookupMapProperty lookupMapProperty = (LookupMapProperty) element;
                if (!allInputFields.contains(lookupMapProperty.getSource_Field())
                        && !ParameterUtil.isParameter(lookupMapProperty.getSource_Field())) {
                    return CustomColorRegistry.INSTANCE.getColorFromRegistry(255, 0, 0);
                } else {
                    return super.getForeground(element);
                }

            }

            @Override
            public Color getBackground(Object element) {
                LookupMapProperty lookupMapProperty = (LookupMapProperty) element;

                if (StringUtils.isBlank(lookupMapProperty.getSource_Field()))
                    return CustomColorRegistry.INSTANCE.getColorFromRegistry(0xFF, 0xDD, 0xDD);
                else
                    return super.getBackground(element);
            }

            @Override
            public String getText(Object element) {
                LookupMapProperty lookupMapProperty = (LookupMapProperty) element;
                if (ParameterUtil.isParameter(lookupMapProperty.getSource_Field()))
                    lookupMapProperty.setOutput_Field(lookupMapProperty.getSource_Field());

                return lookupMapProperty.getSource_Field();
            }

        });
    }

    private void createButtonSectionInFieldMappingSection(Composite composite) {

        Composite composite_4 = new Composite(composite, SWT.NONE);
        composite_4.setLayout(new GridLayout(2, false));
        GridData gd_composite_4 = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
        gd_composite_4.heightHint = 40;
        composite_4.setLayoutData(gd_composite_4);

        Composite composite_10 = new Composite(composite_4, SWT.NONE);
        GridLayout gl_composite_10 = new GridLayout(1, false);
        gl_composite_10.verticalSpacing = 0;
        gl_composite_10.marginWidth = 0;
        gl_composite_10.marginHeight = 0;
        composite_10.setLayout(gl_composite_10);
        composite_10.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true, 1, 1));

        Label lblMappingView = new Label(composite_10, SWT.NONE);
        lblMappingView.setText("Output Mapping");

        Composite composite_11 = new Composite(composite_4, SWT.NONE);
        GridLayout gl_composite_11 = new GridLayout(5, false);
        gl_composite_11.verticalSpacing = 0;
        gl_composite_11.marginWidth = 0;
        gl_composite_11.marginHeight = 0;
        composite_11.setLayout(gl_composite_11);
        composite_11.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, true, 1, 1));

        createPullButton(composite_11);

        createAddButton(composite_11);

        createDeleteButton(composite_11);

        createUpButton(composite_11);

        createDownButton(composite_11);
    }

    private void deleteRow() {

        Table table = mappingTableViewer.getTable();
        setValueForCellEditor();
        int selectionIndex = table.getSelectionIndex();
        int[] indexs = table.getSelectionIndices();
        if (selectionIndex == -1) {
            WidgetUtility.errorMessage("Select Rows to delete");
        } else {
            table.remove(indexs);
            int itemsRemoved = 0;
            for (int index : indexs) {
                mappingTableItemList.remove(index - itemsRemoved);
                if (index - itemsRemoved - 1 != -1) {
                    table.setSelection(index - itemsRemoved - 1);
                } else {
                    table.setSelection(0);
                }
                itemsRemoved++;
            }
            mappingTableViewer.refresh();
        }
        refreshButtonStatus();

    }

    private void addNewRow() {
        setValueForCellEditor();
        LookupMapProperty lookupMapProperty = new LookupMapProperty();
        lookupMapProperty.setOutput_Field("");
        lookupMapProperty.setSource_Field("");
        if (!mappingTableItemList.contains(lookupMapProperty)) {
            mappingTableItemList.add(lookupMapProperty);
            mappingTableViewer.refresh();
            mappingTableViewer.editElement(lookupMapProperty, 0);
            refreshButtonStatus();
        }
    }

    private void moveRowUp() {

        Table table = mappingTableViewer.getTable();
        setValueForCellEditor();
        int[] indexes = table.getSelectionIndices();
        for (int index : indexes) {

            if (index > 0) {
                Collections.swap((List<LookupMapProperty>) mappingTableItemList, index, index - 1);
                mappingTableViewer.refresh();
            }
        }
        refreshButtonStatus();

    }

    private void moveRowDown() {

        Table table = mappingTableViewer.getTable();
        setValueForCellEditor();
        int[] indexes = table.getSelectionIndices();
        for (int i = indexes.length - 1; i > -1; i--) {

            if (indexes[i] < mappingTableItemList.size() - 1) {
                Collections.swap((List<LookupMapProperty>) mappingTableItemList, indexes[i], indexes[i] + 1);
                mappingTableViewer.refresh();

            }
        }
        refreshButtonStatus();

    }

    private void attachShortcutListner() {
        Control currentControl = table;

        currentControl.addKeyListener(new KeyListener() {

            @Override
            public void keyReleased(KeyEvent event) {
                if (event.keyCode == SWT.CTRL || event.keyCode == SWT.COMMAND) {
                    ctrlKeyPressed = false;
                }
            }

            @Override
            public void keyPressed(KeyEvent event) {
                if (event.keyCode == SWT.CTRL || event.keyCode == SWT.COMMAND) {
                    ctrlKeyPressed = true;
                }

                if (ctrlKeyPressed && event.keyCode == Constants.KEY_D) {
                    deleteRow();
                }

                else if (ctrlKeyPressed && event.keyCode == Constants.KEY_N) {
                    addNewRow();
                }

                else if (ctrlKeyPressed && event.keyCode == SWT.ARROW_UP) {
                    moveRowUp();
                }

                else if (ctrlKeyPressed && event.keyCode == SWT.ARROW_DOWN) {
                    moveRowDown();
                }
            }
        });
    }

    private void createPullButton(Composite composite_11) {
        btnPull = new Button(composite_11, SWT.NONE);
        btnPull.setImage(ImagePathConstant.PULL_BUTTON.getImageFromRegistry());
        btnPull.setToolTipText(PULL_TOOLTIP);

        btnPull.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                List<LookupMapProperty> mappingTableItemListCopy = new LinkedList<>();
                mappingTableItemListCopy.addAll(mappingTableItemList);
                mappingTableItemList.clear();
                mappingTableViewer.refresh();

                Schema schema = (Schema) component.getProperties().get(Constants.SCHEMA_PROPERTY_NAME);
                if (schema == null) {
                    return;
                }
                List<String> schemaFieldList = getSchemaFieldList(schema);
                if (schemaFieldList.size() == 0) {
                    return;
                }

                for (String fieldName : schemaFieldList) {
                    LookupMapProperty row = getMappingTableItem(mappingTableItemListCopy, fieldName);
                    if (row != null) {
                        mappingTableItemList.add(row);
                    } else {
                        row = new LookupMapProperty();
                        row.setSource_Field("");
                        row.setOutput_Field(fieldName);
                        mappingTableItemList.add(row);
                    }
                }

                mappingTableViewer.refresh();

            }

            private List<String> getSchemaFieldList(Schema schema) {
                List<String> schemaFieldList = new LinkedList<>();

                for (GridRow gridRow : schema.getGridRow()) {
                    schemaFieldList.add(gridRow.getFieldName());
                }
                return schemaFieldList;
            }
        });
    }

    private LookupMapProperty getMappingTableItem(List<LookupMapProperty> mappingTableItemListClone,
            String fieldName) {
        for (LookupMapProperty row : mappingTableItemListClone) {
            if (StringUtils.equals(fieldName, row.getOutput_Field())) {
                return row;
            }
        }
        return null;
    }

    private void createDownButton(Composite composite_11) {
        btnDown = new Button(composite_11, SWT.NONE);
        btnDown.setToolTipText(Messages.MOVE_DOWN_KEY_SHORTCUT_TOOLTIP);
        btnDown.setImage(ImagePathConstant.MOVEDOWN_BUTTON.getImageFromRegistry());

        btnDown.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                moveRowDown();
            }
        });
    }

    private void createUpButton(Composite composite_11) {
        btnUp = new Button(composite_11, SWT.NONE);
        btnUp.setToolTipText(Messages.MOVE_UP_KEY_SHORTCUT_TOOLTIP);
        btnUp.setImage(ImagePathConstant.MOVEUP_BUTTON.getImageFromRegistry());
        btnUp.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                moveRowUp();
            }
        });
    }

    private void createDeleteButton(Composite composite_11) {

        btnDelete = new Button(composite_11, SWT.NONE);
        btnDelete.setToolTipText(Messages.DELETE_KEY_SHORTCUT_TOOLTIP);
        btnDelete.setImage(ImagePathConstant.DELETE_BUTTON.getImageFromRegistry());

        btnDelete.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                deleteRow();
            }
        });
    }

    private void createAddButton(Composite composite_11) {
        btnAdd = new Button(composite_11, SWT.NONE);
        btnAdd.setToolTipText(Messages.ADD_KEY_SHORTCUT_TOOLTIP);
        btnAdd.setImage(ImagePathConstant.ADD_BUTTON.getImageFromRegistry());
        btnAdd.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                addNewRow();
            }
        });
    }

    private void createInputFieldExpandBarSection(Composite composite) {
        Composite composite_1 = new Composite(composite, SWT.NONE);
        GridLayout gl_composite_1 = new GridLayout(1, false);
        gl_composite_1.horizontalSpacing = 0;
        gl_composite_1.verticalSpacing = 0;
        gl_composite_1.marginWidth = 0;
        gl_composite_1.marginHeight = 0;
        composite_1.setLayout(gl_composite_1);
        GridData gd_composite_1 = new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1);
        gd_composite_1.widthHint = 276;
        composite_1.setLayoutData(gd_composite_1);
        composite_1.setBounds(0, 0, 64, 64);

        final ScrolledComposite scrolledComposite_1 = new ScrolledComposite(composite_1, SWT.BORDER | SWT.V_SCROLL);
        scrolledComposite_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        scrolledComposite_1.setExpandHorizontal(true);
        scrolledComposite_1.setExpandVertical(true);

        Composite composite_7 = new Composite(scrolledComposite_1, SWT.NONE);
        composite_7.setLayout(new GridLayout(1, false));

        final ExpandBar expandBar = new ExpandBar(composite_7, SWT.H_SCROLL);
        expandBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        expandBar.setBackground(CustomColorRegistry.INSTANCE.getColorFromRegistry(240, 240, 240));
        populateInputFieldExpandBarSection(expandBar);

        expandBar.getItem(0).setExpanded(true);

        scrolledComposite_1.setContent(composite_7);
        scrolledComposite_1.setMinSize(composite_7.computeSize(SWT.DEFAULT, SWT.DEFAULT));

        composite_7.addControlListener(new ControlAdapter() {
            @Override
            public void controlResized(ControlEvent e) {

                for (ExpandItem expandItem : expandBar.getItems()) {
                    ((TableColumn) expandItem.getData("TableColumn")).setWidth(scrolledComposite_1.getSize().x);
                }
            }
        });
    }

    private void populateInputFieldExpandBarSection(ExpandBar expandBar) {
        List<FilterProperties> inputPortFieldList = null;
        String count = (String) component.getProperties().get(Constants.INPUT_PORT_COUNT_PROPERTY);
        inputPortValue = Integer.valueOf(count);
        for (int i = 0; i < inputPortValue; i++) {
            if (joinMappingGrid != null) {
                if (joinMappingGrid.getLookupInputProperties() != null
                        && !joinMappingGrid.getLookupInputProperties().isEmpty()) {
                    if (i < joinMappingGrid.getLookupInputProperties().size())
                        inputPortFieldList = joinMappingGrid.getLookupInputProperties().get(i);
                    else
                        inputPortFieldList = new ArrayList<>();
                } else {
                    inputPortFieldList = new ArrayList<>();
                }
            }
            if (inputPorts != null) {
                inputPorts.add(inputPortFieldList);
                if (inputPortFieldList != null) {
                    for (FilterProperties inputField : inputPortFieldList) {
                        allInputFields.add(INPUT_PORT_ID_PREFIX + i + "." + inputField.getPropertyname());
                    }
                }

            }

            addExpandItem(expandBar, inputPortFieldList, i);
        }
    }

    private void addExpandItem(ExpandBar expandBar, List<FilterProperties> inputPortFieldList, int portNumber) {
        ExpandItem xpndtmItem = new ExpandItem(expandBar, SWT.NONE);
        xpndtmItem.setText(EXPAND_ITEM_TEXT_PREFIX + portNumber);

        Composite composite_13 = new Composite(expandBar, SWT.NONE);
        xpndtmItem.setControl(composite_13);
        composite_13.setLayout(new GridLayout(1, false));

        TableViewer tableViewer_1 = new TableViewer(composite_13, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
        final Table table_1 = tableViewer_1.getTable();
        table_1.setLinesVisible(true);
        table_1.setHeaderVisible(true);
        table_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        tableViewer_1.setContentProvider(new ArrayContentProvider());

        TableViewerColumn tableViewerColumn_2 = new TableViewerColumn(tableViewer_1, SWT.NONE);

        TableColumn tblclmnInputFields = tableViewerColumn_2.getColumn();

        tblclmnInputFields.setText(INPUT_TABLE_COLUMN_TEXT);

        tableViewerColumn_2.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                FilterProperties tableField = (FilterProperties) element;
                return tableField.getPropertyname();
            }
        });

        tableViewer_1.setInput(inputPortFieldList);
        xpndtmItem.setData("TableColumn", table_1.getColumn(0));

        Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
        final String portLabel = INPUT_PORT_ID_PREFIX + portNumber + ".";
        int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
        // final Table table = (Table) sourceControl;
        DragSource source = new DragSource(table_1, operations);
        source.setTransfer(types);
        source.addDragListener(new DragSourceAdapter() {
            public void dragSetData(DragSourceEvent event) {
                // Set the data to be the first selected item's text
                event.data = addDelimeter(portLabel, table_1.getSelection());
            }
        });

        xpndtmItem.setHeight(190);
        xpndtmItem.setExpanded(true);

        table_1.addControlListener(new ControlListener() {

            @Override
            public void controlResized(ControlEvent e) {
                Table table = (Table) e.widget;
                Rectangle area = table.getClientArea();
                int totalAreaWidth = area.width;
                int diff = totalAreaWidth - (table.getColumn(0).getWidth());
                table.getColumn(0).setWidth(diff + table.getColumn(0).getWidth());
            }

            @Override
            public void controlMoved(ControlEvent e) {
            }
        });
    }

    private String addDelimeter(String portLabel, TableItem[] selectedTableItems) {
        StringBuffer buffer = new StringBuffer();
        for (TableItem tableItem : selectedTableItems) {
            buffer.append(portLabel + tableItem.getText() + MAPPING_TABLE_ITEM_DELIMILATOR);
        }
        return buffer.toString();
    }

    /**
     * Create contents of the button bar.
     * 
     * @param parent
     */
    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    @Override
    protected void okPressed() {

        setValueForCellEditor();
        joinMappingGrid.setLookupInputProperties(inputPorts);
        joinMappingGrid.setLookupMapProperties(mappingTableItemList);

        populateCurrentItemsOfTable();

        if (!oldJoinMappingGrid.equals(newJoinMappingGrid)) {
            propertyDialogButtonBar.enableApplyButton(true);
        }
        super.okPressed();
    }

    @Override
    protected void cancelPressed() {
        joinMappingGrid.setLookupInputProperties(oldJoinMappingGrid.getLookupInputProperties());
        joinMappingGrid.setLookupMapProperties(oldJoinMappingGrid.getLookupMapProperties());
        super.cancelPressed();
    }

    private void populateJoinMapDialog() {

        if (joinMappingGrid.getLookupMapProperties() != null
                && !joinMappingGrid.getLookupMapProperties().isEmpty()) {
            mappingTableItemList = joinMappingGrid.getLookupMapProperties();
        } else {
            mappingTableItemList = new LinkedList<>();
        }

        if (joinMappingGrid.getButtonText() != null
                && !StringUtils.equals(joinMappingGrid.getButtonText(), NO_COPY)) {
            radioButtonMap.get(joinMappingGrid.getButtonText()).setSelection(true);
            mappingTableViewer.getTable().setEnabled(false);
            enableMappingTableButtonPanel(false);
            String inputPortID = StringUtils.remove(joinMappingGrid.getButtonText(),
                    Constants.COPY_FROM_INPUT_PORT_PROPERTY);
            copyFieldsWhenCopyOfIsSelected(
                    inputPorts.get(Integer.parseInt(StringUtils.remove(inputPortID, Constants.INPUT_SOCKET_TYPE))),
                    inputPortID);

        } else {
            radioButtonMap.get(NO_COPY).setSelection(true);
        }

        mappingTableViewer.setInput(mappingTableItemList);

        mappingTableViewer.refresh();

        populatePreviousItemsOfTable();

        mouseDoubleClick();
    }

    private void mouseDoubleClick() {
        mappingTableViewer.getTable().addMouseListener(new MouseListener() {

            @Override
            public void mouseUp(MouseEvent e) {
            }

            @Override
            public void mouseDown(MouseEvent e) {
            }

            @Override
            public void mouseDoubleClick(MouseEvent e) {
                addNewRow();
            }
        });

        if (mappingTableViewer.getTable().getEnabled()) {
            refreshButtonStatus();
        }

    }

    private void populatePreviousItemsOfTable() {
        oldJoinMappingGrid = joinMappingGrid.clone();
    }

    private void populateCurrentItemsOfTable() {
        newJoinMappingGrid = joinMappingGrid.clone();
    }

    private void enableMappingTableButtonPanel(boolean enabled) {
        btnAdd.setEnabled(enabled);
        btnDelete.setEnabled(enabled);
        btnDown.setEnabled(enabled);
        btnUp.setEnabled(enabled);
        btnPull.setEnabled(enabled);
    }

    private void refreshButtonStatus() {
        if (mappingTableItemList.size() >= 1) {
            btnDelete.setEnabled(true);
        }

        if (mappingTableItemList.size() > 1) {
            btnDown.setEnabled(true);
            btnUp.setEnabled(true);
        }
        if (mappingTableItemList.size() == 0) {
            btnDelete.setEnabled(false);
            btnDown.setEnabled(false);
            btnUp.setEnabled(false);
        }

    }

    private void setValueForCellEditor() {

        if (outputEditingSupport != null && outputEditingSupport.getEditor() != null) {
            outputEditingSupport.getEditor().getControl().setEnabled(false);
            outputEditingSupport.getEditor().getControl().setEnabled(true);
        }

        if (inputEditingSupport != null && inputEditingSupport.getEditor() != null) {
            inputEditingSupport.getEditor().getControl().setEnabled(false);
            inputEditingSupport.getEditor().getControl().setEnabled(true);
        }
    }

    @Override
    protected Point getInitialSize() {
        return new Point(800, 500);
    }
}