org.eclipse.wazaabi.engine.swt.commons.views.collections.SWTCollectionView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.wazaabi.engine.swt.commons.views.collections.SWTCollectionView.java

Source

/*******************************************************************************
 * Copyright (c) 2008 Olivier Moises
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Olivier Moises- initial API and implementation
 *******************************************************************************/

package org.eclipse.wazaabi.engine.swt.commons.views.collections;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.wazaabi.engine.core.editparts.CollectionEditPart;
import org.eclipse.wazaabi.engine.core.views.CollectionView;
import org.eclipse.wazaabi.engine.edp.PathException;
import org.eclipse.wazaabi.engine.edp.locationpaths.IPointersEvaluator;
import org.eclipse.wazaabi.engine.swt.commons.views.SWTControlView;
import org.eclipse.wazaabi.mm.core.styles.BooleanRule;
import org.eclipse.wazaabi.mm.core.styles.ColorRule;
import org.eclipse.wazaabi.mm.core.styles.FontRule;
import org.eclipse.wazaabi.mm.core.styles.StyleRule;
import org.eclipse.wazaabi.mm.core.styles.StyledElement;
import org.eclipse.wazaabi.mm.core.styles.collections.ColumnDescriptor;
import org.eclipse.wazaabi.mm.core.styles.collections.DynamicProvider;
import org.eclipse.wazaabi.mm.core.styles.collections.LookAndFeel;
import org.eclipse.wazaabi.mm.core.styles.collections.LookAndFeelRule;
import org.eclipse.wazaabi.mm.core.styles.collections.PathSelector;
import org.eclipse.wazaabi.mm.core.widgets.Collection;
import org.eclipse.wazaabi.mm.swt.descriptors.SWTDescriptorsPackage;

public class SWTCollectionView extends SWTControlView implements CollectionView {

    private final ColumnManager columnManager = new ColumnManager(this);

    private IBaseLabelProvider labelProvider = null;

    /**
     * ComboViewers return a non null LabelProvider when no
     * comboViewer.setLabelProvider has been called. In order to never get a
     * null LabelProvider, this class replaces the one returned by ComboViewer.
     * 
     * @author Olivier
     * 
     */
    private static class DefaultComboLabelProvider implements ITableLabelProvider, ILabelProvider {

        public void removeListener(ILabelProviderListener listener) {
        }

        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        public void dispose() {
        }

        public void addListener(ILabelProviderListener listener) {
        }

        public String getColumnText(Object element, int columnIndex) {
            return element == null ? "" : element.toString();//$NON-NLS-1$
        }

        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        public Image getImage(Object element) {
            return null;
        }

        public String getText(Object element) {
            return element == null ? "" : element.toString();//$NON-NLS-1$
        }
    };

    private static final DefaultComboLabelProvider defaultComboLabelProvider = new DefaultComboLabelProvider();

    public IBaseLabelProvider getLabelProvider() {
        if (getSWTCollectionControl() instanceof org.eclipse.swt.widgets.Combo && getViewer() != null)
            return (IBaseLabelProvider) getViewer().getLabelProvider();
        return labelProvider;
    }

    public org.eclipse.swt.widgets.Control getSWTCollectionControl() {
        if (getSWTWidget() instanceof org.eclipse.swt.widgets.Combo)
            return (org.eclipse.swt.widgets.Combo) getSWTWidget();
        else
            return ((org.eclipse.swt.widgets.Composite) getSWTWidget()).getChildren()[0];
    }

    public void setLabelProvider(IBaseLabelProvider labelProvider) {
        if (getSWTCollectionControl() instanceof org.eclipse.swt.widgets.Combo && getViewer() != null)
            getViewer().setLabelProvider(labelProvider);
        else
            this.labelProvider = labelProvider;
    }

    private boolean selectionChangedListenerBlocked = false;
    private boolean checkStateListenerBlocked = false;

    private ICheckStateListener checkStateListener = new ICheckStateListener() {

        public void checkStateChanged(CheckStateChangedEvent event) {
            if (!checkStateListenerBlocked) {
                ((CollectionEditPart) getHost()).blockCheckStateListening();
                try {
                    if (event.getChecked()) {
                        List<Object> checkedElements = ((Collection) getHost().getModel()).getCheckedElements();
                        if (!checkedElements.contains(event.getElement()))
                            checkedElements.add(event.getElement());
                    } else
                        ((Collection) getHost().getModel()).getCheckedElements().remove(event.getElement());
                } finally {
                    ((CollectionEditPart) getHost()).releaseCheckStateListening();
                }
            }
        }
    };

    private ISelectionChangedListener selectionChangedListener = new ISelectionChangedListener() {

        @SuppressWarnings("unchecked")
        public void selectionChanged(SelectionChangedEvent event) {
            if (!selectionChangedListenerBlocked && event.getSelection() instanceof StructuredSelection) {
                ((CollectionEditPart) getHost()).blockSelectionListening();
                try {
                    merge(((Collection) getHost().getModel()).getSelection(),
                            ((StructuredSelection) event.getSelection()).toList());
                } finally {
                    ((CollectionEditPart) getHost()).releaseSelectionListening();

                }
            }
        }

    };

    protected static void merge(EList<Object> previousList, List<Object> newList) {
        List<Object> toRemove = new ArrayList<Object>();
        for (Object previous : previousList)
            if (!newList.contains(previous))
                toRemove.add(previous);
        for (Object item : toRemove)
            previousList.remove(item);
        for (int i = 0; i < newList.size(); i++)
            if (i >= previousList.size())
                previousList.add(i, newList.get(i));
            else {
                int idx = previousList.indexOf(newList.get(i));
                if (idx != -1) {
                    if (idx != i)
                        previousList.move(i, idx);
                } else
                    previousList.add(i, newList.get(i));
            }
    }

    public EClass getWidgetViewEClass() {
        return SWTDescriptorsPackage.Literals.COLLECTION;
    }

    @Override
    public boolean needReCreateWidgetView(StyleRule styleRule) {
        return needReCreateWidgetView(styleRule, getSWTCollectionControl());
    }

    @Override
    protected boolean needReCreateWidgetView(StyleRule rule, org.eclipse.swt.widgets.Widget widget) {
        if (rule instanceof LookAndFeelRule
                && CollectionEditPart.LOOK_AND_FEEL_PROPERTY_NAME.equals(rule.getPropertyName()))
            return !isLookAndFeelCorrect(((LookAndFeelRule) rule).getValue());
        else if (rule instanceof BooleanRule && !(widget instanceof org.eclipse.swt.widgets.Combo)
                && CollectionEditPart.CHECKABLE_PROPERTY_NAME.equals(rule.getPropertyName()))
            return !(isStyleBitCorrectlySet(widget, org.eclipse.swt.SWT.CHECK, ((BooleanRule) rule).isValue()));
        else if (rule instanceof BooleanRule && !(widget instanceof org.eclipse.swt.widgets.Combo)
                && CollectionEditPart.ALLOW_ROW_SELECTION_PROPERTY_NAME.equals(rule.getPropertyName()))
            return !(isStyleBitCorrectlySet(widget, org.eclipse.swt.SWT.FULL_SELECTION,
                    ((BooleanRule) rule).isValue()));
        else if (rule instanceof BooleanRule && !(widget instanceof org.eclipse.swt.widgets.Combo)
                && CollectionEditPart.MULTIPLE_SELECTION_PROPERTY_NAME.equals(rule.getPropertyName()))
            return !(isStyleBitCorrectlySet(widget, org.eclipse.swt.SWT.MULTI, ((BooleanRule) rule).isValue()));
        // else if (rule instanceof ScrollBarRule
        // && !(widget instanceof org.eclipse.swt.widgets.Combo)
        // && TextComponentEditPart.HORIZONTAL_SCROLLBAR_PROPERTY_NAME
        // .equals(rule.getPropertyName()))
        // return !(isStyleBitCorrectlySet(widget,
        // org.eclipse.swt.SWT.H_SCROLL, true));
        // else if (rule instanceof ScrollBarRule
        // && !(widget instanceof org.eclipse.swt.widgets.Combo)
        // && TextComponentEditPart.VERTICAL_SCROLLBAR_PROPERTY_NAME
        // .equals(rule.getPropertyName()))
        // return !(isStyleBitCorrectlySet(widget,
        // org.eclipse.swt.SWT.V_SCROLL, true));
        else
            return super.needReCreateWidgetView(rule, widget);
    }

    /**
     * Returns the LookAndFell associated to the model, null otherwise.
     * 
     * @return A LookAndFeel if found, null otherwise.
     */
    protected LookAndFeel getLookAndFeel() {
        for (StyleRule rule : ((StyledElement) getHost().getModel()).getStyleRules())
            if (CollectionEditPart.LOOK_AND_FEEL_PROPERTY_NAME.equals(rule.getPropertyName())
                    && rule instanceof LookAndFeelRule)
                return ((LookAndFeelRule) rule).getValue();
        return null;
    }

    /**
     * given a LookAndFeel, returns whether the SWT Widget is an instance of the
     * corresponding class.
     * 
     * @param rule
     * @return
     */
    protected boolean isLookAndFeelCorrect(LookAndFeel lookAndFeel) {
        final org.eclipse.swt.widgets.Widget widget = getSWTCollectionControl();
        switch (lookAndFeel.getValue()) {
        case LookAndFeel.COMBOBOX_VALUE:
            return widget instanceof org.eclipse.swt.widgets.Combo;
        case LookAndFeel.TABLE_VALUE:
            return widget instanceof org.eclipse.swt.widgets.Table;
        case LookAndFeel.TREE_VALUE:
            return widget instanceof org.eclipse.swt.widgets.Tree;
        }
        return false;
    }

    protected int computeSWTCreationStyleForTableOrTree() {
        int selection_style = SWT.FULL_SELECTION;
        int multiselect_style = SWT.NONE;
        // int scrollbarStyle = SWT.None;

        for (StyleRule rule : ((StyledElement) getHost().getModel()).getStyleRules()) {
            if (CollectionEditPart.ALLOW_ROW_SELECTION_PROPERTY_NAME.equals(rule.getPropertyName())
                    && rule instanceof BooleanRule) {
                if (!((BooleanRule) rule).isValue())
                    selection_style = SWT.NONE;
            }
            if (CollectionEditPart.MULTIPLE_SELECTION_PROPERTY_NAME.equals(rule.getPropertyName())
                    && rule instanceof BooleanRule) {
                if (((BooleanRule) rule).isValue()) {
                    multiselect_style = SWT.MULTI;
                }
            }
            // if (TextComponentEditPart.HORIZONTAL_SCROLLBAR_PROPERTY_NAME
            // .equals(rule.getPropertyName())
            // && rule instanceof ScrollBarRule)
            // scrollbarStyle |= SWT.H_SCROLL;
            // if (TextComponentEditPart.VERTICAL_SCROLLBAR_PROPERTY_NAME
            // .equals(rule.getPropertyName())
            // && rule instanceof ScrollBarRule)
            // scrollbarStyle |= SWT.V_SCROLL;
        }
        return selection_style | multiselect_style /* | scrollbarStyle */;
    }

    protected boolean isCheckable() {
        for (StyleRule rule : ((StyledElement) getHost().getModel()).getStyleRules())
            if (CollectionEditPart.CHECKABLE_PROPERTY_NAME.equals(rule.getPropertyName())
                    && rule instanceof BooleanRule)
                return ((BooleanRule) rule).isValue();
        return false;
    }

    protected StructuredViewer viewer = null;

    public StructuredViewer getViewer() {
        return viewer;
    }

    protected Widget createSWTWidget(Widget parent, int swtStyle, int index) {
        int style = computeSWTCreationStyle(getHost());

        LookAndFeel lookAndFeel = getLookAndFeel();
        if (lookAndFeel == null)
            lookAndFeel = LookAndFeel.TABLE;

        switch (lookAndFeel.getValue()) {
        case LookAndFeel.COMBOBOX_VALUE:
            viewer = new ComboViewer(
                    createCombo((org.eclipse.swt.widgets.Composite) parent, style | SWT.READ_ONLY)) {

                public void setLabelProvider(IBaseLabelProvider labelProvider) {
                    assert labelProvider instanceof IBaseLabelProvider;
                    IBaseLabelProvider oldProvider = SWTCollectionView.this.labelProvider;
                    // If it hasn't changed, do nothing.
                    // This also ensures that the provider is not disposed
                    // if set a second time.
                    if (labelProvider == oldProvider) {
                        return;
                    }

                    SWTCollectionView.this.labelProvider = (IBaseLabelProvider) labelProvider;

                    refresh();

                    // Dispose old provider after refresh, so that items never
                    // refer to stale images.
                    if (oldProvider != null) {
                        oldProvider.dispose();
                    }
                }

                public IBaseLabelProvider getLabelProvider() {
                    if (labelProvider == null)
                        return defaultComboLabelProvider;
                    return labelProvider;
                }

            };
            viewer.addSelectionChangedListener(getSelectionChangedListener());
            return ((ComboViewer) viewer).getCombo();
        case LookAndFeel.TREE_VALUE: {
            org.eclipse.swt.widgets.Composite layoutHolder = createLayoutHolder(
                    (org.eclipse.swt.widgets.Composite) parent, SWT.NONE);
            layoutHolder.setLayout(new TreeColumnLayout());

            if (isCheckable()) {
                viewer = new CheckboxTreeViewer(createTree(layoutHolder,
                        SWT.CHECK | computeSWTCreationStyle(getHost()) | computeSWTCreationStyleForTableOrTree()));
                ((CheckboxTreeViewer) viewer).addCheckStateListener(getCheckStateListener());
            } else
                viewer = new TreeViewer(createTree(layoutHolder,
                        computeSWTCreationStyle(getHost()) | computeSWTCreationStyleForTableOrTree()));
            viewer.addSelectionChangedListener(getSelectionChangedListener());
            return layoutHolder;
        }
        case LookAndFeel.TABLE_VALUE: {
            org.eclipse.swt.widgets.Composite layoutHolder = createLayoutHolder(
                    (org.eclipse.swt.widgets.Composite) parent, SWT.NONE);
            layoutHolder.setLayout(new TableColumnLayout());

            if (isCheckable()) {
                viewer = new CheckboxTableViewer(createTable(layoutHolder,
                        SWT.CHECK | computeSWTCreationStyle(getHost()) | computeSWTCreationStyleForTableOrTree()));
                ((CheckboxTableViewer) viewer).addCheckStateListener(getCheckStateListener());

            } else
                viewer = new TableViewer(layoutHolder,
                        computeSWTCreationStyle(getHost()) | computeSWTCreationStyleForTableOrTree());
            viewer.addSelectionChangedListener(getSelectionChangedListener());
            return layoutHolder;
        }
        }
        throw new RuntimeException("Invalid LookAndFeel value"); //$NON-NLS-1$
    }

    protected org.eclipse.swt.widgets.Composite createLayoutHolder(org.eclipse.swt.widgets.Composite parent,
            int style) {
        return new org.eclipse.swt.widgets.Composite((org.eclipse.swt.widgets.Composite) parent, SWT.NONE);
    }

    protected org.eclipse.swt.widgets.Combo createCombo(org.eclipse.swt.widgets.Composite parent, int style) {
        return new Combo(parent, style);
    }

    protected org.eclipse.swt.widgets.Table createTable(org.eclipse.swt.widgets.Composite parent, int style) {
        return new org.eclipse.swt.widgets.Table(parent, style);
    }

    protected org.eclipse.swt.widgets.Tree createTree(org.eclipse.swt.widgets.Composite parent, int style) {
        return new org.eclipse.swt.widgets.Tree(parent, style);
    }

    public void setInput(Object input) {
        if (!getSWTControl().isDisposed() && getViewer() != null && getViewer().getContentProvider() != null)
            getViewer().setInput(input);
    }

    public void updateSameStyleRules(List<StyleRule> rules) {
        if (CollectionEditPart.COLUMN_DESCRIPTOR_PROPERTY_NAME.equals(rules.get(0).getPropertyName()))
            columnManager.update(rules);
        else if (CollectionEditPart.CONTENT_PROVIDER_PROPERTY_NAME.equals(rules.get(0).getPropertyName()))
            updateContentProvider(rules);
        else if (CollectionEditPart.LABEL_RENDERER_PROPERTY_NAME.equals(rules.get(0).getPropertyName()))
            updateLabelRenderer(rules);
        else if (CollectionEditPart.DYNAMIC_PROVIDER_PROPERTY_NAME.equals(rules.get(0).getPropertyName()))
            updateDynamicProviders(rules);
        else if (CollectionEditPart.FILTER_PROPERTY_NAME.equals(rules.get(0).getPropertyName()))
            updateDynamicFilterProviders(rules);
    }

    protected void updateComparator(DynamicProvider rule) {
        if (rule != null) {
            assert CollectionEditPart.COMPARATOR_PROPERTY_NAME.equals(rule.getPropertyName());
            if (getViewer() != null)
                if (getViewer().getComparator() == null) {
                    DynamicComparatorProvider comparator = new DynamicComparatorProvider();
                    comparator.updateDynamicProviderURI(rule.getUri(), getHost().getViewer(), getViewer());
                    getViewer().setComparator(comparator);
                } else
                    ((DynamicComparatorProvider) getViewer().getComparator())
                            .updateDynamicProviderURI(rule.getUri(), getHost().getViewer(), getViewer());
        } else {
            // need to dispose
            viewer.setSorter(null);
        }
    }

    protected void updateDynamicFilterProviders(List<StyleRule> rules) {
        if (getViewer() == null)
            return;
        if (rules != null && !rules.isEmpty()) {

            DynamicFilterProvider dynamicFilterProviders[] = new DynamicFilterProvider[rules.size()];

            Hashtable<String, DynamicFilterProvider> existingFilterProviders = new Hashtable<String, DynamicFilterProvider>();

            for (ViewerFilter filter : getViewer().getFilters())
                if (filter instanceof DynamicFilterProvider)
                    existingFilterProviders.put(((DynamicFilterProvider) filter).getURI(),
                            (DynamicFilterProvider) filter);

            int i = 0;
            for (StyleRule rule : rules) {
                String uri = ((DynamicProvider) rule).getUri();
                if (uri != null) {
                    DynamicFilterProvider dynamicFilterProvider = existingFilterProviders.get(uri);
                    if (dynamicFilterProvider != null) {
                        dynamicFilterProviders[i] = dynamicFilterProvider;
                        existingFilterProviders.remove(uri);
                    } else {
                        dynamicFilterProviders[i] = new DynamicFilterProvider();
                        dynamicFilterProviders[i].updateDynamicProviderURI(uri, getHost().getViewer());
                    }

                }
                i++;
            }
            getViewer().setFilters(dynamicFilterProviders);
        } else {
            for (ViewerFilter filter : getViewer().getFilters())
                if (filter instanceof DynamicFilterProvider)
                    ((DynamicFilterProvider) filter).dispose();
            getViewer().setFilters(new ViewerFilter[0]);
        }
    }

    protected void updateDynamicProviders(List<StyleRule> rules) {
        if (!rules.isEmpty()) {
            List<String> uris = new ArrayList<String>();
            List<DynamicProvider> dynamicProviders = new ArrayList<DynamicProvider>();
            for (StyleRule rule : rules)
                if (!uris.contains(((DynamicProvider) rule).getUri())) {
                    uris.add(((DynamicProvider) rule).getUri());
                    dynamicProviders.add((DynamicProvider) rule);
                }

            if (getViewer() != null) {
                if (!(getViewer().getContentProvider() instanceof DynamicContentProvider)) {
                    if (getViewer().getContentProvider() != null)
                        getViewer().getContentProvider().dispose();
                    getViewer().setContentProvider(new DynamicContentProvider());
                }
                if (!(getLabelProvider() instanceof DynamicLabelProvider)) {
                    if (getLabelProvider() != null)
                        getLabelProvider().dispose();
                    setLabelProvider(new DynamicLabelProvider());
                }

                ((DynamicContentProvider) getViewer().getContentProvider())
                        .updateDynamicProviderURIs(dynamicProviders, getHost().getViewer());

                ((DynamicLabelProvider) getLabelProvider()).updateDynamicProviderURIs(dynamicProviders,
                        getHost().getViewer());
            }
        }
    }

    protected void updateContentProvider(List<StyleRule> rules) {
        final Hashtable<String, List<String>> selectors = getSelectors(rules);
        if (getViewer() != null)
            getViewer().setContentProvider(new PathSelectorContentProvider(this, selectors));
    }

    protected Hashtable<String, List<String>> getSelectors(List<StyleRule> rules) {
        Hashtable<String, List<String>> selectors = new Hashtable<String, List<String>>();
        for (StyleRule rule : rules) {
            if (rule instanceof PathSelector) {
                PathSelector pathSelector = (PathSelector) rule;
                if (pathSelector.getEClassifierName() == null || "".equals(pathSelector.getEClassifierName()) //$NON-NLS-1$
                        || pathSelector.getPaths().isEmpty())
                    continue;
                List<String> paths = selectors.get(pathSelector.getEClassifierName());
                if (paths == null) {
                    paths = new ArrayList<String>();
                    selectors.put(pathSelector.getEClassifierName(), paths);
                }
                for (String path : pathSelector.getPaths())
                    paths.add(path);
            }
        }
        return selectors;
    }

    protected void updateLabelRenderer(List<StyleRule> rules) {
        final Hashtable<String, List<String>> selectors = getSelectors(rules);
        setLabelProvider(new org.eclipse.wazaabi.engine.swt.commons.views.collections.PathSelectorLabelProvider(
                this, selectors));
    }

    protected List<ColumnDescriptor> getColumnDescriptors() {
        List<ColumnDescriptor> columnDescriptors = new ArrayList<ColumnDescriptor>();
        for (StyleRule rule : ((StyledElement) getHost().getModel()).getStyleRules())
            if (rule instanceof ColumnDescriptor
                    && CollectionEditPart.COLUMN_DESCRIPTOR_PROPERTY_NAME.equals(rule.getPropertyName()))
                columnDescriptors.add((ColumnDescriptor) rule);
        return columnDescriptors;
    }

    protected ISelectionChangedListener getSelectionChangedListener() {
        return selectionChangedListener;
    }

    protected ICheckStateListener getCheckStateListener() {
        return checkStateListener;
    }

    public void refresh() {
        if (getSWTCollectionControl().isDisposed())
            return;
        if (getViewer() != null)
            getViewer().refresh();
    }

    public void setSelection(List<Object> newSelection) {
        if (getViewer() == null || getSWTCollectionControl().isDisposed())
            return;
        IStructuredSelection selection = null;
        if (newSelection == null || newSelection.isEmpty()) {
            if (getViewer().getSelection() == StructuredSelection.EMPTY
                    || (getViewer().getSelection() instanceof StructuredSelection
                            && getViewer().getSelection().isEmpty()))
                return;
            selection = StructuredSelection.EMPTY;
        } else {
            selection = new StructuredSelection(newSelection);
            if (areEquals((IStructuredSelection) getViewer().getSelection(), selection))
                return;
        }
        selectionChangedListenerBlocked = true;
        try {
            getViewer().setSelection(selection);
        } finally {
            selectionChangedListenerBlocked = false;
        }
    }

    public void setCheckState(Object element, boolean state) {
        if (getViewer() == null || getSWTCollectionControl().isDisposed())
            return;
        if (viewer instanceof CheckboxTreeViewer)
            try {
                checkStateListenerBlocked = true;
                ((CheckboxTreeViewer) viewer).setChecked(element, state);
            } finally {
                checkStateListenerBlocked = false;
            }
        else if (viewer instanceof CheckboxTableViewer)
            try {
                checkStateListenerBlocked = true;
                ((CheckboxTableViewer) viewer).setChecked(element, state);
            } finally {
                checkStateListenerBlocked = false;
            }
    }

    protected Object[] getElements(Object inputElement, Hashtable<String, List<String>> selectors) {
        if (inputElement instanceof EObject) {
            String eClassName = ((EObject) inputElement).eClass().getName();
            List<Object> result = new ArrayList<Object>();
            IPointersEvaluator pointersEvaluator = getHost().getViewer().getPointersEvaluator();
            List<String> paths = selectors.get(eClassName);
            for (String path : paths) {
                try {
                    List<?> pointers = pointersEvaluator.selectPointers(inputElement, path);
                    for (Object pointer : pointers) {
                        Object value = pointersEvaluator.getValue(pointer);
                        if (value instanceof List)
                            result.addAll((List<?>) value);
                        else
                            result.add(value);
                    }
                } catch (PathException e) {
                    System.err.println(e.getMessage()); // TODO : log that
                }

            }
            return result.toArray();
        }
        return new Object[] {};
    }

    @Override
    protected void widgetDisposed() {
        columnManager.dispose();
        super.widgetDisposed();
    }

    public void setHeaderVisible(boolean show) {
        if (getSWTCollectionControl() instanceof org.eclipse.swt.widgets.Tree)
            ((org.eclipse.swt.widgets.Tree) getSWTCollectionControl()).setHeaderVisible(show);
        else if (getSWTCollectionControl() instanceof org.eclipse.swt.widgets.Table)
            ((org.eclipse.swt.widgets.Table) getSWTCollectionControl()).setHeaderVisible(show);
    }

    public void setShowHorizontalLines(boolean show) {
        if (getSWTCollectionControl() instanceof org.eclipse.swt.widgets.Tree)
            ((org.eclipse.swt.widgets.Tree) getSWTCollectionControl()).setLinesVisible(show);
        else if (getSWTCollectionControl() instanceof org.eclipse.swt.widgets.Table)
            ((org.eclipse.swt.widgets.Table) getSWTCollectionControl()).setLinesVisible(show);
    }

    @Override
    public void updateStyleRule(StyleRule rule) {
        if (rule != null) {
            if (CollectionEditPart.HEADER_VISIBLE_PROPERTY_NAME.equals(rule.getPropertyName())) {
                if (rule instanceof BooleanRule)
                    setHeaderVisible(((BooleanRule) rule).isValue());
                else
                    setHeaderVisible(false);
            } else if (CollectionEditPart.SHOW_HORIZONTAL_LINES_PROPERTY_NAME.equals(rule.getPropertyName())) {
                if (rule instanceof BooleanRule)
                    setShowHorizontalLines(((BooleanRule) rule).isValue());
                else
                    setShowHorizontalLines(false);
            } else if (CollectionEditPart.COMPARATOR_PROPERTY_NAME.equals(rule.getPropertyName())) {
                if (rule instanceof DynamicProvider)
                    updateComparator((DynamicProvider) rule);
                else
                    updateComparator(null);
            } else if (CollectionEditPart.FILTER_PROPERTY_NAME.equals(rule.getPropertyName())) {
                // TODO : performance issue, we need to find a better way
                if (rule instanceof DynamicProvider) {
                    List<StyleRule> providers = new ArrayList<StyleRule>();
                    providers.add((DynamicProvider) rule);
                    updateDynamicFilterProviders(providers);
                } else
                    updateDynamicFilterProviders(null);
            } else
                super.updateStyleRule(rule);
        }
    }

    @Override
    protected void setBackgroundColor(ColorRule colorRule) {
        super.setBackgroundColor(getSWTCollectionControl(), colorRule);
    }

    @Override
    protected void setForegroundColor(ColorRule colorRule) {
        super.setForegroundColor(getSWTCollectionControl(), colorRule);
    }

    @Override
    protected void setEnabled(BooleanRule rule) {
        super.setEnabled(getSWTCollectionControl(), rule);
    }

    @Override
    public void setFont(FontRule fontRule) {
        super.setFont(getSWTCollectionControl(), fontRule);
    }

    public boolean areEquals(IStructuredSelection selection1, IStructuredSelection selection2) {
        if (selection1 == null)
            return selection2 == null;
        if (selection2 == null)
            return false;
        if (selection1.size() != selection2.size())
            return false;
        for (int i = 0; i < selection1.size(); i++) {
            Object item1 = selection1.toArray()[i];
            Object item2 = selection2.toArray()[i];

            if (item1 == null) {
                if (item2 != null)
                    return false;
            } else if (!item1.equals(item2))
                return false;
        }
        return true;
    }
}