hydrograph.ui.dataviewer.filter.FilterConditionsDialog.java Source code

Java tutorial

Introduction

Here is the source code for hydrograph.ui.dataviewer.filter.FilterConditionsDialog.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.dataviewer.filter;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.fieldassist.AutoCompleteField;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
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 org.eclipse.swt.widgets.Text;

import hydrograph.ui.common.util.CustomColorRegistry;
import hydrograph.ui.common.util.ImagePathConstant;
import hydrograph.ui.common.util.OSValidator;
import hydrograph.ui.dataviewer.actions.ReloadAction;
import hydrograph.ui.dataviewer.adapters.DataViewerAdapter;
import hydrograph.ui.dataviewer.constants.Messages;
import hydrograph.ui.dataviewer.window.DebugDataViewer;

/**
 * The Class FilterConditionsDialog.
 * Provides Dialog for Data Viewer Filter conditions.
 * @author Bitwise
 *
 */
public class FilterConditionsDialog extends Dialog {
    private static final String TRUE = "TRUE";

    private static final String VALUE1_TEXT_BOX = "value1TextBox";
    private static final String VALUE2_TEXT_BOX = "value2TextBox";
    private static final String FIELD_NAMES = "fieldNames";
    private static final String RELATIONAL_OPERATORS = "relationalOperators";
    private static final String REMOVE = "-";
    private static final String ADD = "+";
    public static final String GROUP_CHECKBOX = "groupCheckBox";
    public static final String CONDITIONAL_OPERATORS = "conditionalOperators";

    private static final String ADD_BUTTON_PANE = "addButtonPane";
    private static final String REMOVE_BUTTON_PANE = "removeButtonPane";
    private static final String GROUP_CHECKBOX_PANE = "groupCheckBoxPane";
    private static final String RELATIONAL_COMBO_PANE = "relationalComboPane";
    private static final String FIELD_COMBO_PANE = "fieldComboPane";
    private static final String CONDITIONAL_COMBO_PANE = "conditionalComboPane";
    private static final String VALUE1_TEXT_PANE = "value1TextPane";
    private static final String VALUE2_TEXT_PANE = "value2TextPane";

    private static final String ADD_EDITOR = "add_editor";
    private static final String REMOVE_EDITOR = "remove_editor";
    private static final String GROUP_EDITOR = "group_editor";
    private static final String RELATIONAL_EDITOR = "relational_editor";
    private static final String FIELD_EDITOR = "field_editor";
    private static final String CONDITIONAL_EDITOR = "conditional_editor";
    private static final String VALUE1_EDITOR = "value1_editor";
    private static final String VALUE2_EDITOR = "value2_editor";

    private Map<String, String[]> typeBasedConditionalOperators = new HashMap<>();
    private FilterConditions originalFilterConditions;
    private RetainFilter retainLocalFilter;
    private RetainFilter retainRemoteFilter;

    private String relationalOperators[] = new String[] { FilterConstants.AND, FilterConstants.OR };
    private String fieldNames[];
    private Map<String, String> fieldsAndTypes;
    private TableViewer remoteTableViewer;
    private TableViewer localTableViewer;

    private List<Condition> localConditionsList;
    private List<Condition> remoteConditionsList;
    private List<Condition> dummyList = new ArrayList<>();

    //Map for adding group index with list of list of row indexes
    private TreeMap<Integer, List<List<Integer>>> localGroupSelectionMap;
    private TreeMap<Integer, List<List<Integer>>> remoteGroupSelectionMap;

    private DataViewerAdapter dataViewerAdapter;
    private DebugDataViewer debugDataViewer;

    Button localSaveButton;
    Button localDisplayButton;
    Button remoteSaveButton;
    Button remoteDisplayButton;
    Button remoteBtnAddGrp;
    Button localBtnAddGrp;
    StyledText styledTextLocal;
    StyledText styledTextRemote;

    /**
     * Set map of fields and their types respectively
     * @param fieldsAndTypes
     */
    public void setFieldsAndTypes(Map<String, String> fieldsAndTypes) {
        this.fieldsAndTypes = fieldsAndTypes;
        fieldNames = (String[]) this.fieldsAndTypes.keySet().toArray(new String[this.fieldsAndTypes.size()]);
        Arrays.sort(fieldNames, new Comparator<String>() {
            public int compare(String string1, String string2) {
                return string1.compareToIgnoreCase(string2);
            };
        });
    }

    /**
     * Create the dialog.   
     * @param parentShell
     */
    public FilterConditionsDialog(Shell parentShell) {
        super(parentShell);
        setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.RESIZE | SWT.APPLICATION_MODAL);
        localConditionsList = new ArrayList<>();
        remoteConditionsList = new ArrayList<>();
        localGroupSelectionMap = new TreeMap<>();
        remoteGroupSelectionMap = new TreeMap<>();
        retainLocalFilter = new RetainFilter();
        retainRemoteFilter = new RetainFilter();
        typeBasedConditionalOperators = FilterHelper.INSTANCE.getTypeBasedOperatorMap();
        this.originalFilterConditions = new FilterConditions();
    }

    /**
     * Setup saved/applied filter conditions values before opening the window
     * @param filterConditions
     */
    public void setFilterConditions(FilterConditions filterConditions) {
        this.originalFilterConditions = filterConditions;
        localConditionsList.addAll(FilterHelper.INSTANCE.cloneList(filterConditions.getLocalConditions()));
        remoteConditionsList.addAll(FilterHelper.INSTANCE.cloneList(filterConditions.getRemoteConditions()));
        retainLocalFilter.setRetainFilter(filterConditions.getRetainLocal());
        retainRemoteFilter.setRetainFilter(filterConditions.getRetainRemote());
        localGroupSelectionMap.putAll(filterConditions.getLocalGroupSelectionMap());
        remoteGroupSelectionMap.putAll(filterConditions.getRemoteGroupSelectionMap());
        FilterHelper.INSTANCE.setRemoteCondition(filterConditions.getRemoteCondition());
        FilterHelper.INSTANCE.setLocalCondition(filterConditions.getLocalCondition());
    }

    /**
     * Create contents of the dialog.
     * @param parent
     */
    @Override
    protected Control createDialogArea(final Composite parent) {
        Composite container = (Composite) super.createDialogArea(parent);
        parent.getShell().setText(Messages.DATA_VIEWER + " " + Messages.FILTER);
        container.setLayout(new GridLayout(1, false));
        container.getShell().setMinimumSize(800, 355);
        Composite mainComposite = new Composite(container, SWT.NONE);
        mainComposite.setLayout(new GridLayout(1, false));
        GridData gdMainComposite = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
        gdMainComposite.heightHint = 355;
        gdMainComposite.widthHint = 832;
        mainComposite.setLayoutData(gdMainComposite);

        CTabFolder tabFolder = new CTabFolder(mainComposite, SWT.NONE);
        tabFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        createRemoteTabItem(tabFolder, remoteTableViewer);
        createLocalTabItem(tabFolder, localTableViewer);
        parent.getShell().setDefaultButton(remoteSaveButton);
        tabFolder.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                CTabItem tabItem = (CTabItem) e.item;
                if (StringUtils.equalsIgnoreCase(tabItem.getText(), Messages.ORIGINAL_DATASET)) {
                    parent.getShell().setDefaultButton(remoteSaveButton);
                } else if (StringUtils.equalsIgnoreCase(tabItem.getText(), Messages.DOWNLOADED_DATASET)) {
                    parent.getShell().setDefaultButton(localSaveButton);
                }
            }
        });

        FilterHelper.INSTANCE.setDataViewerAdapter(dataViewerAdapter, this);
        FilterHelper.INSTANCE.setDebugDataViewer(debugDataViewer);
        return container;
    }

    private void createRemoteTabItem(CTabFolder tabFolder, TableViewer tableViewer) {
        CTabItem tbtmLocal = new CTabItem(tabFolder, SWT.NONE);
        tbtmLocal.setText(Messages.ORIGINAL_DATASET);

        Composite composite = new Composite(tabFolder, SWT.NONE);
        tbtmLocal.setControl(composite);
        composite.setLayout(new GridLayout(1, false));

        tableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL);
        tableViewer.setContentProvider(new ArrayContentProvider());
        Table table = tableViewer.getTable();

        table.setHeaderVisible(true);
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        Composite compositeStyledText = new Composite(composite, SWT.BORDER);
        compositeStyledText.setLayout(new GridLayout(1, true));
        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false, 0, 0);
        compositeStyledText.setLayoutData(gd);
        gd.heightHint = 39;

        styledTextRemote = new StyledText(compositeStyledText, SWT.NONE | SWT.V_SCROLL);
        GridData gd_styledTextRemote = new GridData(SWT.FILL, SWT.FILL, true, true, 0, 0);
        styledTextRemote.setLayoutData(gd_styledTextRemote);
        StringBuffer remoteFilterCondition = FilterHelper.INSTANCE.getCondition(remoteConditionsList,
                fieldsAndTypes, remoteGroupSelectionMap, true);
        styledTextRemote.setText(remoteFilterCondition.toString());
        styledTextRemote.setWordWrap(true);
        styledTextRemote.setEditable(false);

        Composite composite_3 = new Composite(composite, SWT.NONE);
        GridLayout gdComposite3 = new GridLayout(4, false);
        gdComposite3.marginWidth = 0;
        composite_3.setLayout(gdComposite3);

        Button btnAddRowAt = new Button(composite_3, SWT.NONE);
        btnAddRowAt.addSelectionListener(
                FilterHelper.INSTANCE.getAddAtEndListener(tableViewer, remoteConditionsList, dummyList));
        btnAddRowAt.setText(Messages.ADD_ROW_AT_END);

        remoteBtnAddGrp = new Button(composite_3, SWT.NONE);
        Button clearGroupsRemote = new Button(composite_3, SWT.NONE);
        clearGroupsRemote.addSelectionListener(clearGroupsListner(tableViewer, remoteGroupSelectionMap,
                clearGroupsRemote, remoteBtnAddGrp, remoteConditionsList, true));
        clearGroupsRemote.setText(Messages.CLEAR_GROUPS);
        if (remoteGroupSelectionMap.size() != 0 && remoteConditionsList.size() != 0) {
            clearGroupsRemote.setEnabled(true);
        } else {
            clearGroupsRemote.setEnabled(false);
        }

        remoteBtnAddGrp.setText(Messages.CREATE_GROUP);
        remoteBtnAddGrp.setEnabled(false);
        remoteBtnAddGrp.addSelectionListener(getAddGroupButtonListner(tableViewer, clearGroupsRemote,
                remoteConditionsList, remoteBtnAddGrp, remoteGroupSelectionMap, true));

        Button retainButton = new Button(composite_3, SWT.CHECK);
        retainButton.setText(Messages.RETAIN_REMOTE_FILTER);
        retainButton.addSelectionListener(FilterHelper.INSTANCE.getRetainButtonListener(retainRemoteFilter));

        Composite composite_4 = new Composite(composite, SWT.NONE);
        GridLayout gd4 = new GridLayout(4, false);
        gd4.marginWidth = 0;
        composite_4.setLayout(gd4);
        composite_4.setLayoutData(new GridData(SWT.RIGHT, SWT.BOTTOM, true, false, 1, 1));

        remoteSaveButton = createButton(composite_4, Messages.OK2, true);
        remoteSaveButton.addSelectionListener(FilterHelper.INSTANCE.getSaveButtonListener(remoteConditionsList,
                fieldsAndTypes, remoteGroupSelectionMap, Messages.ORIGINAL, originalFilterConditions,
                retainRemoteFilter, retainLocalFilter));
        remoteSaveButton.setToolTipText(Messages.OK2_TOOLTIP);

        Button btnCancel = createButton(composite_4, Messages.CANCEL2, false);
        btnCancel.addMouseListener(getCancelButtonListener());
        btnCancel.setToolTipText(Messages.CANCEL2_TOOLTIP);

        Button clearButton = createButton(composite_4, Messages.CLEAR, false);
        clearButton.addSelectionListener(getClearButtonListener(tableViewer, remoteConditionsList, dummyList,
                originalFilterConditions, true, retainButton, remoteGroupSelectionMap, remoteBtnAddGrp));
        clearButton.setToolTipText(Messages.CLEAR_TOOLTIP);

        remoteDisplayButton = createButton(composite_4, Messages.DISPLAY, false);
        remoteDisplayButton.addSelectionListener(FilterHelper.INSTANCE.getRemoteDisplayButtonListener(
                remoteConditionsList, fieldsAndTypes, remoteGroupSelectionMap, styledTextRemote));

        remoteDisplayButton.setToolTipText(Messages.DISPLAY_TOOLTIP);

        if (retainRemoteFilter.getRetainFilter() == true) {
            retainButton.setSelection(true);
        }

        TableViewerColumn addButtonTableViewerColumn = createTableColumns(tableViewer, "", 28);
        addButtonTableViewerColumn.setLabelProvider(
                getAddButtonCellProvider(tableViewer, remoteConditionsList, remoteGroupSelectionMap));

        TableViewerColumn removeButtonTableViewerColumn = createTableColumns(tableViewer, "", 28);
        removeButtonTableViewerColumn.setLabelProvider(getRemoveButtonCellProvider(tableViewer,
                remoteConditionsList, remoteBtnAddGrp, remoteGroupSelectionMap, true));

        TableViewerColumn groupButtonTableViewerColumn = createTableColumns(tableViewer, "", 40);
        groupButtonTableViewerColumn
                .setLabelProvider(getGroupCheckCellProvider(tableViewer, remoteConditionsList, remoteBtnAddGrp));

        for (int key : remoteGroupSelectionMap.keySet()) {
            TableViewerColumn dummyTableViewerColumn = createTableColumns(tableViewer, "", 20);
            dummyTableViewerColumn.setLabelProvider(
                    getDummyColumn(tableViewer, remoteConditionsList, key, remoteGroupSelectionMap));
        }

        TableViewerColumn relationalDropDownColumn = createTableColumns(tableViewer, Messages.RELATIONAL_OPERATOR,
                120);
        relationalDropDownColumn
                .setLabelProvider(getRelationalCellProvider(tableViewer, remoteConditionsList, true));

        TableViewerColumn fieldNameDropDownColumn = createTableColumns(tableViewer, Messages.FIELD_NAME, 150);
        fieldNameDropDownColumn.setLabelProvider(getFieldNameCellProvider(tableViewer, remoteConditionsList, true));

        TableViewerColumn conditionalDropDownColumn = createTableColumns(tableViewer, Messages.CONDITIONAL_OPERATOR,
                130);
        conditionalDropDownColumn
                .setLabelProvider(getConditionalCellProvider(tableViewer, remoteConditionsList, true));

        TableViewerColumn value1TextBoxColumn = createTableColumns(tableViewer, Messages.VALUE1, 150);
        value1TextBoxColumn.setLabelProvider(getValue1CellProvider(tableViewer, remoteConditionsList, true));

        TableViewerColumn value2TextBoxColumn = createTableColumns(tableViewer, Messages.VALUE2, 150);
        value2TextBoxColumn.setLabelProvider(getValue2CellProvider(tableViewer, remoteConditionsList, true));

        if (remoteConditionsList.isEmpty()) {
            remoteConditionsList.add(0, new Condition());
        }
        dummyList.clear();
        dummyList.addAll(FilterHelper.INSTANCE.cloneList(remoteConditionsList));
        tableViewer.setInput(remoteConditionsList);
        tableViewer.refresh();

    }

    private Button createButton(Composite parent, String label, boolean defaultButton) {

        Button button = new Button(parent, SWT.NONE);
        button.setText(label);

        if (defaultButton) {
            Shell shell = parent.getShell();
            if (shell != null) {
                shell.setDefaultButton(button);
            }
        }

        setButtonLayoutData(button);
        return button;
    }

    private MouseListener getCancelButtonListener() {
        return new MouseListener() {

            @Override
            public void mouseUp(org.eclipse.swt.events.MouseEvent e) {
            }

            @Override
            public void mouseDown(org.eclipse.swt.events.MouseEvent e) {
                cancelPressed();
            }

            @Override
            public void mouseDoubleClick(org.eclipse.swt.events.MouseEvent e) {
            }
        };
    }

    private void createLocalTabItem(CTabFolder tabFolder, TableViewer tableViewer) {
        CTabItem tbtmLocal = new CTabItem(tabFolder, SWT.NONE);
        tbtmLocal.setText(Messages.DOWNLOADED_DATASET);

        Composite composite = new Composite(tabFolder, SWT.NONE);
        tbtmLocal.setControl(composite);
        composite.setLayout(new GridLayout(1, false));

        tableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL);
        tableViewer.setContentProvider(new ArrayContentProvider());
        Table table = tableViewer.getTable();

        table.setHeaderVisible(true);
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        Composite compositeStyledText = new Composite(composite, SWT.BORDER);
        compositeStyledText.setLayout(new GridLayout(1, true));
        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false, 0, 0);
        compositeStyledText.setLayoutData(gd);
        gd.heightHint = 39;

        styledTextLocal = new StyledText(compositeStyledText, SWT.NONE | SWT.V_SCROLL);
        GridData gd_styledTextLocal = new GridData(SWT.FILL, SWT.FILL, true, true, 0, 0);
        styledTextLocal.setLayoutData(gd_styledTextLocal);
        StringBuffer localFilterCondition = FilterHelper.INSTANCE.getCondition(localConditionsList, fieldsAndTypes,
                localGroupSelectionMap, true);
        styledTextLocal.setText(localFilterCondition.toString());
        styledTextLocal.setWordWrap(true);
        styledTextLocal.setEditable(false);

        Composite composite_3 = new Composite(composite, SWT.NONE);
        GridLayout gd3 = new GridLayout(4, false);
        gd3.marginWidth = 0;
        composite_3.setLayout(gd3);

        Button btnAddRowAt = new Button(composite_3, SWT.NONE);
        btnAddRowAt.addSelectionListener(
                FilterHelper.INSTANCE.getAddAtEndListener(tableViewer, localConditionsList, dummyList));
        btnAddRowAt.setText(Messages.ADD_ROW_AT_END);

        localBtnAddGrp = new Button(composite_3, SWT.NONE);
        Button clearGroupsLocal = new Button(composite_3, SWT.NONE);
        clearGroupsLocal.addSelectionListener(clearGroupsListner(tableViewer, localGroupSelectionMap,
                clearGroupsLocal, localBtnAddGrp, localConditionsList, false));
        clearGroupsLocal.setText(Messages.CLEAR_GROUPS);
        if (localGroupSelectionMap.size() != 0 && localConditionsList.size() != 0) {
            clearGroupsLocal.setEnabled(true);
        } else {
            clearGroupsLocal.setEnabled(false);
        }

        localBtnAddGrp.setText(Messages.CREATE_GROUP);
        localBtnAddGrp.setEnabled(false);
        localBtnAddGrp.addSelectionListener(getAddGroupButtonListner(tableViewer, clearGroupsLocal,
                localConditionsList, localBtnAddGrp, localGroupSelectionMap, false));

        Button retainButton = new Button(composite_3, SWT.CHECK);
        retainButton.setText(Messages.RETAIN_LOCAL_FILTER);
        retainButton.addSelectionListener(FilterHelper.INSTANCE.getRetainButtonListener(retainLocalFilter));

        Composite composite_4 = new Composite(composite, SWT.NONE);
        GridLayout gd4 = new GridLayout(4, false);
        composite_4.setLayout(gd4);
        gd4.marginWidth = 0;
        composite_4.setLayoutData(new GridData(SWT.RIGHT, SWT.BOTTOM, true, false, 0, 0));

        localSaveButton = createButton(composite_4, Messages.OK2, false);
        localSaveButton.addSelectionListener(FilterHelper.INSTANCE.getSaveButtonListener(localConditionsList,
                fieldsAndTypes, localGroupSelectionMap, Messages.DOWNLOADED, originalFilterConditions,
                retainRemoteFilter, retainLocalFilter));
        localSaveButton.setToolTipText(Messages.OK2_TOOLTIP);

        Button btnCancel = createButton(composite_4, Messages.CANCEL2, false);
        btnCancel.addMouseListener(getCancelButtonListener());
        btnCancel.setToolTipText(Messages.CANCEL2_TOOLTIP);

        Button clearButton = createButton(composite_4, Messages.CLEAR, false);
        clearButton.addSelectionListener(getClearButtonListener(tableViewer, localConditionsList, dummyList,
                originalFilterConditions, false, retainButton, localGroupSelectionMap, localBtnAddGrp));
        clearButton.setToolTipText(Messages.CLEAR_TOOLTIP);

        localDisplayButton = createButton(composite_4, Messages.DISPLAY, false);
        localDisplayButton.addSelectionListener(FilterHelper.INSTANCE.getLocalDisplayButtonListener(
                localConditionsList, fieldsAndTypes, localGroupSelectionMap, styledTextLocal));

        localDisplayButton.setToolTipText(Messages.DISPLAY_TOOLTIP);
        if (retainLocalFilter.getRetainFilter() == true) {
            retainButton.setSelection(true);
        }

        TableViewerColumn addButtonTableViewerColumn = createTableColumns(tableViewer, "", 28);
        addButtonTableViewerColumn.setLabelProvider(
                getAddButtonCellProvider(tableViewer, localConditionsList, localGroupSelectionMap));

        TableViewerColumn removeButtonTableViewerColumn = createTableColumns(tableViewer, "", 28);
        removeButtonTableViewerColumn.setLabelProvider(getRemoveButtonCellProvider(tableViewer, localConditionsList,
                localBtnAddGrp, localGroupSelectionMap, false));

        TableViewerColumn groupButtonTableViewerColumn = createTableColumns(tableViewer, "", 40);
        groupButtonTableViewerColumn
                .setLabelProvider(getGroupCheckCellProvider(tableViewer, localConditionsList, localBtnAddGrp));

        for (int key : localGroupSelectionMap.keySet()) {

            TableViewerColumn dummyTableViewerColumn = createTableColumns(tableViewer, "", 20);
            dummyTableViewerColumn.setLabelProvider(
                    getDummyColumn(tableViewer, localConditionsList, key, localGroupSelectionMap));
        }

        TableViewerColumn relationalDropDownColumn = createTableColumns(tableViewer, Messages.RELATIONAL_OPERATOR,
                120);
        relationalDropDownColumn
                .setLabelProvider(getRelationalCellProvider(tableViewer, localConditionsList, false));

        TableViewerColumn fieldNameDropDownColumn = createTableColumns(tableViewer, Messages.FIELD_NAME, 150);
        fieldNameDropDownColumn.setLabelProvider(getFieldNameCellProvider(tableViewer, localConditionsList, false));

        TableViewerColumn conditionalDropDownColumn = createTableColumns(tableViewer, Messages.CONDITIONAL_OPERATOR,
                130);
        conditionalDropDownColumn
                .setLabelProvider(getConditionalCellProvider(tableViewer, localConditionsList, false));

        TableViewerColumn value1TextBoxColumn = createTableColumns(tableViewer, Messages.VALUE1, 150);
        value1TextBoxColumn.setLabelProvider(getValue1CellProvider(tableViewer, localConditionsList, false));

        TableViewerColumn value2TextBoxColumn = createTableColumns(tableViewer, Messages.VALUE2, 150);
        value2TextBoxColumn.setLabelProvider(getValue2CellProvider(tableViewer, localConditionsList, false));

        if (localConditionsList.isEmpty()) {
            localConditionsList.add(0, new Condition());
        }
        dummyList.clear();
        dummyList.addAll(FilterHelper.INSTANCE.cloneList(localConditionsList));
        tableViewer.setInput(localConditionsList);
        tableViewer.refresh();

    }

    private CellLabelProvider getValue1CellProvider(final TableViewer tableViewer,
            final List<Condition> conditionsList, final boolean isRemote) {
        return new CellLabelProvider() {

            @Override
            public void update(ViewerCell cell) {
                final TableItem item = (TableItem) cell.getItem();
                // DO NOT REMOVE THIS CONDITION. The condition is return to
                // prevent multiple updates on single item
                if (item.getData("ADDED_VALUE") == null) {
                    item.setData("ADDED_VALUE", TRUE);
                    Text text;
                    if (isRemote) {
                        text = addTextBoxInTable(tableViewer, item, VALUE1_TEXT_BOX, VALUE1_TEXT_PANE,
                                VALUE1_EDITOR, cell.getColumnIndex(),
                                FilterHelper.INSTANCE.getTextBoxValue1Listener(conditionsList, fieldsAndTypes,
                                        fieldNames, remoteSaveButton, remoteDisplayButton));
                    } else {
                        text = addTextBoxInTable(tableViewer, item, VALUE1_TEXT_BOX, VALUE1_TEXT_PANE,
                                VALUE1_EDITOR, cell.getColumnIndex(),
                                FilterHelper.INSTANCE.getTextBoxValue1Listener(conditionsList, fieldsAndTypes,
                                        fieldNames, localSaveButton, localDisplayButton));
                    }

                    text.setText((dummyList.get(tableViewer.getTable().indexOf(item))).getValue1());
                    item.addDisposeListener(new DisposeListener() {

                        @Override
                        public void widgetDisposed(DisposeEvent e) {
                            if (item.getData("DISPOSED_VALUE") == null) {
                                item.setData("DISPOSED_VALUE", TRUE);
                                Text valueText = (Text) item.getData(VALUE1_TEXT_BOX);
                                ((TableEditor) valueText.getData(VALUE1_EDITOR)).dispose();
                                valueText.dispose();

                                Composite composite = (Composite) item.getData(VALUE1_TEXT_PANE);
                                composite.dispose();
                            }
                        }
                    });
                } else {
                    Text text = (Text) item.getData(VALUE1_TEXT_BOX);
                    text.setText((dummyList.get(tableViewer.getTable().indexOf(item))).getValue1());
                }
            }
        };
    }

    private CellLabelProvider getValue2CellProvider(final TableViewer tableViewer,
            final List<Condition> conditionsList, final boolean isRemote) {
        return new CellLabelProvider() {

            @Override
            public void update(ViewerCell cell) {
                final TableItem item = (TableItem) cell.getItem();
                // DO NOT REMOVE THIS CONDITION. The condition is return to
                // prevent multiple updates on single item
                if (item.getData("ADDED_VALUE2") == null) {
                    item.setData("ADDED_VALUE2", TRUE);
                    Text text;
                    if (isRemote) {
                        text = addTextBoxInTable(tableViewer, item, VALUE2_TEXT_BOX, VALUE2_TEXT_PANE,
                                VALUE2_EDITOR, cell.getColumnIndex(),
                                FilterHelper.INSTANCE.getTextBoxValue2Listener(conditionsList, fieldsAndTypes,
                                        fieldNames, remoteSaveButton, remoteDisplayButton));
                    } else {
                        text = addTextBoxInTable(tableViewer, item, VALUE2_TEXT_BOX, VALUE2_TEXT_PANE,
                                VALUE2_EDITOR, cell.getColumnIndex(),
                                FilterHelper.INSTANCE.getTextBoxValue2Listener(conditionsList, fieldsAndTypes,
                                        fieldNames, localSaveButton, localDisplayButton));
                    }
                    text.setText((dummyList.get(tableViewer.getTable().indexOf(item))).getValue2());
                    enableAndDisableValue2TextBox(dummyList, tableViewer.getTable().indexOf(item), text);
                    item.addDisposeListener(new DisposeListener() {

                        @Override
                        public void widgetDisposed(DisposeEvent e) {
                            if (item.getData("DISPOSED_VALUE2") == null) {
                                item.setData("DISPOSED_VALUE2", TRUE);
                                Text valueText = (Text) item.getData(VALUE2_TEXT_BOX);
                                ((TableEditor) valueText.getData(VALUE2_EDITOR)).dispose();
                                valueText.dispose();

                                Composite composite = (Composite) item.getData(VALUE2_TEXT_PANE);
                                composite.dispose();
                            }
                        }
                    });
                } else {
                    Text text = (Text) item.getData(VALUE2_TEXT_BOX);
                    text.setText((dummyList.get(tableViewer.getTable().indexOf(item))).getValue2());
                    enableAndDisableValue2TextBox(dummyList, tableViewer.getTable().indexOf(item), text);
                }
            }
        };
    }

    private void enableAndDisableValue2TextBox(final List<Condition> conditionsList, int index, Text text) {
        if (StringUtils.equalsIgnoreCase(conditionsList.get(index).getConditionalOperator(),
                FilterConstants.BETWEEN)
                || StringUtils.equalsIgnoreCase(conditionsList.get(index).getConditionalOperator(),
                        FilterConstants.BETWEEN_FIELD)) {
            text.setVisible(true);
        } else {
            text.setVisible(false);
        }
    }

    private CellLabelProvider getConditionalCellProvider(final TableViewer tableViewer,
            final List<Condition> conditionsList, final boolean isRemote) {
        return new CellLabelProvider() {

            @Override
            public void update(ViewerCell cell) {
                final TableItem item = (TableItem) cell.getItem();
                // DO NOT REMOVE THIS CONDITION. The condition is return to
                // prevent multiple updates on single item
                if (item.getData("ADDED_CONDITIONAL") == null) {
                    item.setData("ADDED_CONDITIONAL", TRUE);
                    CCombo combo;
                    if (isRemote) {
                        combo = addComboInTable(tableViewer, item, CONDITIONAL_OPERATORS, CONDITIONAL_COMBO_PANE,
                                CONDITIONAL_EDITOR, cell.getColumnIndex(), new String[] {},
                                FilterHelper.INSTANCE.getConditionalOperatorSelectionListener(conditionsList,
                                        fieldsAndTypes, fieldNames, remoteSaveButton, remoteDisplayButton),
                                FilterHelper.INSTANCE.getConditionalOperatorModifyListener(conditionsList,
                                        fieldsAndTypes, fieldNames, remoteSaveButton, remoteDisplayButton),
                                FilterHelper.INSTANCE.getConditionalOperatorFocusListener());
                    } else {
                        combo = addComboInTable(tableViewer, item, CONDITIONAL_OPERATORS, CONDITIONAL_COMBO_PANE,
                                CONDITIONAL_EDITOR, cell.getColumnIndex(), new String[] {},
                                FilterHelper.INSTANCE.getConditionalOperatorSelectionListener(conditionsList,
                                        fieldsAndTypes, fieldNames, localSaveButton, localDisplayButton),
                                FilterHelper.INSTANCE.getConditionalOperatorModifyListener(conditionsList,
                                        fieldsAndTypes, fieldNames, localSaveButton, localDisplayButton),
                                FilterHelper.INSTANCE.getConditionalOperatorFocusListener());
                    }

                    if (StringUtils
                            .isNotBlank(dummyList.get(tableViewer.getTable().indexOf(item)).getFieldName())) {
                        String fieldsName = dummyList.get(tableViewer.getTable().indexOf(item)).getFieldName();
                        if (fieldsAndTypes.containsKey(fieldsName)) {
                            combo.setItems(typeBasedConditionalOperators.get(fieldsAndTypes.get(fieldsName)));
                        }
                    } else {
                        combo.setItems(new String[] {});
                    }
                    combo.setText((dummyList.get(tableViewer.getTable().indexOf(item))).getConditionalOperator());
                    item.addDisposeListener(new DisposeListener() {

                        @Override
                        public void widgetDisposed(DisposeEvent e) {
                            if (item.getData("DISPOSED_CONDITIONAL") == null) {
                                item.setData("DISPOSED_CONDITIONAL", TRUE);
                                CCombo combo = (CCombo) item.getData(CONDITIONAL_OPERATORS);
                                ((TableEditor) combo.getData(CONDITIONAL_EDITOR)).dispose();
                                combo.dispose();

                                Composite composite = (Composite) item.getData(CONDITIONAL_COMBO_PANE);
                                composite.dispose();
                            }
                        }
                    });
                } else {
                    CCombo combo = (CCombo) item.getData(CONDITIONAL_OPERATORS);
                    if (StringUtils
                            .isNotBlank(dummyList.get(tableViewer.getTable().indexOf(item)).getFieldName())) {
                        String fieldsName = dummyList.get(tableViewer.getTable().indexOf(item)).getFieldName();
                        if (fieldsAndTypes.containsKey(fieldsName)) {
                            combo.setItems(typeBasedConditionalOperators.get(fieldsAndTypes.get(fieldsName)));
                        }
                    } else {
                        combo.setItems(new String[] {});
                    }
                    combo.setText((dummyList.get(tableViewer.getTable().indexOf(item))).getConditionalOperator());
                }
            }
        };
    }

    private CellLabelProvider getFieldNameCellProvider(final TableViewer tableViewer,
            final List<Condition> conditionsList, final boolean isRemote) {
        return new CellLabelProvider() {

            @Override
            public void update(ViewerCell cell) {
                final TableItem item = (TableItem) cell.getItem();
                // DO NOT REMOVE THIS CONDITION. The condition is return to
                // prevent multiple updates on single item
                if (item.getData("ADDED_FIELD") == null) {
                    item.setData("ADDED_FIELD", TRUE);
                    CCombo combo;
                    if (isRemote) {
                        combo = addComboInTable(tableViewer, item, FIELD_NAMES, FIELD_COMBO_PANE, FIELD_EDITOR,
                                cell.getColumnIndex(), fieldNames,
                                FilterHelper.INSTANCE.getFieldNameSelectionListener(tableViewer, conditionsList,
                                        fieldsAndTypes, fieldNames, remoteSaveButton, remoteDisplayButton),
                                FilterHelper.INSTANCE.getFieldNameModifyListener(tableViewer, conditionsList,
                                        fieldsAndTypes, fieldNames, remoteSaveButton, remoteDisplayButton),
                                FilterHelper.INSTANCE.getConditionalOperatorFocusListener());
                    } else {
                        combo = addComboInTable(tableViewer, item, FIELD_NAMES, FIELD_COMBO_PANE, FIELD_EDITOR,
                                cell.getColumnIndex(), fieldNames,
                                FilterHelper.INSTANCE.getFieldNameSelectionListener(tableViewer, conditionsList,
                                        fieldsAndTypes, fieldNames, localSaveButton, localDisplayButton),
                                FilterHelper.INSTANCE.getFieldNameModifyListener(tableViewer, conditionsList,
                                        fieldsAndTypes, fieldNames, localSaveButton, localDisplayButton),
                                FilterHelper.INSTANCE.getConditionalOperatorFocusListener());
                    }

                    combo.setText((dummyList.get(tableViewer.getTable().indexOf(item))).getFieldName());
                    item.addDisposeListener(new DisposeListener() {

                        @Override
                        public void widgetDisposed(DisposeEvent e) {
                            if (item.getData("DISPOSED_FIELD") == null) {
                                item.setData("DISPOSED_FIELD", TRUE);
                                CCombo combo = (CCombo) item.getData(FIELD_NAMES);
                                ((TableEditor) combo.getData(FIELD_EDITOR)).dispose();
                                combo.dispose();

                                Composite composite = (Composite) item.getData(FIELD_COMBO_PANE);
                                composite.dispose();
                            }
                        }
                    });
                } else {
                    CCombo fieldNameCombo = (CCombo) item.getData(FIELD_NAMES);
                    fieldNameCombo.setText((dummyList.get(tableViewer.getTable().indexOf(item))).getFieldName());
                }
            }
        };
    }

    private CellLabelProvider getRelationalCellProvider(final TableViewer tableViewer,
            final List<Condition> conditionsList, final boolean isRemote) {
        return new CellLabelProvider() {

            @Override
            public void update(ViewerCell cell) {
                final TableItem item = (TableItem) cell.getItem();
                // DO NOT REMOVE THIS CONDITION. The condition is return to
                // prevent multiple updates on single item
                if (item.getData("ADDED_RELATIONAL") == null) {
                    item.setData("ADDED_RELATIONAL", TRUE);
                    CCombo combo;
                    if (isRemote) {
                        combo = addComboInTable(tableViewer, item, RELATIONAL_OPERATORS, RELATIONAL_COMBO_PANE,
                                RELATIONAL_EDITOR, cell.getColumnIndex(), relationalOperators,
                                FilterHelper.INSTANCE.getRelationalOpSelectionListener(conditionsList,
                                        fieldsAndTypes, fieldNames, remoteSaveButton, remoteDisplayButton),
                                FilterHelper.INSTANCE.getRelationalOpModifyListener(conditionsList, fieldsAndTypes,
                                        fieldNames, remoteSaveButton, remoteDisplayButton),
                                FilterHelper.INSTANCE.getConditionalOperatorFocusListener());
                    } else {
                        combo = addComboInTable(tableViewer, item, RELATIONAL_OPERATORS, RELATIONAL_COMBO_PANE,
                                RELATIONAL_EDITOR, cell.getColumnIndex(), relationalOperators,
                                FilterHelper.INSTANCE.getRelationalOpSelectionListener(conditionsList,
                                        fieldsAndTypes, fieldNames, localSaveButton, localDisplayButton),
                                FilterHelper.INSTANCE.getRelationalOpModifyListener(conditionsList, fieldsAndTypes,
                                        fieldNames, localSaveButton, localDisplayButton),
                                FilterHelper.INSTANCE.getConditionalOperatorFocusListener());
                    }

                    combo.setText((dummyList.get(tableViewer.getTable().indexOf(item))).getRelationalOperator());
                    if (tableViewer.getTable().indexOf(item) == 0) {
                        combo.setVisible(false);
                    } else {
                        combo.setVisible(true);
                    }
                    item.addDisposeListener(new DisposeListener() {

                        @Override
                        public void widgetDisposed(DisposeEvent e) {
                            if (item.getData("DISPOSED_RELATIONAL") == null) {
                                item.setData("DISPOSED_RELATIONAL", TRUE);
                                CCombo combo = (CCombo) item.getData(RELATIONAL_OPERATORS);
                                ((TableEditor) combo.getData(RELATIONAL_EDITOR)).dispose();
                                combo.dispose();

                                Composite composite = (Composite) item.getData(RELATIONAL_COMBO_PANE);
                                composite.dispose();
                            }
                        }
                    });
                } else {
                    CCombo combo = (CCombo) item.getData(RELATIONAL_OPERATORS);
                    combo.setText((dummyList.get(tableViewer.getTable().indexOf(item))).getRelationalOperator());
                }
            }
        };
    }

    private CellLabelProvider getGroupCheckCellProvider(final TableViewer tableViewer,
            final List<Condition> conditionsList, final Button btnAddGrp) {
        return new CellLabelProvider() {

            @Override
            public void update(ViewerCell cell) {
                final TableItem item = (TableItem) cell.getItem();
                // DO NOT REMOVE THIS CONDITION. The condition is return to
                // prevent multiple updates on single item
                if (item.getData("UPDATED3") == null) {
                    item.setData("UPDATED3", TRUE);
                } else {
                    return;
                }
                addCheckButtonInTable(tableViewer, item, GROUP_CHECKBOX, GROUP_CHECKBOX_PANE, GROUP_EDITOR,
                        cell.getColumnIndex(),
                        FilterHelper.INSTANCE.checkButtonListener(tableViewer, conditionsList, btnAddGrp));
                item.addDisposeListener(new DisposeListener() {

                    @Override
                    public void widgetDisposed(DisposeEvent e) {
                        Button groupButton = (Button) item.getData(GROUP_CHECKBOX);
                        ((TableEditor) groupButton.getData(GROUP_EDITOR)).dispose();
                        groupButton.dispose();

                        Composite composite = (Composite) item.getData(GROUP_CHECKBOX_PANE);
                        composite.dispose();
                    }
                });
            }
        };
    }

    private CellLabelProvider getRemoveButtonCellProvider(final TableViewer tableViewer,
            final List<Condition> conditionsList, final Button btnAddGrp,
            final TreeMap<Integer, List<List<Integer>>> groupSelectionMap, final boolean isRemote) {
        return new CellLabelProvider() {

            @Override
            public void update(ViewerCell cell) {
                final TableItem item = (TableItem) cell.getItem();
                // DO NOT REMOVE THIS CONDITION. The condition is return to
                // prevent multiple updates on single item
                if (item.getData("UPDATED2") == null) {
                    item.setData("UPDATED2", TRUE);
                } else {
                    return;
                }
                if (OSValidator.isMac()) {
                    addButtonInTable(tableViewer, item, REMOVE, REMOVE_BUTTON_PANE, REMOVE_EDITOR,
                            cell.getColumnIndex(), removeButtonListener(tableViewer, conditionsList, dummyList,
                                    groupSelectionMap, btnAddGrp, isRemote),
                            ImagePathConstant.MAC_DELETE_BUTTON);
                } else {
                    addButtonInTable(tableViewer, item, REMOVE, REMOVE_BUTTON_PANE, REMOVE_EDITOR,
                            cell.getColumnIndex(), removeButtonListener(tableViewer, conditionsList, dummyList,
                                    groupSelectionMap, btnAddGrp, isRemote),
                            ImagePathConstant.DELETE_BUTTON);
                }
                item.addDisposeListener(new DisposeListener() {

                    @Override
                    public void widgetDisposed(DisposeEvent e) {
                        Button removeButton = (Button) item.getData(REMOVE);
                        ((TableEditor) removeButton.getData(REMOVE_EDITOR)).dispose();
                        removeButton.dispose();

                        Composite composite = (Composite) item.getData(REMOVE_BUTTON_PANE);
                        composite.dispose();
                    }
                });
            }
        };
    }

    private CellLabelProvider getAddButtonCellProvider(final TableViewer tableViewer,
            final List<Condition> conditionsList, final TreeMap<Integer, List<List<Integer>>> groupSelectionMap) {
        return new CellLabelProvider() {

            @Override
            public void update(ViewerCell cell) {
                final TableItem item = (TableItem) cell.getItem();
                // DO NOT REMOVE THIS CONDITION. The condition is return to
                // prevent multiple updates on single item
                if (item.getData("UPDATED1") == null) {
                    item.setData("UPDATED1", TRUE);
                } else {
                    return;
                }

                if (OSValidator.isMac()) {
                    addButtonInTable(tableViewer, item, ADD, ADD_BUTTON_PANE, ADD_EDITOR, cell.getColumnIndex(),
                            FilterHelper.INSTANCE.addButtonListener(tableViewer, conditionsList, dummyList,
                                    groupSelectionMap),
                            ImagePathConstant.MAC_ADD_BUTTON);
                } else {
                    addButtonInTable(tableViewer, item, ADD, ADD_BUTTON_PANE, ADD_EDITOR, cell.getColumnIndex(),
                            FilterHelper.INSTANCE.addButtonListener(tableViewer, conditionsList, dummyList,
                                    groupSelectionMap),
                            ImagePathConstant.ADD_BUTTON);
                }

                item.addDisposeListener(new DisposeListener() {

                    @Override
                    public void widgetDisposed(DisposeEvent e) {
                        Button addButton = (Button) item.getData(ADD);
                        ((TableEditor) addButton.getData(ADD_EDITOR)).dispose();
                        addButton.dispose();

                        Composite composite = (Composite) item.getData(ADD_BUTTON_PANE);
                        composite.dispose();
                    }
                });
            }

        };
    }

    private CellLabelProvider getDummyColumn(final TableViewer tableViewer, final List<Condition> conditionsList,
            final Integer columnIndex, final TreeMap<Integer, List<List<Integer>>> groupSelectionMap) {
        return new CellLabelProvider() {

            @Override
            public void update(ViewerCell cell) {
                final TableItem item = (TableItem) cell.getItem();
                List<List<Integer>> checkedGrpRowIndices = groupSelectionMap.get(columnIndex);
                if (cell.getColumnIndex() == (columnIndex + 3)) {
                    if (null != checkedGrpRowIndices && !checkedGrpRowIndices.isEmpty()) {
                        List tempList = new ArrayList();
                        for (List<Integer> checkedIndex : checkedGrpRowIndices) {
                            tempList.addAll(checkedIndex);
                        }
                        int indexOf = tableViewer.getTable().indexOf(item);
                        if (tempList.contains(indexOf)) {
                            for (int i = 0; i < checkedGrpRowIndices.size(); i++) {
                                if ((checkedGrpRowIndices.get(i)).contains(indexOf)) {
                                    cell.setBackground(FilterHelper.INSTANCE.getColor(i));
                                    break;
                                }
                            }
                        } else {
                            cell.setBackground(CustomColorRegistry.INSTANCE.getColorFromRegistry(255, 255, 255));
                        }
                    }
                }
            }
        };
    }

    private TableViewerColumn createTableColumns(TableViewer tableViewer, String columnLabel, int width) {
        TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.CENTER);
        TableColumn tableColumn = tableViewerColumn.getColumn();
        tableColumn.setWidth(width);
        tableColumn.setText(columnLabel);
        return tableViewerColumn;
    }

    private Text addTextBoxInTable(TableViewer tableViewer, TableItem tableItem, String textBoxName,
            String valueTextPane, String editorName, int columnIndex, Listener listener) {
        final Composite buttonPane = new Composite(tableViewer.getTable(), SWT.NONE);
        buttonPane.setLayout(new FillLayout());
        final Text text = new Text(buttonPane, SWT.NONE);
        text.addListener(SWT.Modify, listener);
        text.setData(FilterConstants.ROW_INDEX, tableViewer.getTable().indexOf(tableItem));
        tableItem.setData(textBoxName, text);
        tableItem.setData(valueTextPane, buttonPane);
        //text.addModifyListener(FilterHelper.INSTANCE.getTextModifyListener());

        final TableEditor editor = new TableEditor(tableViewer.getTable());
        editor.grabHorizontal = true;
        editor.grabVertical = true;
        editor.setEditor(buttonPane, tableItem, columnIndex);
        editor.layout();
        text.setData(editorName, editor);
        return text;
    }

    private CCombo addComboInTable(TableViewer tableViewer, TableItem tableItem, String comboName,
            String comboPaneName, String editorName, int columnIndex, String[] relationalOperators,
            SelectionListener dropDownSelectionListener, ModifyListener modifyListener,
            FocusListener focusListener) {
        final Composite buttonPane = new Composite(tableViewer.getTable(), SWT.NONE);
        buttonPane.setLayout(new FillLayout());
        final CCombo combo = new CCombo(buttonPane, SWT.NONE);
        combo.setItems(relationalOperators);
        combo.setData(FilterConstants.ROW_INDEX, tableViewer.getTable().indexOf(tableItem));
        tableItem.setData(comboName, combo);
        tableItem.setData(comboPaneName, buttonPane);
        combo.addSelectionListener(dropDownSelectionListener);
        combo.addModifyListener(modifyListener);
        combo.addFocusListener(focusListener);
        new AutoCompleteField(combo, new CComboContentAdapter(), combo.getItems());
        final TableEditor editor = new TableEditor(tableViewer.getTable());
        editor.grabHorizontal = true;
        editor.grabVertical = true;
        editor.setEditor(buttonPane, tableItem, columnIndex);
        editor.layout();
        combo.setData(editorName, editor);
        return combo;
    }

    private void addButtonInTable(TableViewer tableViewer, TableItem tableItem, String columnName,
            String buttonPaneName, String editorName, int columnIndex, SelectionListener buttonSelectionListener,
            ImagePathConstant imagePath) {
        final Composite buttonPane = new Composite(tableViewer.getTable(), SWT.NONE);
        buttonPane.setLayout(new FillLayout());
        final Button button = new Button(buttonPane, SWT.NONE);
        //button.setText(columnName);
        button.setData(FilterConstants.ROW_INDEX, tableViewer.getTable().indexOf(tableItem));
        tableItem.setData(columnName, button);
        tableItem.setData(buttonPaneName, buttonPane);
        button.addSelectionListener(buttonSelectionListener);
        button.setImage(imagePath.getImageFromRegistry());

        final TableEditor editor = new TableEditor(tableViewer.getTable());
        editor.grabHorizontal = true;
        editor.grabVertical = true;
        editor.setEditor(buttonPane, tableItem, columnIndex);
        editor.layout();
        button.setData(editorName, editor);
    }

    private void addCheckButtonInTable(TableViewer tableViewer, TableItem tableItem, String columnName,
            String groupPaneName, String editorName, int columnIndex, SelectionListener buttonSelectionListener) {
        final Composite buttonPane = new Composite(tableViewer.getTable(), SWT.NONE);
        buttonPane.setLayout(new FillLayout());
        final Button button = new Button(buttonPane, SWT.CHECK);
        button.setData(FilterConstants.ROW_INDEX, tableViewer.getTable().indexOf(tableItem));
        if (null != buttonSelectionListener) {
            button.addSelectionListener(buttonSelectionListener);
        }
        tableItem.setData(columnName, button);
        tableItem.setData(groupPaneName, buttonPane);

        final TableEditor editor = new TableEditor(tableViewer.getTable());
        editor.grabHorizontal = true;
        editor.grabVertical = true;
        editor.setEditor(buttonPane, tableItem, columnIndex);
        editor.layout();
        button.setData(editorName, editor);
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
    }

    private SelectionListener getAddGroupButtonListner(final TableViewer tableViewer, final Button clearGroups,
            final List<Condition> conditionsList, final Button btnAddGrp,
            final TreeMap<Integer, List<List<Integer>>> groupSelectionMap, final boolean isRemote) {

        SelectionListener listener = new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                if (storeGroupSelection(tableViewer, groupSelectionMap)) {
                    FilterHelper.INSTANCE.disposeAllColumns(tableViewer);
                    dummyList.clear();
                    dummyList.addAll(FilterHelper.INSTANCE.cloneList(conditionsList));
                    redrawAllColumns(tableViewer, conditionsList, btnAddGrp, groupSelectionMap, isRemote);
                    clearGroups.setEnabled(true);
                }
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
            }
        };

        return listener;
    }

    /**
     * Redraws the table in order to add or delete the grouping columns 
     * @param tableViewer
     * @param conditionsList
     * @param btnAddGrp
     * @param groupSelectionMap
     * @param isRemote
     */
    public void redrawAllColumns(TableViewer tableViewer, List<Condition> conditionsList, Button btnAddGrp,
            TreeMap<Integer, List<List<Integer>>> groupSelectionMap, boolean isRemote) {

        TableViewerColumn addButtonTableViewerColumn = createTableColumns(tableViewer, "", 28);
        addButtonTableViewerColumn
                .setLabelProvider(getAddButtonCellProvider(tableViewer, conditionsList, groupSelectionMap));

        TableViewerColumn removeButtonTableViewerColumn = createTableColumns(tableViewer, "", 28);
        removeButtonTableViewerColumn.setLabelProvider(
                getRemoveButtonCellProvider(tableViewer, conditionsList, btnAddGrp, groupSelectionMap, isRemote));

        TableViewerColumn groupButtonTableViewerColumn = createTableColumns(tableViewer, "", 40);
        groupButtonTableViewerColumn
                .setLabelProvider(getGroupCheckCellProvider(tableViewer, conditionsList, btnAddGrp));

        for (int key : groupSelectionMap.keySet()) {

            TableViewerColumn dummyTableViewerColumn = createTableColumns(tableViewer, "", 20);
            dummyTableViewerColumn
                    .setLabelProvider(getDummyColumn(tableViewer, conditionsList, key, groupSelectionMap));
        }

        TableViewerColumn relationalDropDownColumn = createTableColumns(tableViewer, Messages.RELATIONAL_OPERATOR,
                120);
        relationalDropDownColumn.setLabelProvider(getRelationalCellProvider(tableViewer, conditionsList, isRemote));

        TableViewerColumn fieldNameDropDownColumn = createTableColumns(tableViewer, Messages.FIELD_NAME, 150);
        fieldNameDropDownColumn.setLabelProvider(getFieldNameCellProvider(tableViewer, conditionsList, isRemote));

        TableViewerColumn conditionalDropDownColumn = createTableColumns(tableViewer, Messages.CONDITIONAL_OPERATOR,
                130);
        conditionalDropDownColumn
                .setLabelProvider(getConditionalCellProvider(tableViewer, conditionsList, isRemote));

        TableViewerColumn value1TextBoxColumn = createTableColumns(tableViewer, Messages.VALUE1, 150);
        value1TextBoxColumn.setLabelProvider(getValue1CellProvider(tableViewer, conditionsList, isRemote));

        TableViewerColumn valueTextBoxValue2Column = createTableColumns(tableViewer, Messages.VALUE2, 150);
        valueTextBoxValue2Column.setLabelProvider(getValue2CellProvider(tableViewer, conditionsList, isRemote));

        btnAddGrp.setEnabled(false);

        tableViewer.refresh();
    }

    private boolean storeGroupSelection(TableViewer tableViewer,
            TreeMap<Integer, List<List<Integer>>> groupSelectionMap) {

        boolean retVal = false;
        List<List<Integer>> grpList = new ArrayList<>();
        List<Integer> selectionList = new ArrayList<>();

        TableItem[] items = tableViewer.getTable().getItems();

        for (TableItem tableItem : items) {
            Button button = (Button) tableItem.getData(GROUP_CHECKBOX);
            if (button.getSelection()) {
                selectionList.add(tableViewer.getTable().indexOf(tableItem));
            }
        }

        if (groupSelectionMap.isEmpty()) {
            grpList.add(selectionList);
            groupSelectionMap.put(0, grpList);
            retVal = true;
        } else {
            if (FilterHelper.INSTANCE.validateUserGroupSelection(groupSelectionMap, selectionList)) {
                if (FilterHelper.INSTANCE.isColumnModifiable(groupSelectionMap, selectionList)) {
                    retVal = true;
                } else {
                    grpList.add(selectionList);
                    Map<Integer, List<List<Integer>>> tempMap = new TreeMap<>();
                    tempMap.putAll(groupSelectionMap);
                    groupSelectionMap.clear();
                    groupSelectionMap.put(0, grpList);
                    for (int i = 0; i < tempMap.size(); i++) {
                        groupSelectionMap.put(i + 1, tempMap.get(i));
                    }
                    retVal = true;
                    FilterHelper.INSTANCE.rearrangeGroups(groupSelectionMap, selectionList);
                }
            }
        }
        return retVal;
    }

    /**
     * Removes the button listener.
     * 
     * @param tableViewer
     *            the table viewer
     * @param conditionsList
     *            the conditions list
     * @param dummyList
     *            the dummy list
     * @param groupSelectionMap
     *            the group selection map
     * @param btnAddGrp
     *            the btn add grp
     * @param isRemote
     *            the is remote
     * @return the selection listener
     */
    public SelectionListener removeButtonListener(final TableViewer tableViewer,
            final List<Condition> conditionsList, final List<Condition> dummyList,
            final TreeMap<Integer, List<List<Integer>>> groupSelectionMap, final Button btnAddGrp,
            final boolean isRemote) {
        SelectionListener listener = new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                if (conditionsList.size() > 1) {
                    Button button = (Button) e.getSource();
                    int removeIndex = (int) button.getData(FilterConstants.ROW_INDEX);

                    conditionsList.remove(removeIndex);
                    dummyList.clear();
                    dummyList.addAll(FilterHelper.INSTANCE.cloneList(conditionsList));
                    boolean isRemoveAllColumns = FilterHelper.INSTANCE.refreshGroupSelections(tableViewer,
                            removeIndex, "DEL", groupSelectionMap);

                    TableItem[] items = tableViewer.getTable().getItems();
                    items[removeIndex].dispose();

                    if (isRemoveAllColumns) {
                        FilterHelper.INSTANCE.rearrangeGroupColumns(groupSelectionMap);
                    }

                    FilterHelper.INSTANCE.disposeAllColumns(tableViewer);
                    redrawAllColumns(tableViewer, conditionsList, btnAddGrp, groupSelectionMap, isRemote);

                }
                tableViewer.refresh();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
            }
        };
        return listener;
    }

    /**
     * Gets the original filter conditions.
     * 
     * @return the original filter conditions
     */
    public FilterConditions getOriginalFilterConditions() {
        return originalFilterConditions;
    }

    /**
     * Sets the original filter conditions.
     * 
     * @param originalFilterConditions
     *            the new original filter conditions
     */
    public void setOriginalFilterConditions(FilterConditions originalFilterConditions) {
        this.originalFilterConditions = originalFilterConditions;
    }

    /**
     * Sets the debug data viewer adapter and viewer.
     * 
     * @param adapter
     *            the adapter
     * @param dataViewer
     *            the data viewer
     * @throws ClassNotFoundException
     *             the class not found exception
     * @throws SQLException
     *             the SQL exception
     */
    public void setDebugDataViewerAdapterAndViewer(DataViewerAdapter adapter, DebugDataViewer dataViewer)
            throws ClassNotFoundException, SQLException {
        dataViewerAdapter = adapter;
        debugDataViewer = dataViewer;
    }

    /**
     * Gets the conditions.
     * 
     * @return the conditions
     */
    public FilterConditions getConditions() {
        return originalFilterConditions;

    }

    /**
     * Gets the local conditions list.
     * 
     * @return the local conditions list
     */
    public List<Condition> getLocalConditionsList() {
        return localConditionsList;
    }

    /**
     * Sets the local conditions list.
     * 
     * @param localConditionsList
     *            the new local conditions list
     */
    public void setLocalConditionsList(List<Condition> localConditionsList) {
        this.localConditionsList = localConditionsList;
    }

    @Override
    protected void cancelPressed() {
        setReturnCode(CANCEL);
        close();
    }

    /**
     * Clear groups listner.
     * 
     * @param tableViewer
     *            the table viewer
     * @param groupSelectionMap
     *            the group selection map
     * @param clearGroups
     *            the clear groups
     * @param btnAddGrp
     *            the btn add grp
     * @param conditionsList
     *            the conditions list
     * @param isRemote
     *            the is remote
     * @return the selection listener
     */
    public SelectionListener clearGroupsListner(final TableViewer tableViewer,
            final TreeMap<Integer, List<List<Integer>>> groupSelectionMap, final Button clearGroups,
            final Button btnAddGrp, final List<Condition> conditionsList, final boolean isRemote) {
        SelectionListener listener = new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent e) {

                dummyList.clear();
                dummyList.addAll(FilterHelper.INSTANCE.cloneList(conditionsList));
                groupSelectionMap.clear();

                if (isRemote) {
                    originalFilterConditions.setRemoteGroupSelectionMap(groupSelectionMap);

                } else {

                    originalFilterConditions.setLocalGroupSelectionMap(groupSelectionMap);
                }

                FilterHelper.INSTANCE.disposeAllColumns(tableViewer);
                redrawAllColumns(tableViewer, conditionsList, btnAddGrp, groupSelectionMap, isRemote);
                clearGroups.setEnabled(false);

            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
            }
        };

        return listener;
    }

    /**
     * Gets the clear button listener.
     * 
     * @param tableViewer
     *            the table viewer
     * @param conditionsList
     *            the conditions list
     * @param dummyList
     *            the dummy list
     * @param originalFilterConditions
     *            the original filter conditions
     * @param isRemote
     *            the is remote
     * @param retainButton
     *            the retain button
     * @param groupSelectionMap
     *            the group selection map
     * @param btnAddGrp
     *            the btn add grp
     * @return the clear button listener
     */
    public SelectionListener getClearButtonListener(final TableViewer tableViewer,
            final List<Condition> conditionsList, final List<Condition> dummyList,
            final FilterConditions originalFilterConditions, final boolean isRemote, final Button retainButton,
            final TreeMap<Integer, List<List<Integer>>> groupSelectionMap, final Button btnAddGrp) {
        SelectionListener listner = new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                dummyList.clear();
                conditionsList.clear();
                dummyList.add(new Condition());
                retainButton.setSelection(false);

                groupSelectionMap.clear();

                if (isRemote) {
                    originalFilterConditions.setRetainRemote(false);
                    originalFilterConditions.setRemoteCondition("");
                    originalFilterConditions.setRemoteConditions(new ArrayList<Condition>());
                    debugDataViewer.setRemoteCondition("");
                    originalFilterConditions.setRemoteGroupSelectionMap(groupSelectionMap);
                    debugDataViewer.getDataViewerAdapter().setFilterCondition(debugDataViewer.getLocalCondition());
                    retainRemoteFilter.setRetainFilter(false);
                    FilterHelper.INSTANCE.setRemoteCondition("");
                    ((ReloadAction) debugDataViewer.getActionFactory().getAction(ReloadAction.class.getName()))
                            .setIfFilterReset(true);
                } else {
                    originalFilterConditions.setRetainLocal(false);
                    originalFilterConditions.setLocalCondition("");
                    originalFilterConditions.setLocalConditions(new ArrayList<Condition>());
                    debugDataViewer.setLocalCondition("");
                    originalFilterConditions.setLocalGroupSelectionMap(groupSelectionMap);
                    debugDataViewer.getDataViewerAdapter().setFilterCondition(debugDataViewer.getRemoteCondition());
                    retainLocalFilter.setRetainFilter(false);
                    FilterHelper.INSTANCE.setLocalCondition("");
                }
                TableItem[] items = tableViewer.getTable().getItems();
                tableViewer.refresh();
                for (int i = 0; i < items.length; i++) {
                    items[i].dispose();
                }
                conditionsList.add(0, new Condition());

                FilterHelper.INSTANCE.disposeAllColumns(tableViewer);
                redrawAllColumns(tableViewer, conditionsList, btnAddGrp, groupSelectionMap, isRemote);
                ((ReloadAction) debugDataViewer.getActionFactory().getAction(ReloadAction.class.getName())).run();
                debugDataViewer.submitRecordCountJob();
                cancelPressed();

            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
            }
        };
        return listner;
    }

    /**
     * Checks if local filter is set.
     * 
     * @return true, if local filter is set
     */
    public boolean isLocalFilterSet() {
        return retainLocalFilter.getRetainFilter();

    }

    /**
     * Checks if remote filter is set.
     * 
     * @return true, if remote filter is set
     */
    public boolean isRemoteFilterSet() {

        return retainRemoteFilter.getRetainFilter();
    }

    /**
     * Gets the remote conditions list.
     * 
     * @return the remote conditions list
     */
    public List<Condition> getRemoteConditionsList() {
        return remoteConditionsList;
    }

    /**
     * Sets the remote conditions list.
     * 
     * @param remoteConditionsList
     *            the new remote conditions list
     */
    public void setRemoteConditionsList(List<Condition> remoteConditionsList) {
        this.remoteConditionsList = remoteConditionsList;
    }

    /**
     * Gets the filter conditions.
     * 
     * @return the filter conditions
     */
    public FilterConditions getFilterConditions() {
        return originalFilterConditions;
    }

    /**
     * Gets the local group selections.
     * 
     * @return the local group selections
     */
    public Map<Integer, List<List<Integer>>> getLocalGroupSelections() {

        return localGroupSelectionMap;
    }

    /** Gets the remote group selections.
    * 
    * @return the remote group selections
    */
    public Map<Integer, List<List<Integer>>> getRemoteGroupSelections() {

        return remoteGroupSelectionMap;
    }

}