fr.inria.soctrace.tools.ocelotl.microdesc.ui.DistributionBaseView.java Source code

Java tutorial

Introduction

Here is the source code for fr.inria.soctrace.tools.ocelotl.microdesc.ui.DistributionBaseView.java

Source

/* =====================================================================
 * Ocelotl Visualization Tool
 * =====================================================================
 * 
 * Ocelotl is a Framesoc plug in that enables to visualize a trace 
 * overview by using aggregation techniques
 *
 * (C) Copyright 2013 INRIA
 *
 * 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:
 *     Damien Dosimont <damien.dosimont@imag.fr>
 *     Generoso Pagano <generoso.pagano@inria.fr>
 */

package fr.inria.soctrace.tools.ocelotl.microdesc.ui;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Group;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.ui.dialogs.ListSelectionDialog;
import org.eclipse.wb.swt.SWTResourceManager;

import fr.inria.soctrace.framesoc.ui.utils.AlphanumComparator;
import fr.inria.soctrace.lib.model.AnalysisResult;
import fr.inria.soctrace.lib.model.EventProducer;
import fr.inria.soctrace.lib.model.EventType;
import fr.inria.soctrace.lib.model.utils.SoCTraceException;
import fr.inria.soctrace.tools.ocelotl.core.config.ITraceTypeConfig;
import fr.inria.soctrace.tools.ocelotl.core.constants.OcelotlConstants.HasChanged;
import fr.inria.soctrace.tools.ocelotl.core.parameters.OcelotlParameters;
import fr.inria.soctrace.tools.ocelotl.microdesc.config.DistributionConfig;
import fr.inria.soctrace.tools.ocelotl.ui.views.IAggregationWindow;
import fr.inria.soctrace.tools.ocelotl.ui.views.OcelotlView;
import fr.inria.soctrace.tools.ocelotl.core.model.SimpleEventProducerHierarchy.SimpleEventProducerNode;

import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;

public abstract class DistributionBaseView extends Dialog implements IAggregationWindow {

    public class CheckAllEventProducersAdapter extends SelectionAdapter {

        @Override
        public void widgetSelected(SelectionEvent e) {
            Object[] viewerElements = new FilterTreeContentProvider()
                    .getElements(params.getEventProducerHierarchy().getRoot());

            for (int i = 0; i < viewerElements.length; i++) {
                treeViewerEventProducer.setSubtreeChecked(viewerElements[i], true);
            }
            updateSelectedEventProducer();
        }
    }

    private class AddEventProducerAdapter extends SelectionAdapter {

        // all - input
        java.util.List<Object> diff(final java.util.List<EventProducer> all,
                final java.util.List<EventProducer> input) {
            final java.util.List<Object> tmp = new LinkedList<>();
            for (final Object oba : all)
                tmp.add(oba);
            tmp.removeAll(input);
            return tmp;
        }

        @Override
        public void widgetSelected(final SelectionEvent e) {

            final ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(),
                    new EventProducerLabelProvider());
            dialog.setTitle("Select Event Producers");
            dialog.setMessage("Select a String (* = any string, ? = any char):");
            dialog.setElements(diff(ocelotlView.getConfDataLoader().getProducers(), producers).toArray());
            dialog.setMultipleSelection(true);
            if (dialog.open() == Window.CANCEL)
                return;
            for (final Object o : dialog.getResult()) {
                for (SimpleEventProducerNode epNode : params.getEventProducerHierarchy().getEventProducerNodes()
                        .values()) {
                    if ((epNode.getMe() == (EventProducer) o)) {
                        checkElement(epNode);
                        break;
                    }
                }
            }
            updateSelectedEventProducer();
        }
    }

    public class AddProducerNodeAdapter extends SelectionAdapter {

        @Override
        public void widgetSelected(SelectionEvent e) {
            TreeSelection selection = (TreeSelection) treeViewerEventProducer.getSelection();

            for (Object element : selection.toArray()) {
                checkElement(element);
            }

            updateSelectedEventProducer();
        }
    }

    public class CheckSubtreeEventProducersAdapter extends SelectionAdapter {

        @Override
        public void widgetSelected(SelectionEvent e) {
            TreeSelection selection = (TreeSelection) treeViewerEventProducer.getSelection();

            for (Object element : selection.toArray()) {
                checkElementAndSubtree(element);
            }

            updateSelectedEventProducer();
        }
    }

    private class UncheckEventProducerAdapter extends SelectionAdapter {
        @Override
        public void widgetSelected(SelectionEvent e) {
            TreeSelection selection = (TreeSelection) treeViewerEventProducer.getSelection();

            for (Object element : selection.toArray()) {
                uncheckElement(element);
            }

            updateSelectedEventProducer();
        }
    }

    public class UnCheckAllEventProducersAdapter extends SelectionAdapter {

        @Override
        public void widgetSelected(SelectionEvent e) {
            treeViewerEventProducer.setCheckedElements(new Object[0]);
            updateSelectedEventProducer();
        }
    }

    public class UncheckSubtreeEventProducersAdapter extends SelectionAdapter {

        @Override
        public void widgetSelected(SelectionEvent e) {
            TreeSelection selection = (TreeSelection) treeViewerEventProducer.getSelection();

            for (Object element : selection.toArray()) {
                uncheckElementAndSubtree(element);
            }

            updateSelectedEventProducer();
        }
    }

    private class AddResultsEventProducersAdapter extends SelectionAdapter {

        @Override
        public void widgetSelected(final SelectionEvent e) {

            final ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(),
                    new AnalysisResultLabelProvider());
            dialog.setTitle("Select a Result");
            dialog.setMessage("Select a String (* = any string, ? = any char):");
            dialog.setElements(ocelotlView.getConfDataLoader().getResults().toArray());
            dialog.setMultipleSelection(false);
            if (dialog.open() == Window.CANCEL)
                return;
            for (final Object o : dialog.getResult())
                try {
                    for (final EventProducer ep : ocelotlView.getConfDataLoader()
                            .getProducersFromResult((AnalysisResult) o))
                        if (!producers.contains(ep))
                            producers.add(ep);
                } catch (final SoCTraceException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            treeViewerEventProducer.setInput(producers);
        }
    }

    private class ResetSelectionAdapter extends SelectionAdapter {

        private final ListViewer viewer;

        public ResetSelectionAdapter(final ListViewer viewer) {
            this.viewer = viewer;
        }

        @Override
        public void widgetSelected(final SelectionEvent e) {
            final Collection<?> c = (Collection<?>) viewer.getInput();
            c.clear();
            viewer.refresh(false);
        }
    }

    private class AnalysisResultLabelProvider extends LabelProvider {

        @Override
        public String getText(final Object element) {
            return ((AnalysisResult) element).getDescription();
        }
    }

    private class EventTypeLabelProvider extends LabelProvider {

        @Override
        public String getText(final Object element) {
            return ((EventType) element).getName();
        }
    }

    private class EventProducerLabelProvider extends LabelProvider {

        @Override
        public String getText(final Object element) {
            return ((EventProducer) element).getName();
        }
    }

    private class SimpleEventProducerLabelProvider extends LabelProvider {

        @Override
        public String getText(final Object element) {
            return ((SimpleEventProducerNode) element).getName();
        }
    }

    private class RemoveSelectionAdapter extends SelectionAdapter {

        private final ListViewer viewer;

        public RemoveSelectionAdapter(final ListViewer viewer) {
            this.viewer = viewer;
        }

        @Override
        public void widgetSelected(final SelectionEvent e) {
            final IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
            final Object obj = selection.getFirstElement();
            final Collection<?> c = (Collection<?>) viewer.getInput();
            c.remove(obj);
            viewer.refresh(false);
        }
    }

    private class TypesSelectionAdapter extends SelectionAdapter {

        // all - input
        java.util.List<EventType> diff(final java.util.List<EventType> all, final java.util.List<EventType> input) {
            final java.util.List<EventType> tmp = new ArrayList<>();
            for (final EventType oba : all)
                tmp.add(oba);
            tmp.removeAll(input);
            Collections.sort(tmp, new Comparator<EventType>() {

                @Override
                public int compare(EventType arg0, EventType arg1) {
                    return arg0.getName().compareToIgnoreCase(arg1.getName());
                }

            });
            return tmp;
        }

        @Override
        public void widgetSelected(final SelectionEvent e) {
            if (ocelotlView.getConfDataLoader().getCurrentTrace() == null)
                return;
            final ListSelectionDialog dialog = new ListSelectionDialog(getShell(),
                    diff(getEventTypes(), config.getTypes()), new ArrayContentProvider(),
                    new EventTypeLabelProvider(), "Select Event Types");
            if (dialog.open() == Window.CANCEL)
                return;
            for (final Object o : dialog.getResult())
                config.getTypes().add((EventType) o);
            listViewerEventTypes.setInput(config.getTypes());
        }
    }

    protected OcelotlView ocelotlView;

    protected ListViewer listViewerIdleStates;

    protected ListViewer listViewerEventTypes;

    protected DistributionConfig config;

    protected OcelotlParameters params;

    private java.util.List<EventType> oldEventTypes;

    protected CheckboxTreeViewer treeViewerEventProducer;

    private java.util.List<EventProducer> producers = new LinkedList<EventProducer>();

    private java.util.List<EventProducer> oldProducer;

    public DistributionBaseView(final Shell parent) {
        super(parent);
        ocelotlView = null;
        config = null;
    }

    protected abstract java.util.List<EventType> getEventTypes();

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite all = (Composite) super.createDialogArea(parent);

        final SashForm sashFormGlobal = new SashForm(all, SWT.VERTICAL);
        sashFormGlobal.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        sashFormGlobal.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_BACKGROUND));

        TabFolder tabFolder = new TabFolder(sashFormGlobal, SWT.NONE);

        TabItem tbtmNewItem = new TabItem(tabFolder, SWT.NONE);
        tbtmNewItem.setText("Event Types");

        final Group groupEventTypes = new Group(tabFolder, SWT.NONE);
        tbtmNewItem.setControl(groupEventTypes);
        groupEventTypes.setFont(SWTResourceManager.getFont("Cantarell", 11, SWT.NORMAL));
        groupEventTypes.setText("Set Event Types");
        final GridLayout gl_groupEventTypes = new GridLayout(2, false);
        gl_groupEventTypes.horizontalSpacing = 0;
        groupEventTypes.setLayout(gl_groupEventTypes);

        listViewerEventTypes = new ListViewer(groupEventTypes, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        listViewerEventTypes.setContentProvider(new ArrayContentProvider());
        listViewerEventTypes.setLabelProvider(new EventTypeLabelProvider());
        listViewerEventTypes.setComparator(new ViewerComparator());
        final List listEventTypes = listViewerEventTypes.getList();
        listEventTypes.setFont(SWTResourceManager.getFont("Cantarell", 11, SWT.NORMAL));
        listEventTypes.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        final ScrolledComposite scrCompositeEventTypeButtons = new ScrolledComposite(groupEventTypes,
                SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        scrCompositeEventTypeButtons.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
        scrCompositeEventTypeButtons.setExpandHorizontal(true);
        scrCompositeEventTypeButtons.setExpandVertical(true);

        final Composite compositeEventTypeButtons = new Composite(scrCompositeEventTypeButtons, SWT.NONE);
        compositeEventTypeButtons.setLayout(new GridLayout(1, false));

        final Button btnAddEventTypes = new Button(compositeEventTypeButtons, SWT.NONE);
        btnAddEventTypes.setText("Add");
        btnAddEventTypes.setFont(SWTResourceManager.getFont("Cantarell", 11, SWT.NORMAL));
        btnAddEventTypes.setImage(null);
        btnAddEventTypes.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        btnAddEventTypes.addSelectionListener(new TypesSelectionAdapter());

        final Button btnRemoveEventTypes = new Button(compositeEventTypeButtons, SWT.NONE);
        btnRemoveEventTypes.setText("Remove");
        btnRemoveEventTypes.setFont(SWTResourceManager.getFont("Cantarell", 11, SWT.NORMAL));
        btnRemoveEventTypes.setImage(null);
        btnRemoveEventTypes.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        scrCompositeEventTypeButtons.setContent(compositeEventTypeButtons);
        scrCompositeEventTypeButtons.setMinSize(compositeEventTypeButtons.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        btnRemoveEventTypes.addSelectionListener(new RemoveSelectionAdapter(listViewerEventTypes));
        Button btnResetEventTypes = new Button(compositeEventTypeButtons, SWT.NONE);
        btnResetEventTypes.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        btnResetEventTypes.setText("Reset");
        btnResetEventTypes.addSelectionListener(new ResetSelectionAdapter(listViewerEventTypes));
        btnResetEventTypes.setFont(SWTResourceManager.getFont("Cantarell", 11, SWT.NORMAL));
        btnResetEventTypes.setImage(null);

        // Tab event producers selection
        TabItem tbtmNewItem_2 = new TabItem(tabFolder, SWT.NONE);
        tbtmNewItem_2.setText("Event Producers");

        final Group groupEventProducers = new Group(tabFolder, SWT.NONE);
        tbtmNewItem_2.setControl(groupEventProducers);
        groupEventProducers.setFont(SWTResourceManager.getFont("Cantarell", 11, SWT.NORMAL));
        groupEventProducers.setText("Event Producers");
        groupEventProducers.setLayout(new GridLayout());

        // Tree viewer
        treeViewerEventProducer = new CheckboxTreeViewer(groupEventProducers, SWT.BORDER | SWT.MULTI);
        treeViewerEventProducer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);

        GridData data = new GridData(GridData.FILL_BOTH);
        data.widthHint = convertWidthInCharsToPixels(60);
        data.heightHint = convertHeightInCharsToPixels(18);

        final Tree tree = treeViewerEventProducer.getTree();
        tree.setLinesVisible(true);
        tree.setLayoutData(data);
        tree.setFont(parent.getFont());

        treeViewerEventProducer.setContentProvider(new FilterTreeContentProvider());
        treeViewerEventProducer.setLabelProvider(new SimpleEventProducerLabelProvider());
        treeViewerEventProducer.expandAll();
        treeViewerEventProducer.setComparator(new ViewerComparator());
        treeViewerEventProducer.addCheckStateListener(new CheckStateListener());
        treeViewerEventProducer.setComparator(new ViewerComparator(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return AlphanumComparator.compare(o1, o2);
            }
        }));

        // Buttons
        Composite buttonComposite = new Composite(groupEventProducers, SWT.RIGHT);
        GridLayout layout = new GridLayout();
        layout.marginWidth = 0;
        layout.horizontalSpacing = convertHorizontalDLUsToPixels(5);
        buttonComposite.setLayout(layout);
        buttonComposite.setFont(groupEventProducers.getFont());
        GridData data2 = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL);
        data2.grabExcessHorizontalSpace = true;
        buttonComposite.setLayoutData(data2);

        final Button btnCheckEventProducer = new Button(buttonComposite, SWT.NONE);
        btnCheckEventProducer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        btnCheckEventProducer.setText("Check");
        btnCheckEventProducer.setFont(SWTResourceManager.getFont("Cantarell", 11, SWT.NORMAL));
        btnCheckEventProducer.setImage(null);
        btnCheckEventProducer.addSelectionListener(new AddProducerNodeAdapter());

        Button btnCheckAllEventProducer = new Button(buttonComposite, SWT.NONE);
        btnCheckAllEventProducer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
        btnCheckAllEventProducer.setText("Check All");
        btnCheckAllEventProducer.setImage(null);
        btnCheckAllEventProducer.setFont(SWTResourceManager.getFont("Cantarell", 11, SWT.NORMAL));
        btnCheckAllEventProducer.addSelectionListener(new CheckAllEventProducersAdapter());

        final Button btnAddResult = new Button(buttonComposite, SWT.NONE);
        btnAddResult.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        btnAddResult.setText("Add Result");
        btnAddResult.setImage(null);
        btnAddResult.setFont(SWTResourceManager.getFont("Cantarell", 11, SWT.NORMAL));
        btnAddResult.addSelectionListener(new AddResultsEventProducersAdapter());

        final Button btnUncheckEventProducer = new Button(buttonComposite, SWT.NONE);
        btnUncheckEventProducer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        btnUncheckEventProducer.setText("Uncheck");
        btnUncheckEventProducer.setFont(SWTResourceManager.getFont("Cantarell", 11, SWT.NORMAL));
        btnUncheckEventProducer.setImage(null);
        btnUncheckEventProducer.setImage(null);
        btnUncheckEventProducer.addSelectionListener(new UncheckEventProducerAdapter());

        Button btnUncheckAllEventProducer = new Button(buttonComposite, SWT.NONE);
        btnUncheckAllEventProducer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        btnUncheckAllEventProducer.setText("Uncheck All");
        btnUncheckAllEventProducer.setFont(SWTResourceManager.getFont("Cantarell", 11, SWT.NORMAL));
        btnUncheckAllEventProducer.setImage(null);
        btnUncheckAllEventProducer.addSelectionListener(new UnCheckAllEventProducersAdapter());

        Button btnCheckSubtreeEventProducer = new Button(buttonComposite, SWT.NONE);
        btnCheckSubtreeEventProducer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        btnCheckSubtreeEventProducer.setText("Check Subtree");
        btnCheckSubtreeEventProducer.setFont(SWTResourceManager.getFont("Cantarell", 11, SWT.NORMAL));
        btnCheckSubtreeEventProducer.setImage(null);
        btnCheckSubtreeEventProducer.addSelectionListener(new CheckSubtreeEventProducersAdapter());

        Button btnUncheckSubtreeEventProducer = new Button(buttonComposite, SWT.NONE);
        btnUncheckSubtreeEventProducer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        btnUncheckSubtreeEventProducer.setText("Uncheck Subtree");
        btnUncheckSubtreeEventProducer.setFont(SWTResourceManager.getFont("Cantarell", 11, SWT.NORMAL));
        btnUncheckSubtreeEventProducer.setImage(null);
        btnUncheckSubtreeEventProducer.addSelectionListener(new UncheckSubtreeEventProducersAdapter());

        Button btnAddEventProducer = new Button(buttonComposite, SWT.NONE);
        btnAddEventProducer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        btnAddEventProducer.setText("Add");
        btnAddEventProducer.setFont(SWTResourceManager.getFont("Cantarell", 11, SWT.NORMAL));
        btnAddEventProducer.setImage(null);
        btnAddEventProducer.addSelectionListener(new AddEventProducerAdapter());

        layout.numColumns = 4;
        buttonComposite.setLayout(layout);

        sashFormGlobal.setWeights(new int[] { 1 });

        initSettings();

        return sashFormGlobal;
    }

    /**
     * Initialize settings values
     */
    public void initSettings() {
        oldEventTypes = new ArrayList<EventType>(config.getTypes());
        oldProducer = new LinkedList<EventProducer>(params.getUnfilteredEventProducers());

        producers = new LinkedList<EventProducer>();
        for (EventProducer ep : params.getUnfilteredEventProducers())
            producers.add(ep);

        treeViewerEventProducer.setInput(params.getEventProducerHierarchy().getRoot());
        setParameters();
        listViewerEventTypes.setInput(config.getTypes());
        updateTreeStatus();
    }

    @Override
    public void init(final OcelotlView ocelotlView, final ITraceTypeConfig config) {
        this.ocelotlView = ocelotlView;
        this.config = (DistributionConfig) config;
        this.params = ocelotlView.getOcelotlParameters();
        setParameters();
    }

    @Override
    protected void okPressed() {
        params.setUnfilteredEventProducers(producers);

        // Check if event types have been modified
        if (checkEventTypesModified())
            ocelotlView.setHasChanged(HasChanged.ALL);

        super.okPressed();
    }

    /**
     * Check if there were modifications on the event types
     * 
     * @return true if there were modifications, false otherwise
     */
    private boolean checkEventTypesModified() {
        if (config.getTypes().size() != oldEventTypes.size())
            return true;

        for (EventType anET : config.getTypes())
            if (!oldEventTypes.contains(anET))
                return true;

        for (EventType anET : oldEventTypes)
            if (!config.getTypes().contains(anET))
                return true;

        return false;
    }

    @Override
    protected void cancelPressed() {
        config.setTypes(oldEventTypes);
        params.setUnfilteredEventProducers(oldProducer);
        super.cancelPressed();
    }

    public abstract void setParameters();

    @Override
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText("Microscopic Description Settings");
    }

    /**
     * Synchronize the event producer tree view with the model
     */
    protected void updateTreeStatus() {
        for (SimpleEventProducerNode epNode : params.getEventProducerHierarchy().getEventProducerNodes().values()) {
            // If the producer is currently included
            if (producers.contains(epNode.getMe())) {
                // Check it
                treeViewerEventProducer.setChecked(epNode, true);
            } else {
                treeViewerEventProducer.setChecked(epNode, false);
            }
        }
    }

    /**
     * Synchronize the model with the event producer tree view
     */
    protected void updateSelectedEventProducer() {
        // Reset previously selected producers
        producers.clear();

        // Add checked producers
        for (Object obj : treeViewerEventProducer.getCheckedElements()) {
            SimpleEventProducerNode anEPNode = (SimpleEventProducerNode) obj;
            producers.add(anEPNode.getMe());
        }
    }

    /**
     * Check an element
     * 
     * @param element
     *            The element to check.
     */
    protected void checkElement(Object element) {
        treeViewerEventProducer.setChecked(element, true);
    }

    /**
     * Uncheck an element
     * 
     * @param element
     *            The element to uncheck.
     */
    protected void uncheckElement(Object element) {
        treeViewerEventProducer.setChecked(element, false);
    }

    /**
     * Private classes
     */
    private class CheckStateListener implements ICheckStateListener {

        @Override
        public void checkStateChanged(CheckStateChangedEvent event) {
            try {
                SimpleEventProducerNode entry = (SimpleEventProducerNode) event.getElement();
                boolean checked = event.getChecked();
                if (checked) {
                    checkElement(entry);
                } else {
                    uncheckElement(entry);
                }

                updateSelectedEventProducer();
            } catch (ClassCastException e) {
                return;
            }
        }
    }

    /**
     * Check an element, all its parents and all its children.
     * 
     * @param element
     *            The element to check.
     */
    private void checkElementAndSubtree(Object element) {
        checkElement(element);

        for (Object child : new FilterTreeContentProvider().getChildren(element)) {
            checkElementAndSubtree(child);
        }
    }

    /**
     * Check an element, all its parents and all its children.
     * 
     * @param element
     *            The element to check.
     */
    private void uncheckElementAndSubtree(Object element) {
        uncheckElement(element);

        for (Object child : new FilterTreeContentProvider().getChildren(element)) {
            uncheckElementAndSubtree(child);
        }
    }
}