org.talend.dataprofiler.core.ui.dialog.TwoPartCheckSelectionDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.talend.dataprofiler.core.ui.dialog.TwoPartCheckSelectionDialog.java

Source

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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.TreeAdapter;
import org.eclipse.swt.events.TreeEvent;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.dialogs.SelectionStatusDialog;
import org.eclipse.ui.progress.UIJob;
import org.talend.core.model.properties.Property;
import org.talend.core.model.repository.ISubRepositoryObject;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.model.nodes.foldernode.ColumnFolderNode;
import org.talend.dataprofiler.core.model.nodes.foldernode.TableFolderNode;
import org.talend.dataprofiler.core.model.nodes.foldernode.ViewFolderNode;
import org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage;
import org.talend.dataprofiler.core.ui.filters.AbstractViewerFilter;
import org.talend.dataprofiler.core.ui.views.provider.ResourceViewContentProvider;
import org.talend.dq.helper.PropertyHelper;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.DBCatalogRepNode;
import org.talend.dq.nodes.DBColumnRepNode;
import org.talend.dq.nodes.DBConnectionRepNode;
import org.talend.dq.nodes.DBSchemaRepNode;
import org.talend.dq.nodes.DBTableRepNode;
import org.talend.dq.nodes.DBViewRepNode;
import org.talend.dq.nodes.DQRepositoryNode;
import org.talend.repository.model.IRepositoryNode;
import orgomg.cwm.objectmodel.core.ModelElement;

/**
 * A class to select elements out of a tree structure.
 * 
 * @since 2.0
 */
public abstract class TwoPartCheckSelectionDialog extends SelectionStatusDialog
        implements ISelectionChangedListener {

    private CheckboxTreeViewer fViewer;

    protected ILabelProvider fLabelProvider;

    protected ITreeContentProvider fContentProvider;

    private CheckboxTableViewer sTableViewer;

    protected ILabelProvider sLabelProvider;

    protected IStructuredContentProvider sContentProvider;

    private ISelectionStatusValidator fValidator = null;

    private ViewerComparator fComparator;

    private String fEmptyListMessage = DefaultMessagesImpl
            .getString("TwoPartCheckSelectionDialog.noEntriesAvailable"); //$NON-NLS-1$

    private IStatus fCurrStatus = new Status(IStatus.OK, PlatformUI.PLUGIN_ID, 0, "", null); //$NON-NLS-1$

    private List<ViewerFilter> fFilters;

    private Object fInput;

    private boolean fIsEmpty;

    private int fWidth = 60;

    private int fHeight = 18;

    protected boolean fContainerMode;

    private Object[] fExpandedElements;

    // ADD msjian 2011-7-8 feature 22206: Add filters
    private Text leftFilterText;

    private Text rightFilterText;

    private Label messageLabel;

    public Object[] getfExpandedElements() {
        return this.fExpandedElements;
    }

    public void setfExpandedElements(Object[] fExpandedElements) {
        this.fExpandedElements = fExpandedElements;
    }

    private AbstractAnalysisMetadataPage metadataFormPage;

    protected int dialogType;

    public int getDialogType() {
        return dialogType;
    }

    public void setDialogType(int dialogType) {
        this.dialogType = dialogType;
    }

    public static final int DIALOG_TYPE_COLUMN = 1;

    public static final int DIALOG_TYPE_TABLE = 2;

    protected IRepositoryNode selectedTreeRepoNode;

    private boolean addConnFilter = true;

    /**
     * Constructs an instance of <code>ElementTreeSelectionDialog</code>.
     * 
     * @param parent The shell to parent from.
     * @param labelProvider the label provider to render the entries
     * @param contentProvider the content provider to evaluate the tree structure
     */
    public TwoPartCheckSelectionDialog(AbstractAnalysisMetadataPage metadataFormPage, Shell parent,
            String message) {
        this(metadataFormPage, parent, message, true);
    }

    public TwoPartCheckSelectionDialog(AbstractAnalysisMetadataPage metadataFormPage, Shell parent, String message,
            boolean addConnFilter) {
        super(parent);
        setResult(new ArrayList(0));
        setStatusLineAboveButtons(true);
        fContainerMode = true;
        fExpandedElements = null;
        this.metadataFormPage = metadataFormPage;
        this.addConnFilter = addConnFilter;
        int shellStyle = getShellStyle();
        setShellStyle(shellStyle | SWT.MAX | SWT.RESIZE);
        setMessage(message);
        initProvider();
        // MOD mzhao 2009-05-05, bug 6587.
        if (addConnFilter) {
            addConnFilterListener();
        }

    }

    /**
     * Init the LabelProvider or ContentProvider for treeViewer and tableViewer.
     */
    protected abstract void initProvider();

    /**
     * If set, the checked /gray state of containers (inner nodes) is derived from the checked state of its leaf nodes.
     * 
     * @param containerMode The containerMode to set
     */
    public void setContainerMode(boolean containerMode) {
        fContainerMode = containerMode;
    }

    /**
     * Sets the message to be displayed if the list is empty.
     * 
     * @param message the message to be displayed.
     */
    public void setEmptyListMessage(String message) {
        fEmptyListMessage = message;
    }

    /**
     * Sets the sorter used by the tree viewer.
     * 
     * @param sorter
     * @deprecated since 3.3, use {@link TwoPartCheckSelectionDialog#setComparator(ViewerComparator)} instead
     */
    @Deprecated
    public void setSorter(ViewerSorter sorter) {
        fComparator = sorter;
    }

    /**
     * Sets the comparator used by the tree viewer.
     * 
     * @param comparator
     * @since 3.3
     */
    public void setComparator(ViewerComparator comparator) {
        fComparator = comparator;
    }

    /**
     * Adds a filter to the tree viewer.
     * 
     * @param filter a filter.
     */
    public void addFilter(ViewerFilter filter) {
        if (fFilters == null) {
            fFilters = new ArrayList<ViewerFilter>(4);
        }
        fFilters.add(filter);
    }

    /**
     * Sets an optional validator to check if the selection is valid. The validator is invoked whenever the selection
     * changes.
     * 
     * @param validator the validator to validate the selection.
     */
    public void setValidator(ISelectionStatusValidator validator) {
        fValidator = validator;
    }

    /**
     * Sets the tree input.
     * 
     * @param input the tree input.
     */
    public void setInput(Object input) {
        fInput = input;
    }

    public void setOutput(Object output) {
        sTableViewer.setInput(output);
    }

    /**
     * Expands elements in the tree.
     * 
     * @param elements The elements that will be expanded.
     */
    public void setExpandedElements(Object[] elements) {
        fExpandedElements = elements;
    }

    /**
     * Sets the size of the tree in unit of characters.
     * 
     * @param width the width of the tree.
     * @param height the height of the tree.
     */
    public void setSize(int width, int height) {
        fWidth = width;
        fHeight = height;
    }

    /**
     * Validate the receiver and update the status with the result.
     * 
     */
    protected void updateOKStatus() {
        if (!fIsEmpty) {
            if (fValidator != null) {
                fCurrStatus = fValidator.validate(fViewer.getCheckedElements());
                updateStatus(fCurrStatus);
            } else if (!fCurrStatus.isOK()) {
                fCurrStatus = new Status(IStatus.OK, PlatformUI.PLUGIN_ID, IStatus.OK, "", //$NON-NLS-1$
                        null);
            }
        } else {
            fCurrStatus = new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, IStatus.OK, fEmptyListMessage, null);
        }
        updateStatus(fCurrStatus);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.window.Window#open()
     */
    @Override
    public int open() {
        fIsEmpty = evaluateIfTreeEmpty(fInput);
        super.open();
        return getReturnCode();
    }

    /**
     * Handles cancel button pressed event.
     */
    @Override
    protected void cancelPressed() {
        setResult(null);
        super.cancelPressed();
    }

    /*
     * @see SelectionStatusDialog#computeResult()
     */
    @Override
    protected void computeResult() {
        setResult(Arrays.asList(fViewer.getCheckedElements()));
    }

    private void parentCreate() {
        super.create();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.window.Window#create()
     */
    @Override
    public void create() {
        BusyIndicator.showWhile(null, new Runnable() {

            public void run() {
                parentCreate();
                fViewer.setCheckedElements(getInitialElementSelections().toArray());
                fViewer.getTree().addTreeListener(new TreeAdapter() {

                    @Override
                    public void treeExpanded(TreeEvent e) {
                        TreeItem item = (TreeItem) e.item;
                        handleTreeExpanded(item);
                        super.treeExpanded(e);
                    }

                });

                updateOKStatus();
            }
        });
    }

    protected void handleTreeExpanded(TreeItem item) {
        if (!item.getText().endsWith(")")) { //$NON-NLS-1$
            Object obj = item.getData();

            if (obj instanceof TableFolderNode || obj instanceof ViewFolderNode
                    || obj instanceof ColumnFolderNode) {
                item.setText(item.getText() + "(" + item.getItemCount() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
                fViewer.getTree().layout();
            }
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets .Composite)
     */
    @Override
    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea(parent);
        messageLabel = createMessageArea(composite);
        messageLabel.setText(this.getMessage());
        Composite twoPartComp = new Composite(composite, 0);
        GridLayout layout = new GridLayout(2, true);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.verticalSpacing = 0;
        twoPartComp.setLayout(layout);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(twoPartComp);

        CheckboxTreeViewer treeViewer = createFirstPart(twoPartComp);
        sTableViewer = createSecondPart(twoPartComp);

        // ADD msjian 2011-7-8 feature 22206: Add filters
        // create the filter composite
        Control filterComposite = createFilterTexts(composite);
        // MOD klliu bug TDQ-4159 2012-03-07
        GridDataFactory.fillDefaults().hint(0, 30).applyTo(filterComposite);

        Control buttonComposite = createSelectionButtons(composite);
        GridData data = new GridData(GridData.FILL_BOTH);
        data.widthHint = convertWidthInCharsToPixels(fWidth);
        data.heightHint = convertHeightInCharsToPixels(fHeight);
        Tree treeWidget = treeViewer.getTree();
        treeWidget.setLayoutData(data);
        treeWidget.setFont(parent.getFont());
        if (fIsEmpty) {
            messageLabel.setEnabled(false);
            treeWidget.setEnabled(false);

            // ADD msjian 2011-7-8 feature 22206: Add filters
            filterComposite.setEnabled(false);

            buttonComposite.setEnabled(false);
        }
        addCheckedListener();
        // MOD mzhao bug 9240
        unfoldToCheckedElements();

        return composite;
    }

    /**
     * Add the checked listener for treeviewer or tableviewer.
     */
    protected abstract void addCheckedListener();

    /**
     * DOC mzhao 2009-05-05 bug: 6587, Add connection metadata filter.
     */

    private void addConnFilterListener() {
        AbstractViewerFilter connFiler = new AbstractViewerFilter() {

            @Override
            public int getId() {
                return 0;
            }

            @Override
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                if (element instanceof DBConnectionRepNode) {
                    DBConnectionRepNode node = (DBConnectionRepNode) element;
                    Integer selectIndex = metadataFormPage.getConnCombo().getSelectionIndex();
                    Integer connectionIndex = null;
                    Property property = (node.getObject()).getProperty();
                    ModelElement modelelement = PropertyHelper.getModelElement(property);
                    String dataKey = property.getDisplayName() + RepositoryNodeHelper.getConnectionType(node);
                    Object value = metadataFormPage.getConnCombo().getData(modelelement == null ? "" : dataKey); //$NON-NLS-1$
                    if (value != null && value instanceof Integer) {
                        connectionIndex = (Integer) value;
                    }
                    return (connectionIndex != null && selectIndex.intValue() == connectionIndex.intValue());
                }
                return true;
            }

        };
        addFilter(connFiler);
    }

    /**
     * Creates the tree viewer.
     * 
     * @param parent the parent composite
     * @return the tree viewer
     */
    protected CheckboxTreeViewer createFirstPart(Composite parent) {
        if (fContainerMode) {
            if (DIALOG_TYPE_TABLE == this.getDialogType()) {
                fViewer = new TableSelectionViewer(parent, SWT.BORDER);
            } else if (!this.addConnFilter) {
                fViewer = new MatchColumnSelectionViewer(parent, SWT.BORDER);
            } else {
                fViewer = new ColumnSelectionViewer(parent, SWT.BORDER);
            }
            // {
            //
            // protected void handleTreeExpand(TreeEvent event) {
            // super.handleTreeExpand(event);
            // checkElementChecked();
            // }
            // };
        } else {
            fViewer = new CheckboxTreeViewer(parent, SWT.BORDER) {

                @Override
                protected void handleTreeExpand(TreeEvent event) {
                    super.handleTreeExpand(event);
                    // checkElementChecked();
                }

            };
        }

        fViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
        applyDialogFont(fViewer.getTree());

        fViewer.setContentProvider(fContentProvider);
        // mod gdbu 2011-7-25 bug 23220
        ((ResourceViewContentProvider) fContentProvider).setTreeViewer(fViewer);
        // ~23220
        fViewer.setLabelProvider(fLabelProvider);
        fViewer.addCheckStateListener(new ICheckStateListener() {

            public void checkStateChanged(CheckStateChangedEvent event) {
                updateOKStatus();
            }
        });

        fViewer.setComparator(fComparator);
        if (fFilters != null) {
            for (int i = 0; i != fFilters.size(); i++) {
                fViewer.addFilter(fFilters.get(i));
            }
        }
        fViewer.setInput(fInput);
        // fViewer.
        fViewer.addSelectionChangedListener(this);
        return fViewer;
    }

    // protected void checkElementChecked() {
    // }

    protected CheckboxTableViewer createSecondPart(Composite parent) {
        CheckboxTableViewer viewer = CheckboxTableViewer.newCheckList(parent, SWT.MULTI | SWT.BORDER);
        viewer.setLabelProvider(this.sLabelProvider);
        viewer.setContentProvider(this.sContentProvider);
        viewer.addSelectionChangedListener(this);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(viewer.getTable());
        return viewer;
    }

    /**
     * Returns the tree viewer.
     * 
     * @return the tree viewer
     */
    protected CheckboxTreeViewer getTreeViewer() {
        return fViewer;
    }

    protected CheckboxTableViewer getTableViewer() {
        return sTableViewer;
    }

    /**
     * Adds the selection and deselection buttons to the dialog.
     * 
     * @param composite the parent composite
     * @return Composite the composite the buttons were created in.
     */
    protected Composite createSelectionButtons(Composite composite) {
        Composite buttonComposite = new Composite(composite, SWT.RIGHT);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        buttonComposite.setLayout(layout);
        buttonComposite.setFont(composite.getFont());
        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL);
        data.grabExcessHorizontalSpace = true;
        composite.setData(data);
        Button selectButton = createButton(buttonComposite, IDialogConstants.SELECT_ALL_ID, "Select &All", false); //$NON-NLS-1$

        Button deselectButton = createButton(buttonComposite, IDialogConstants.DESELECT_ALL_ID, "&Deselect All", //$NON-NLS-1$
                false);

        addSelectionButtonListener(selectButton, deselectButton);
        return buttonComposite;
    }

    /**
     * Add the listeners for all select(deselect) button.
     * 
     * @param selectButton
     * @param deselectButton
     */
    protected void addSelectionButtonListener(Button selectButton, Button deselectButton) {
        SelectionListener listener = new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                Object[] viewerElements = fContentProvider.getElements(fInput);
                if (fContainerMode) {
                    fViewer.setCheckedElements(viewerElements);
                } else {
                    for (Object viewerElement : viewerElements) {
                        fViewer.setSubtreeChecked(viewerElement, true);
                    }
                }
                updateOKStatus();
            }
        };
        selectButton.addSelectionListener(listener);

        listener = new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                fViewer.setCheckedElements(new Object[0]);
                updateOKStatus();
            }
        };
        deselectButton.addSelectionListener(listener);
    }

    // ADD msjian 2011-7-8 feature 22206: Add filters
    /**
     * Adds the table and column filter texts to the dialog.
     * 
     * @param composite the parent composite
     * @return Composite the composite the filter texts were created in.
     */
    protected Composite createFilterTexts(Composite composite) {
        Composite filterTextsComposite = new Composite(composite, 0);
        GridLayout layout = new GridLayout(6, false);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.verticalSpacing = 0;
        filterTextsComposite.setLayout(layout);
        filterTextsComposite.setFont(composite.getFont());
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(filterTextsComposite);

        Label leftFilterLabel = new Label(filterTextsComposite, SWT.NONE);
        if (DIALOG_TYPE_TABLE == this.getDialogType()) {
            leftFilterLabel
                    .setText(DefaultMessagesImpl.getString("TwoPartCheckSelectionDialog.SchemaCatalogFilter"));//$NON-NLS-1$
        } else {
            leftFilterLabel.setText(DefaultMessagesImpl.getString("TwoPartCheckSelectionDialog.TableFilter"));//$NON-NLS-1$    
        }
        GridData gd1 = new GridData(GridData.FILL_HORIZONTAL);
        gd1.horizontalSpan = 1;
        gd1.grabExcessHorizontalSpace = false;
        leftFilterLabel.setLayoutData(gd1);

        leftFilterText = new Text(filterTextsComposite, SWT.BORDER | SWT.SINGLE);
        leftFilterText.setMessage(DefaultMessagesImpl.getString("TwoPartCheckSelectionDialog.FilterMessage"));// $NON-NSL-1$
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 2;
        gd.grabExcessHorizontalSpace = true;
        leftFilterText.setLayoutData(gd);

        Label rightFilterLabel = new Label(filterTextsComposite, SWT.NONE);
        if (DIALOG_TYPE_TABLE == this.getDialogType()) {
            rightFilterLabel.setText(DefaultMessagesImpl.getString("TwoPartCheckSelectionDialog.TableFilter"));//$NON-NLS-1$    
        } else {
            rightFilterLabel.setText(DefaultMessagesImpl.getString("TwoPartCheckSelectionDialog.ColumnFilter"));// $NON-NSL-1$
        }

        rightFilterText = new Text(filterTextsComposite, SWT.BORDER | SWT.SINGLE);
        rightFilterText.setMessage(DefaultMessagesImpl.getString("TwoPartCheckSelectionDialog.FilterMessage"));// $NON-NSL-1$
        rightFilterText.setLayoutData(gd);

        addFilterTextsListener();

        return filterTextsComposite;
    }

    /**
     * DOC msjian the FilterJob, use to run the filters.
     */
    class FilterJob extends UIJob {

        private String filter;

        private boolean isfViewer;

        /**
         * set the filter string.
         * 
         * @param text
         */
        public void setFilter(String text) {
            this.filter = text;
        }

        /**
         * Sets the viewer.
         * 
         * @param viewer (fViewer or sTableViewer)
         */
        public void setViewer(boolean isfViewer) {
            this.isfViewer = isfViewer;
        }

        public FilterJob(String name, String filter, boolean isfViewer) {
            super(name);
            this.filter = filter;
            this.isfViewer = isfViewer;
        }

        @Override
        public IStatus runInUIThread(final IProgressMonitor monitor) {
            getDisplay().asyncExec(new Runnable() {

                public void run() {

                    boolean save = DQRepositoryNode.isOnFilterring();
                    String value = DQRepositoryNode.getFilterStr();
                    boolean untilSchema = false;
                    boolean untilTable = false;

                    try {
                        if (DIALOG_TYPE_TABLE == getDialogType()) {
                            untilSchema = DQRepositoryNode.isUntilSchema();
                        } else if (isfViewer) {
                            untilTable = DQRepositoryNode.isUntilTable();
                        }

                        DQRepositoryNode.setFilterStr(filter);

                        if (filter.equals("")) { //$NON-NLS-1$
                            DQRepositoryNode.setFiltering(false);
                            if (isfViewer) {
                                fViewer.refresh();
                                restoreCheckStatus();
                            } else {
                                // ADD msjian 2011-7-27 22206: fixed note 93509 when cleared the filter, the selected
                                // turn to unselected
                                sTableViewer.refresh();
                            }
                            unfoldToCheckedElements();
                        } else {
                            DQRepositoryNode.setFiltering(true);
                            if (isfViewer) {
                                if (DIALOG_TYPE_TABLE == getDialogType()) {
                                    DQRepositoryNode.setUntilSchema(true);
                                } else {
                                    DQRepositoryNode.setUntilTable(true);
                                }
                                // MOD msjian 2011-8-24: TDQ-3282 because there is something changed in
                                // DQRepositoryNode.filterResultsIfAny
                                DQRepositoryNode.setIsReturnAllNodesWhenFiltering(false);
                                fViewer.refresh();
                                fViewer.expandAll();
                                DQRepositoryNode.setIsReturnAllNodesWhenFiltering(true);
                                restoreCheckStatus();
                            } else {
                                DQRepositoryNode.setIsReturnAllNodesWhenFiltering(false);
                                sTableViewer.refresh();
                                DQRepositoryNode.setIsReturnAllNodesWhenFiltering(true);
                                restoreTableCheckStatus();
                                // TDQ-3282 ~
                            }
                        }
                    } finally {
                        DQRepositoryNode.setFiltering(save);
                        DQRepositoryNode.setFilterStr(value);
                        if (isfViewer) {
                            DQRepositoryNode.setUntilTable(untilTable);
                        }
                        if (DIALOG_TYPE_TABLE == getDialogType()) {
                            DQRepositoryNode.setUntilSchema(untilSchema);
                        }
                    }

                    updateOKStatus();
                }

            });
            return Status.OK_STATUS;
        }
    }

    /**
     * restore the left viewer's check status.
     */
    protected abstract void restoreCheckStatus();

    /**
     * restore the right viewer's check status.
     */
    protected abstract void restoreTableCheckStatus();

    /**
     * Add the listeners for (table, column)filter texts.
     * 
     * @param leftFilterText
     * @param rightFilterText
     */
    protected void addFilterTextsListener() {
        final FilterJob job = new FilterJob("", leftFilterText.getText(), true);//$NON-NLS-1$
        ModifyListener listener1 = new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                job.cancel();
                job.setFilter(leftFilterText.getText());
                // if there is no input in 500 milliseconds, run the job
                job.schedule(500);
            }
        };
        leftFilterText.addModifyListener(listener1);

        final FilterJob job2 = new FilterJob("", rightFilterText.getText(), false);//$NON-NLS-1$
        ModifyListener listener2 = new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                job2.cancel();
                job2.setFilter(rightFilterText.getText());
                // if there is no input in 500 milliseconds, run the job
                job2.schedule(500);
            }
        };
        rightFilterText.addModifyListener(listener2);
    }

    private boolean evaluateIfTreeEmpty(Object input) {
        Object[] elements = fContentProvider.getElements(input);
        if (elements.length > 0) {
            if (fFilters != null) {
                for (int i = 0; i < fFilters.size(); i++) {
                    ViewerFilter curr = fFilters.get(i);
                    elements = curr.filter(fViewer, input, elements);
                }
            }
        }
        return elements.length == 0;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.dialogs.SelectionDialog#setMessage(java.lang.String)
     */
    @Override
    public void setMessage(String message) {

        super.setMessage(message);
        if (messageLabel != null) {
            this.messageLabel.setText(message);
        }
    }

    /**
     * judge whether is hided node
     * 
     * @param selectNode
     * @return
     */
    protected boolean isHideNode(List<IRepositoryNode> nodeList) {
        for (IRepositoryNode selectNode : nodeList) {
            if (isHideNode(selectNode)) {
                return true;
            }
        }
        return false;
    }

    /**
     * judge whether is hided node
     * 
     * @param selectNode
     * @return
     */
    protected boolean isHideNode(IRepositoryNode selectNode) {
        if (getRealNodeFromRepository(selectNode) == null) {
            return true;
        }
        return false;
    }

    /**
     * DOC talend Comment method "getRealNodeFromRepository".
     * 
     * @param selectNode
     * @return
     */
    protected IRepositoryNode getRealNodeFromRepository(IRepositoryNode selectNode) {
        IRepositoryNode returnNode = null;
        ModelElement currModelElement = null;
        if (selectNode.getObject() instanceof ISubRepositoryObject) {
            currModelElement = ((ISubRepositoryObject) selectNode.getObject()).getModelElement();
        }
        if (currModelElement != null) {
            returnNode = RepositoryNodeHelper.recursiveFind(currModelElement);
        }
        return returnNode;
    }

    /**
     * find the last one which is visible Real repository node.
     * 
     * @param reposNode
     */
    protected IRepositoryNode findLastVisibleNode(IRepositoryNode reposNode) {
        if (reposNode == null) {
            return null;
        }
        IRepositoryNode returnNode = getRealNodeFromRepository(reposNode);
        if (returnNode == null) {
            returnNode = findLastVisibleNode(reposNode.getParent());
        }
        return returnNode;
    }

    /**
     * when parentNode is catalogNode or SchemaNode we need to select tableFolderNode or ViewFolderNode or the left
     * treeView
     */
    protected IRepositoryNode getAdaptLocationNode(IRepositoryNode parentNode, IRepositoryNode childNode) {
        // to get TableFolderNode or viewFolderNode
        IRepositoryNode FolderNode = getContainedFolderNode(childNode);
        if (FolderNode == null
                || !(parentNode instanceof DBCatalogRepNode) && !(parentNode instanceof DBSchemaRepNode)) {
            return null;
        }
        if (childNode != null) {
            for (IRepositoryNode theFolderNode : parentNode.getChildren()) {
                if (theFolderNode.getLabel().equalsIgnoreCase(FolderNode.getLabel())) {
                    return theFolderNode;
                }
            }
        }
        return null;
    }

    /**
     * get TableFolderNode or ViewFolderNode.
     * 
     * @param childNode
     * @return
     */
    private IRepositoryNode getContainedFolderNode(IRepositoryNode childNode) {
        if (childNode instanceof DBColumnRepNode) {
            return childNode.getParent().getParent().getParent();
        } else if (childNode instanceof DBTableRepNode || childNode instanceof DBViewRepNode) {
            return childNode.getParent();
        }
        return null;
    }

    protected abstract void unfoldToCheckedElements();

}