hydrograph.ui.propertywindow.widgets.customwidgets.joinproperty.JoinMapGrid.java Source code

Java tutorial

Introduction

Here is the source code for hydrograph.ui.propertywindow.widgets.customwidgets.joinproperty.JoinMapGrid.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.customwidgets.joinproperty;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
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.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellEditorValidator;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.dnd.DND;
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.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseTrackListener;
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.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
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.MessageBox;
import org.eclipse.swt.widgets.Shell;
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.OSValidator;
import hydrograph.ui.common.util.ParameterUtil;
import hydrograph.ui.datastructure.property.FilterProperties;
import hydrograph.ui.datastructure.property.JoinMappingGrid;
import hydrograph.ui.datastructure.property.LookupMapProperty;
import hydrograph.ui.propertywindow.messages.Messages;
import hydrograph.ui.propertywindow.propertydialog.PropertyDialogButtonBar;
import hydrograph.ui.propertywindow.widgets.customwidgets.ELTJoinWidget;
import hydrograph.ui.propertywindow.widgets.customwidgets.joinlookupproperty.JoinContentProvider;
import hydrograph.ui.propertywindow.widgets.customwidgets.joinlookupproperty.LookupCellModifier;
import hydrograph.ui.propertywindow.widgets.customwidgets.joinlookupproperty.LookupLabelProvider;
import hydrograph.ui.propertywindow.widgets.filterproperty.ELTCellModifier;
import hydrograph.ui.propertywindow.widgets.filterproperty.ELTFilterContentProvider;
import hydrograph.ui.propertywindow.widgets.filterproperty.ELTFilterLabelProvider;
import hydrograph.ui.propertywindow.widgets.gridwidgets.basic.ELTSWTWidgets;

public class JoinMapGrid extends Dialog {

    private static final String NONE = "None";
    private Label errorLabel;
    private TableViewer outputTableViewer;
    private int j = 20;
    private Button okButton;
    private int inputPortValue = ELTJoinWidget.value;
    private TableViewer[] inputTableViewer = new TableViewer[inputPortValue];
    private Button[] radio = new Button[inputPortValue + 1];
    private Composite expandItemComposite;

    public static final String OPERATIONAL_INPUT_FIELD = "Field Name";
    protected static final String ERROR = null;
    public static String PROPERTY_NAME = "Source Field";
    public static String PROPERTY_VALUE = "Output Field";
    private String[] COLUMN_NAME = { PROPERTY_NAME, PROPERTY_VALUE };
    private String[] INPUT_COLUMN_NAME = { OPERATIONAL_INPUT_FIELD };
    private String previousRadioButtonSelection = NONE;
    private List<FilterProperties> joinInputList;
    private List<LookupMapProperty> joinOutputList;
    private List<List<FilterProperties>> joinInputSchemaList = new ArrayList<>();
    private ELTSWTWidgets widget = new ELTSWTWidgets();
    private JoinMappingGrid joinMappingGrid;
    private static final String INFORMATION = "Information";
    private TableItem[] previousItems;
    private TableItem[] currentItems;
    private PropertyDialogButtonBar propertyDialogButtonBar;
    private List<String> nonMappedFieldList = new ArrayList<>();
    private HashMap<String, List<String>> inputFieldMap = new HashMap<String, List<String>>();
    private String IN = "in";
    private Button deleteButton;
    private Button upButton;
    private Button downButton;

    /**
     * Create the dialog.
     * 
     * @param parentShell
     * @param propertyDialogButtonBar 
     */
    public JoinMapGrid(Shell parentShell, JoinMappingGrid joinPropertyGrid,
            PropertyDialogButtonBar propertyDialogButtonBar) {
        super(parentShell);

        setShellStyle(SWT.CLOSE | SWT.RESIZE | SWT.TITLE | SWT.WRAP | SWT.APPLICATION_MODAL);
        this.joinMappingGrid = joinPropertyGrid;
        this.propertyDialogButtonBar = propertyDialogButtonBar;

    }

    public void getJoinPropertyGrid() {
        joinMappingGrid.setLookupInputProperties(joinInputSchemaList);
        joinMappingGrid.setLookupMapProperties(joinOutputList);
    }

    /**
     * Create contents of the dialog.
     * 
     * @param parent
     */
    @Override
    protected Control createDialogArea(Composite parent) {
        final Composite container = (Composite) super.createDialogArea(parent);
        container.getShell().setText("Join Mapping");
        container.setFocus();
        container.setLayout(new GridLayout(6, false));
        new Label(container, SWT.NONE);
        new Label(container, SWT.NONE);
        new Label(container, SWT.NONE);
        new Label(container, SWT.NONE);
        new Label(container, SWT.NONE);
        new Label(container, SWT.NONE);
        new Label(container, SWT.NONE);

        Composite composite = new Composite(container, SWT.None);
        composite.setLayout(new GridLayout(1, false));
        GridData gd_composite = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_composite.heightHint = 595;
        gd_composite.widthHint = 281;
        composite.setLayoutData(gd_composite);

        final ScrolledComposite scrolledComposite = new ScrolledComposite(composite, SWT.BORDER | SWT.V_SCROLL);
        GridData gd_scrolledComposite = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_scrolledComposite.heightHint = 542;
        gd_scrolledComposite.widthHint = 240;
        scrolledComposite.setLayoutData(gd_scrolledComposite);
        scrolledComposite.setExpandHorizontal(true);
        scrolledComposite.setExpandVertical(true);

        final ExpandBar expandBar = new ExpandBar(scrolledComposite, SWT.NONE);
        expandBar.setLayoutData(new RowData(200, 550));

        for (int i = 0; i < inputPortValue; i++) {
            if (joinMappingGrid != null) {
                if (joinMappingGrid.getLookupInputProperties() != null
                        && !joinMappingGrid.getLookupInputProperties().isEmpty()) {
                    if (i < joinMappingGrid.getLookupInputProperties().size())
                        joinInputList = joinMappingGrid.getLookupInputProperties().get(i);
                    else
                        joinInputList = new ArrayList<>();
                } else {
                    joinInputList = new ArrayList<>();
                }
            }
            if (joinInputSchemaList != null) {
                joinInputSchemaList.add(joinInputList);
            }
            expandItemComposite = (Composite) createComposite(expandBar, joinInputList, i);
        }

        if (joinMappingGrid.getLookupMapProperties() != null
                && !joinMappingGrid.getLookupMapProperties().isEmpty()) {
            joinOutputList = joinMappingGrid.getLookupMapProperties();
        } else {
            joinOutputList = new ArrayList<>();
        }
        expandBar.getItem(0).setExpanded(true);
        expandBar.setBackground(CustomColorRegistry.INSTANCE.getColorFromRegistry(250, 250, 250));
        Listener updateScrolledSize = new Listener() {
            @Override
            public void handleEvent(Event arg0) {
                Display.getDefault().asyncExec(new Runnable() {
                    @Override
                    public void run() {
                        scrolledComposite.setMinSize(expandBar.computeSize(SWT.DEFAULT, SWT.DEFAULT));
                    }
                });
            }
        };

        expandBar.addListener(SWT.Expand, updateScrolledSize);
        expandBar.addListener(SWT.Collapse, updateScrolledSize);
        expandBar.addKeyListener(new KeyListener() {

            @Override
            public void keyReleased(KeyEvent event) {
            }

            @Override
            public void keyPressed(KeyEvent event) {
                if (event.character == SWT.ESC) {
                    close();
                    event.doit = false;
                }
            }
        });
        scrolledComposite.setContent(expandBar);
        scrolledComposite.setMinSize(expandBar.computeSize(SWT.DEFAULT, SWT.DEFAULT));

        errorLabel = new Label(composite, SWT.None);
        errorLabel.setAlignment(SWT.LEFT_TO_RIGHT);
        GridData gd_lblNewLabel_1 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_lblNewLabel_1.heightHint = 20;
        gd_lblNewLabel_1.widthHint = 260;
        errorLabel.setLayoutData(gd_lblNewLabel_1);
        errorLabel.setForeground(CustomColorRegistry.INSTANCE.getColorFromRegistry(255, 0, 0));
        errorLabel.setText("PropertyError");
        errorLabel.setVisible(false);
        new Label(container, SWT.NONE);

        Composite composite_1 = new Composite(container, SWT.None);
        GridData gd_composite_1 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_composite_1.widthHint = 398;
        gd_composite_1.heightHint = 596;
        composite_1.setLayoutData(gd_composite_1);

        Composite composite_5 = new Composite(composite_1, SWT.None);
        composite_5.setBounds(290, 4, 100, 24);
        createLabel(composite_5);

        outputTableViewer = widget.createTableViewer(composite_1, COLUMN_NAME, new int[] { 0, 30, 398, 538 }, 196,
                new JoinContentProvider(), new LookupLabelProvider());

        Label lblNewLabel = new Label(composite_1, SWT.NONE);
        lblNewLabel.setBounds(10, 11, 92, 15);
        lblNewLabel.setText("Output Mapping");
        outputTableViewer.getTable().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseDoubleClick(MouseEvent e) {
                joinOutputProperty(outputTableViewer, null);
                changeColorOfNonMappedFields();
                if (joinOutputList.size() >= 1) {
                    deleteButton.setEnabled(true);
                }
                if (joinOutputList.size() >= 2) {
                    upButton.setEnabled(true);
                    downButton.setEnabled(true);
                }
            }

            @Override
            public void mouseDown(MouseEvent e) {
                validateDuplicatesInOutputField();
                getListOfNonMappedFields(inputFieldMap);
                changeColorOfNonMappedFields();
            }
        });
        widget.createTableColumns(outputTableViewer.getTable(), COLUMN_NAME, 196);
        CellEditor[] editors = widget.createCellEditorList(outputTableViewer.getTable(), 2);
        editors[0].setValidator(
                sourceEditorValidator(outputTableViewer, Messages.EmptySourceFieldNotification, joinOutputList));
        editors[1].setValidator(outputFieldEditorValidator(outputTableViewer, Messages.EmptySourceFieldNotification,
                joinOutputList));
        outputTableViewer.setColumnProperties(COLUMN_NAME);
        outputTableViewer.setCellModifier(new LookupCellModifier(outputTableViewer));
        outputTableViewer.setCellEditors(editors);
        outputTableViewer.setInput(joinOutputList);
        outputTableViewer.getTable().addListener(SWT.Selection, new Listener() {
            @Override
            public void handleEvent(Event event) {
                if (((TableItem) event.item) != null) {
                    if (StringUtils.isNotBlank(((TableItem) event.item).getText())) {
                        String[] data = (((TableItem) event.item).getText()).split(Pattern.quote("."));
                        if (data != null && data.length == 2) {
                            FilterProperties filter = new FilterProperties();
                            filter.setPropertyname(data[1]);
                            for (int i = 0; i < inputPortValue; i++) {
                                if (joinInputSchemaList != null) {
                                    if (joinInputSchemaList.get(i).contains(filter)) {
                                        ExpandItem item = expandBar.getItem(i);
                                        item.setExpanded(true);
                                        inputTableViewer[i].getTable()
                                                .setSelection(joinInputSchemaList.get(i).indexOf(filter));
                                    }
                                }
                            }
                        }
                    }
                }
            }
        });
        errorLabel = new Label(composite_1, SWT.None);
        errorLabel.setBounds(0, 576, 350, 25);
        errorLabel.setForeground(CustomColorRegistry.INSTANCE.getColorFromRegistry(255, 0, 0));
        errorLabel.setVisible(false);

        new Label(container, SWT.NONE);

        Composite composite_2 = new Composite(container, SWT.BORDER);
        composite_2.setLayout(new RowLayout(SWT.HORIZONTAL));
        GridData gd_composite_2 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_composite_2.heightHint = 595;
        gd_composite_2.widthHint = 133;
        composite_2.setLayoutData(gd_composite_2);

        ScrolledComposite scrolledComposite_1 = new ScrolledComposite(composite_2, SWT.BORDER | SWT.V_SCROLL);
        scrolledComposite_1.setLayoutData(new RowData(100, 564));

        Composite composite_3 = new Composite(scrolledComposite_1, SWT.BORDER);
        composite_3.setLayout(new RowLayout(SWT.VERTICAL));

        radio[0] = widget.buttonWidget(composite_3, SWT.RADIO, new int[] { 0, 0, 90, 20 }, NONE);
        for (int i = 1, k = 0; i < radio.length; i++, k++) {
            radio[i] = widget.buttonWidget(composite_3, SWT.RADIO, new int[] { 0, j, 90, 20 },
                    Constants.COPY_FROM_INPUT_PORT_PROPERTY + "in" + k);
            j = j + 20;
        }
        scrolledComposite_1.setContent(composite_3);
        scrolledComposite_1.setExpandHorizontal(true);
        scrolledComposite_1.setExpandVertical(true);
        scrolledComposite_1.setMinSize(composite_3.computeSize(SWT.DEFAULT, SWT.DEFAULT));

        for (int i = 0; i < radio.length; i++) {
            final int inPortIndex = i;
            radio[i].addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent event) {

                    Button button = (Button) event.widget;
                    button.getSelection();
                    if (button.getSelection()) {
                        if (NONE.equalsIgnoreCase(button.getText())) {
                            outputTableViewer.getTable().setEnabled(true);
                            joinMappingGrid.setButtonText(button.getText());
                            joinMappingGrid.setIsSelected(false);
                            if (!NONE.equals(previousRadioButtonSelection)) {
                                joinOutputList.clear();
                                outputTableViewer.refresh();
                            }
                            previousRadioButtonSelection = NONE;
                        } else {
                            okButton.setEnabled(true);
                            errorLabel.setVisible(false);
                            radio[0].setSelection(false);
                            outputTableViewer.getTable().setEnabled(false);
                            joinMappingGrid.setButtonText(button.getText());
                            joinMappingGrid.setIsSelected(true);
                            addAllFieldsFromSocketId(inPortIndex - 1);
                        }
                    }
                }
            });
        }
        populate();
        if (joinOutputList != null) {
            dropData(outputTableViewer, joinOutputList, true);
        }
        populatePreviousItemsOfTable();

        outputTableViewer.getTable().addMouseTrackListener(new MouseTrackListener() {

            @Override
            public void mouseHover(MouseEvent e) {
                changeColorOfNonMappedFields();
            }

            @Override
            public void mouseExit(MouseEvent e) {
                changeColorOfNonMappedFields();

            }

            @Override
            public void mouseEnter(MouseEvent e) {
                changeColorOfNonMappedFields();
            }
        });

        inputFieldMap = setMapOfInputFieldsPerPort();
        nonMappedFieldList = getListOfNonMappedFields(inputFieldMap);
        return container;
    }

    public void changeColorOfNonMappedFields() {
        if (outputTableViewer.getTable().getItems() != null) {
            TableItem[] items = outputTableViewer.getTable().getItems();
            for (int i = 0; i < joinOutputList.size(); i++) {
                for (String sourceField : nonMappedFieldList) {
                    if (joinOutputList.get(i).getSource_Field().equalsIgnoreCase(sourceField)
                            && !ParameterUtil.isParameter(sourceField)) {
                        items[i].setForeground(0, CustomColorRegistry.INSTANCE.getColorFromRegistry(255, 0, 0));
                    }
                }
            }
        }
    }

    private List<String> getListOfNonMappedFields(HashMap<String, List<String>> inputFieldMap) {
        Iterator<Entry<String, List<String>>> iterator = inputFieldMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry portFieldPair = (Map.Entry) iterator.next();
            for (LookupMapProperty lookupMapProperty : joinOutputList) {
                String port = "";
                if (lookupMapProperty.getSource_Field().length() >= 3) {
                    port = lookupMapProperty.getSource_Field().substring(0, 3);
                }
                String source_field = lookupMapProperty.getSource_Field()
                        .substring(lookupMapProperty.getSource_Field().lastIndexOf(".") + 1);
                if (portFieldPair.getKey().equals(port)) {
                    List<String> value = (ArrayList<String>) portFieldPair.getValue();
                    if (!value.isEmpty() && !checkIfSourceFieldExists(value, source_field)) {
                        nonMappedFieldList.add(port + "." + source_field);
                    }
                } else {
                    nonMappedFieldList.add(source_field);
                }
                if (port.equalsIgnoreCase("")) {
                    nonMappedFieldList.add(source_field);
                }
            }
        }
        return nonMappedFieldList;
    }

    private boolean checkIfSourceFieldExists(List<String> list, String sourceField) {
        for (String field : list) {
            if (field.equalsIgnoreCase(sourceField)) {
                return true;
            }
        }
        return false;
    }

    private HashMap<String, List<String>> setMapOfInputFieldsPerPort() {
        HashMap<String, List<String>> inputFieldMap = new HashMap<String, List<String>>();
        int j = 0;
        for (List<FilterProperties> inputFieldList : joinInputSchemaList) {
            List<String> inputFieldListPerPort = new ArrayList<>();
            for (FilterProperties inputField : inputFieldList) {
                for (LookupMapProperty lookupMapProperty : joinOutputList) {
                    char charactor = ' ';
                    if (lookupMapProperty.getSource_Field().length() >= 3) {
                        charactor = lookupMapProperty.getSource_Field().charAt(2);
                    }
                    if (Character.toString(charactor).equalsIgnoreCase(Integer.toString(j))) {
                        if (!inputFieldListPerPort.contains(inputField.getPropertyname())) {
                            inputFieldListPerPort.add(inputField.getPropertyname());
                        }
                    }
                }
            }
            inputFieldMap.put(IN + j, inputFieldListPerPort);
            j++;
        }
        return inputFieldMap;
    }

    private void populatePreviousItemsOfTable() {
        if (outputTableViewer.getTable().getItems() != null) {
            previousItems = outputTableViewer.getTable().getItems();
        }
    }

    private void populateCurrentItemsOfTable() {
        if (outputTableViewer.getTable().getItems() != null) {
            currentItems = outputTableViewer.getTable().getItems();
        }
    }

    private void addAllFieldsFromSocketId(int inSocketIndex) {
        List<FilterProperties> inputFieldList = joinInputSchemaList.get(inSocketIndex);
        LookupMapProperty property = null;
        if (inputFieldList != null) {
            joinOutputList.clear();
            previousRadioButtonSelection = Constants.INPUT_SOCKET_TYPE + inSocketIndex;
            for (FilterProperties properties : inputFieldList) {
                property = new LookupMapProperty();
                property.setSource_Field(previousRadioButtonSelection + "." + properties.getPropertyname());
                property.setOutput_Field(properties.getPropertyname());
                joinOutputList.add(property);
            }
            outputTableViewer.refresh();
        }
    }

    private void populate() {
        Boolean radioButtonSelected = false;

        for (int i = 0; i < radio.length; i++) {
            if (StringUtils.isNotBlank(joinMappingGrid.getButtonText())) {
                if (joinMappingGrid.getButtonText().equalsIgnoreCase(radio[i].getText()))
                    if (joinMappingGrid.getButtonText().equalsIgnoreCase("None")) {
                        radio[0].setSelection(true);
                        outputTableViewer.getTable().setEnabled(true);
                    } else {
                        radio[i].setSelection(true);
                        outputTableViewer.getTable().setEnabled(false);
                        radioButtonSelected = true;
                    }
            } else {
                radio[i].setSelection(false);
            }
        }
        if (!radioButtonSelected) {
            radio[0].setSelection(true);
            outputTableViewer.getTable().setEnabled(true);
        }
        if (joinOutputList.size() != 0) {
            deleteButton.setEnabled(true);
        } else {
            deleteButton.setEnabled(false);
        }
        if (joinOutputList.size() >= 2) {
            upButton.setEnabled(true);
            downButton.setEnabled(true);
        } else {
            upButton.setEnabled(false);
            downButton.setEnabled(false);
        }

    }

    private Control createComposite(ExpandBar expandBar, final List<FilterProperties> joinInputList,
            final int tableViewerIndex) {

        ExpandItem xpndtmItem = new ExpandItem(expandBar, SWT.NONE);
        xpndtmItem.setText("Input index : in" + tableViewerIndex);

        Composite comGrid = new Composite(expandBar, SWT.BORDER);
        comGrid.setBounds(15, 0, 226, 200);

        xpndtmItem.setControl(comGrid);
        xpndtmItem.setHeight(270);
        xpndtmItem.setExpanded(false);

        inputTableViewer[tableViewerIndex] = widget.createTableViewer(comGrid, INPUT_COLUMN_NAME,
                new int[] { 7, 7, 229, 251 }, 224, new ELTFilterContentProvider(), new ELTFilterLabelProvider());

        inputTableViewer[tableViewerIndex].getTable().addMouseTrackListener(new MouseTrackListener() {

            @Override
            public void mouseHover(MouseEvent e) {
                changeColorOfNonMappedFields();

            }

            @Override
            public void mouseExit(MouseEvent e) {
                changeColorOfNonMappedFields();

            }

            @Override
            public void mouseEnter(MouseEvent e) {
                changeColorOfNonMappedFields();

            }
        });
        widget.createTableColumns(inputTableViewer[tableViewerIndex].getTable(), INPUT_COLUMN_NAME, 224);
        CellEditor[] editors = widget.createCellEditorList(inputTableViewer[tableViewerIndex].getTable(), 1);
        editors[0].setValidator(inputSchemaEditorValidation(joinInputList, Messages.EmptySourceFieldNotification,
                inputTableViewer[tableViewerIndex]));
        inputTableViewer[tableViewerIndex].setCellModifier(new ELTCellModifier(inputTableViewer[tableViewerIndex]));
        inputTableViewer[tableViewerIndex].setColumnProperties(INPUT_COLUMN_NAME);
        inputTableViewer[tableViewerIndex].setCellEditors(editors);
        inputTableViewer[tableViewerIndex].setInput(joinInputList);
        widget.applyDragFromTableViewer(inputTableViewer[tableViewerIndex].getTable(), tableViewerIndex);

        return comGrid;
    }

    private void createLabel(Composite parent) {
        Button addButton = widget.buttonWidget(parent, SWT.CENTER | SWT.PUSH, new int[] { 0, 0, 25, 20 }, "");
        addButton.setImage(ImagePathConstant.ADD_BUTTON.getImageFromRegistry());
        addButton.setToolTipText(Messages.ADD_SCHEMA_TOOLTIP);

        addButton.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseUp(MouseEvent e) {
                joinOutputProperty(outputTableViewer, null);
                if (joinOutputList.size() >= 1) {
                    deleteButton.setEnabled(true);
                }
                if (joinOutputList.size() >= 2) {
                    upButton.setEnabled(true);
                    downButton.setEnabled(true);
                }
            }
        });

        deleteButton = widget.buttonWidget(parent, SWT.CENTER, new int[] { 25, 0, 25, 20 }, "");
        deleteButton.setImage(ImagePathConstant.DELETE_BUTTON.getImageFromRegistry());
        deleteButton.setToolTipText(Messages.DELETE_SCHEMA_TOOLTIP);
        deleteButton.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseUp(MouseEvent e) {
                int index = 0;
                IStructuredSelection selection = (IStructuredSelection) outputTableViewer.getSelection();
                for (Iterator<?> iterator = selection.iterator(); iterator.hasNext();) {
                    Object selectedObject = iterator.next();
                    index = joinOutputList.indexOf(selectedObject);
                    outputTableViewer.remove(selectedObject);
                    joinOutputList.remove(selectedObject);
                }
                outputTableViewer.refresh();
                if (index != 0)
                    outputTableViewer.editElement(outputTableViewer.getElementAt(index - 1), 0);
                if (joinOutputList.size() < 1) {
                    deleteButton.setEnabled(false);
                }
                if (joinOutputList.size() <= 1) {
                    upButton.setEnabled(false);
                    downButton.setEnabled(false);
                }
            }
        });

        upButton = widget.buttonWidget(parent, SWT.CENTER, new int[] { 50, 0, 25, 20 }, "");
        upButton.setImage(ImagePathConstant.UP_ICON.getImageFromRegistry());
        upButton.setToolTipText(Messages.MOVE_SCHEMA_UP_TOOLTIP);
        upButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseUp(MouseEvent e) {
                int index2 = 0;
                int index1 = outputTableViewer.getTable().getSelectionIndex();

                if (index1 > 0) {
                    String text = outputTableViewer.getTable().getItem(index1).getText(0);
                    String text1 = outputTableViewer.getTable().getItem(index1).getText(1);
                    index2 = index1 - 1;
                    String data = outputTableViewer.getTable().getItem(index2).getText(0);
                    String data2 = outputTableViewer.getTable().getItem(index2).getText(1);

                    LookupMapProperty property = new LookupMapProperty();
                    property.setSource_Field(data);
                    property.setOutput_Field(data2);
                    joinOutputList.set(index1, property);

                    property = new LookupMapProperty();
                    property.setSource_Field(text);
                    property.setOutput_Field(text1);
                    joinOutputList.set(index2, property);
                    outputTableViewer.refresh();
                    outputTableViewer.getTable().setSelection(index1 - 1);
                }
            }

        });

        downButton = widget.buttonWidget(parent, SWT.CENTER, new int[] { 74, 0, 25, 20 }, "");
        downButton.setImage(ImagePathConstant.DOWN_ICON.getImageFromRegistry());
        downButton.setToolTipText(Messages.MOVE_SCHEMA_DOWN_TOOLTIP);
        downButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseUp(MouseEvent e) {
                int index1 = outputTableViewer.getTable().getSelectionIndex();
                int index2 = 0;

                if (index1 < joinOutputList.size() - 1) {
                    String text = outputTableViewer.getTable().getItem(index1).getText(0);
                    String text1 = outputTableViewer.getTable().getItem(index1).getText(1);
                    index2 = index1 + 1;
                    String data = outputTableViewer.getTable().getItem(index2).getText(0);
                    String data1 = outputTableViewer.getTable().getItem(index2).getText(1);
                    LookupMapProperty p = new LookupMapProperty();
                    p.setSource_Field(data);
                    p.setOutput_Field(data1);
                    joinOutputList.set(index1, p);

                    p = new LookupMapProperty();
                    p.setSource_Field(text);
                    p.setOutput_Field(text1);
                    joinOutputList.set(index2, p);
                    outputTableViewer.refresh();
                    outputTableViewer.getTable().setSelection(index1 + 1);
                }
            }
        });

    }

    public Label labelWidget(Composite parent, int style, int[] bounds, String value) {
        Label label = new Label(parent, style);
        label.setBounds(bounds[0], bounds[1], bounds[2], bounds[3]);
        label.setText(value);
        // label.setImage(image);

        return label;
    }

    public Button buttonWidget(Composite parent, int style, int[] bounds, String value, Image image) {
        Button button = new Button(parent, style);
        button.setBounds(bounds[0], bounds[1], bounds[2], bounds[3]);
        button.setText(value);
        button.setImage(image);
        return button;
    }

    /**
     * Create contents of the button bar.
     * 
     * @param parent
     */
    @Override
    protected void createButtonsForButtonBar(Composite parent) {

        okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);

        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);

    }

    @Override
    protected void okPressed() {

        if (OSValidator.isMac()) {
            List<TableViewer> tableViewers = new ArrayList<TableViewer>();
            tableViewers.add(outputTableViewer);
            tableViewers.addAll(java.util.Arrays.asList(inputTableViewer));
            for (TableViewer tableView : tableViewers) {
                if (tableView != null) {
                    for (CellEditor cellEditor : tableView.getCellEditors()) {
                        if (cellEditor != null) {
                            cellEditor.getControl().setEnabled(false); //Saves the existing value of CellEditor
                            cellEditor.getControl().setEnabled(true);
                        }
                    }
                }
            }
        }
        populateCurrentItemsOfTable();
        if (previousItems.length == 0 && currentItems.length != 0) {
            propertyDialogButtonBar.enableApplyButton(true);
        } else if ((currentItems.length != 0 && previousItems.length != 0)) {
            if (!Arrays.equals(currentItems, previousItems))
                propertyDialogButtonBar.enableApplyButton(true);
        }
        getJoinPropertyGrid();
        super.close();
    }

    @Override
    protected void cancelPressed() {
        hasOutputMappingInTableChanged();
    }

    private Boolean hasOutputMappingInTableChanged() {
        boolean returnValue = false;
        populateCurrentItemsOfTable();
        if (currentItems.length == 0 && previousItems.length == 0) {
            super.close();
        } else {
            if (!Arrays.equals(currentItems, previousItems)) {
                int style = SWT.APPLICATION_MODAL | SWT.YES | SWT.NO | SWT.ICON_INFORMATION;
                MessageBox messageBox = new MessageBox(new Shell(), style);
                messageBox.setText(INFORMATION);
                messageBox.setMessage(Messages.MessageBeforeClosingWindow);
                if (messageBox.open() == SWT.YES) {
                    joinOutputList.clear();
                    LookupMapProperty[] lookupMapPropertyObjects = new LookupMapProperty[previousItems.length];
                    for (int i = 0; i < previousItems.length; i++) {
                        if (!previousItems[i].isDisposed()) {
                            lookupMapPropertyObjects[i] = (LookupMapProperty) previousItems[i].getData();
                            joinOutputList.add(lookupMapPropertyObjects[i]);
                        }
                    }
                    getJoinPropertyGrid();
                    returnValue = super.close();
                }
            } else {
                returnValue = super.close();
            }
        }
        return returnValue;
    }

    @Override
    public boolean close() {
        return hasOutputMappingInTableChanged();
    }

    protected boolean inputSchemavalidate(List<FilterProperties> inputList, TableViewer tableViewer) {
        int propertyCounter = 0;
        for (FilterProperties temp : inputList) {
            if (!temp.getPropertyname().trim().isEmpty()) {
                Matcher matchs = Pattern.compile(Constants.REGEX).matcher(temp.getPropertyname().trim());
                if (!matchs.matches()) {
                    tableViewer.getTable().setSelection(propertyCounter);
                    errorLabel.setVisible(true);
                    errorLabel.setText(Messages.ALLOWED_CHARACTERS);
                    return false;
                }
            } else {
                tableViewer.getTable().setSelection(propertyCounter);
                errorLabel.setVisible(true);
                errorLabel.setText(Messages.EmptySourceFieldNotification);
                return false;
            }

            propertyCounter++;

        }
        return true;
    }

    private boolean validateOutputSchema(String outputFieldValue, String sourceFieldValue) {
        int propertycount = 0;
        int propertyValuecount = 0;
        for (LookupMapProperty join : joinOutputList) {
            if (join.getSource_Field().trim().isEmpty()) {
                outputTableViewer.getTable().setSelection(propertycount);
                errorLabel.setVisible(true);
                errorLabel.setText(Messages.EmptySourceFieldNotification);
                return false;
            } else if (join.getOutput_Field().trim().isEmpty()) {
                outputTableViewer.getTable().setSelection(propertyValuecount);
                errorLabel.setVisible(true);
                errorLabel.setText(Messages.EmptyOutputFieldNotification);
                return false;
            } else {
                errorLabel.setVisible(false);
            }
            propertycount++;
            propertyValuecount++;
        }
        for (LookupMapProperty join : joinOutputList) {
            if (join.getSource_Field() != null && join.getSource_Field().equalsIgnoreCase(sourceFieldValue)) {
                return false;
            }
        }
        return true;
    }

    private void validateDuplicatesInOutputField() {
        boolean duplicateFound = false;
        if (outputTableViewer.getTable().getItems() != null) {
            TableItem[] items = outputTableViewer.getTable().getItems();
            LookupMapProperty[] objectsInGui = new LookupMapProperty[items.length];
            for (int i = 0; i < items.length; i++) {
                objectsInGui[i] = (LookupMapProperty) items[i].getData();
                for (int j = i + 1; j < items.length; j++) {
                    if (((LookupMapProperty) items[i].getData()).getOutput_Field()
                            .equalsIgnoreCase(((LookupMapProperty) items[j].getData()).getOutput_Field())) {
                        duplicateFound = true;
                        break;
                    }
                }
                if (duplicateFound)
                    break;
            }
            if (duplicateFound) {
                okButton.setEnabled(false);
                errorLabel.setText(Messages.OutputFieldAlreadyExists);
                errorLabel.setVisible(true);
            } else {
                if (okButton != null && errorLabel != null) {
                    okButton.setEnabled(true);
                    errorLabel.setVisible(false);
                }
            }
        }
    }

    // Creates Value Validator for table's cells
    private ICellEditorValidator inputSchemaEditorValidation(final List<FilterProperties> joinInputList,
            final String errorMessage, final TableViewer viewer) {
        ICellEditorValidator propertyValidator = new ICellEditorValidator() {
            @Override
            public String isValid(Object value) {
                String currentSelectedFld = viewer.getTable().getItem(viewer.getTable().getSelectionIndex())
                        .getText();
                String valueToValidate = String.valueOf(value).trim();
                for (FilterProperties temp : joinInputList) {
                    if (!currentSelectedFld.equalsIgnoreCase(valueToValidate)
                            && temp.getPropertyname().equalsIgnoreCase(valueToValidate)) {
                        errorLabel.setText(Messages.FieldNameAlreadyExists);
                        errorLabel.setVisible(true);
                        okButton.setEnabled(false);
                        return "ERROR";
                    } else
                        errorLabel.setVisible(false);
                    okButton.setEnabled(true);
                }
                validateDuplicatesInOutputField();
                return null;
            }
        };
        return propertyValidator;
    }

    /**
     * Return the initial size of the dialog.
     */
    @Override
    protected Point getInitialSize() {
        return new Point(870, 757);
    }

    // Creates CellNAme Validator for table's cells
    private ICellEditorValidator sourceEditorValidator(final TableViewer viewer, final String errorMessage,
            final List<LookupMapProperty> propertyList) {
        ICellEditorValidator propertyValidator = new ICellEditorValidator() {
            @Override
            public String isValid(Object value) {
                String currentSelectedFld = viewer.getTable().getItem(viewer.getTable().getSelectionIndex())
                        .getText();
                String valueToValidate = String.valueOf(value).trim();
                if (StringUtils.isEmpty(valueToValidate)) {
                    errorLabel.setText(errorMessage);
                    errorLabel.setVisible(true);
                    okButton.setEnabled(false);
                    return "ERROR";
                } else {
                    okButton.setEnabled(true);
                }
                for (LookupMapProperty temp : propertyList) {
                    if (!currentSelectedFld.equalsIgnoreCase(valueToValidate)
                            && temp.getSource_Field().equalsIgnoreCase(valueToValidate)) {
                        errorLabel.setText(Messages.SourceFieldAlreadyExists);
                        errorLabel.setVisible(true);
                        okButton.setEnabled(false);
                        return "ERROR";
                    } else {
                        errorLabel.setVisible(false);
                        okButton.setEnabled(true);
                        validateDuplicatesInOutputField();
                    }
                }
                return null;
            }
        };

        return propertyValidator;
    }

    // Creates CellValue Validator for table's cells
    private ICellEditorValidator outputFieldEditorValidator(final TableViewer viewer, final String errorMessage,
            final List<LookupMapProperty> propertyList) {
        ICellEditorValidator propertyValidator = new ICellEditorValidator() {
            @Override
            public String isValid(Object value) {
                String currentSelectedFld = viewer.getTable().getItem(viewer.getTable().getSelectionIndex())
                        .getText(1);
                String valueToValidate = String.valueOf(value).trim();
                if (StringUtils.isEmpty(valueToValidate)) {
                    errorLabel.setText(errorMessage);
                    errorLabel.setVisible(true);
                    okButton.setEnabled(false);
                    return "ERROR";
                } else {
                    okButton.setEnabled(true);
                }
                for (LookupMapProperty temp : propertyList) {
                    if (!currentSelectedFld.equalsIgnoreCase(valueToValidate)
                            && temp.getOutput_Field().equalsIgnoreCase(valueToValidate)) {
                        errorLabel.setText(Messages.OutputFieldAlreadyExists);
                        errorLabel.setVisible(true);
                        okButton.setEnabled(false);
                        validateDuplicatesInOutputField();
                        return "ERROR";
                    } else {
                        errorLabel.setVisible(false);
                        okButton.setEnabled(true);
                    }
                }
                validateDuplicatesInOutputField();
                return null;
            }
        };
        validateDuplicatesInOutputField();
        return propertyValidator;
    }

    private void joinOutputProperty(TableViewer viewer, String sourceFieldValue) {
        String outputFieldValue = null;
        if (sourceFieldValue == null) {
            sourceFieldValue = "";
            outputFieldValue = "";
        } else {
            outputFieldValue = sourceFieldValue.split("\\.")[1];
        }
        LookupMapProperty property = new LookupMapProperty();

        if (joinOutputList.size() != 0) {
            if (!validateOutputSchema(outputFieldValue, sourceFieldValue))
                return;
            property.setSource_Field(sourceFieldValue);
            property.setOutput_Field(outputFieldValue);
            joinOutputList.add(property);
            viewer.refresh();
            viewer.editElement(property, 0);
        } else {
            property.setSource_Field(sourceFieldValue);
            property.setOutput_Field(outputFieldValue);
            joinOutputList.add(property);
            viewer.refresh();
            viewer.editElement(property, 0);
        }
    }

    public void dropData(final TableViewer tableViewer, final List<LookupMapProperty> listOfFields,
            final boolean isSingleColumn) {
        Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
        int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
        DropTarget target = new DropTarget(tableViewer.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;
                }
                if (isSingleColumn) {
                    String[] dropData = ((String) event.data).split(Pattern.quote("#"));
                    for (String data : dropData) {
                        joinOutputProperty(tableViewer, data);
                    }
                    if (joinOutputList.size() >= 1) {
                        deleteButton.setEnabled(true);
                    }
                    if (joinOutputList.size() >= 2) {
                        upButton.setEnabled(true);
                        downButton.setEnabled(true);
                    }
                    validateDuplicatesInOutputField();
                }
            }
        });
    }

}