org.eclipse.ocl.examples.emf.validation.debug.ui.view.ValidityView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ocl.examples.emf.validation.debug.ui.view.ValidityView.java

Source

/**
 * <copyright>
 *
 * Copyright (c) 2013 CEA LIST and others.
 * 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:
 *   E.D.Willink (CEA LIST) - initial API and implementation
 *  Obeo - Use Forms and Manage Actions.
 *
 * </copyright>
 */
package org.eclipse.ocl.examples.emf.validation.debug.ui.view;

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.emf.edit.ui.provider.DecoratingColumLabelProvider;
import org.eclipse.ocl.examples.emf.validation.debug.ui.actions.DisableAllNodesAction;
import org.eclipse.ocl.examples.emf.validation.debug.ui.actions.DisableAllUnusedNodesAction;
import org.eclipse.ocl.examples.emf.validation.debug.ui.actions.EnableAllNodesAction;
import org.eclipse.ocl.examples.emf.validation.debug.ui.actions.ExportValidationResultAction;
import org.eclipse.ocl.examples.emf.validation.debug.ui.actions.FilterValidationResultAction;
import org.eclipse.ocl.examples.emf.validation.debug.ui.actions.LockValidatableNodesAction;
import org.eclipse.ocl.examples.emf.validation.debug.ui.actions.RunValidityAction;
import org.eclipse.ocl.examples.emf.validation.debug.ui.actions.ShowElementInEditorAction;
import org.eclipse.ocl.examples.emf.validation.debug.ui.filters.NodesViewerFilter;
import org.eclipse.ocl.examples.emf.validation.debug.ui.messages.ValidationDebugMessages;
import org.eclipse.ocl.examples.emf.validation.debug.ui.providers.NodeCheckStateProvider;
import org.eclipse.ocl.examples.emf.validation.debug.ui.providers.NodeLabelProvider;
import org.eclipse.ocl.examples.emf.validation.debug.ui.providers.ConstrainingNodeContentProvider;
import org.eclipse.ocl.examples.emf.validation.debug.ui.providers.ValidatableNodeContentProvider;
import org.eclipse.ocl.examples.emf.validation.debug.ui.ripoffs.FilteredCheckboxTree;
import org.eclipse.ocl.examples.emf.validation.debug.validity.ConstrainingNode;
import org.eclipse.ocl.examples.emf.validation.debug.validity.ResultConstrainingNode;
import org.eclipse.ocl.examples.emf.validation.debug.validity.ResultValidatableNode;
import org.eclipse.ocl.examples.emf.validation.debug.validity.RootNode;
import org.eclipse.ocl.examples.emf.validation.debug.validity.Severity;
import org.eclipse.ocl.examples.emf.validation.debug.validity.ValidatableNode;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionManager;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ICheckStateProvider;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.part.ViewPart;

/**
 * The ValidityView provides a dual view of ValidatableNode model elements and
 * ConstrainingNode model classes to browse, filter and control model validation. 
 */
public class ValidityView extends ViewPart implements ISelectionListener {
    /**
     * The ID of the view as specified by the extension.
     */
    public static final @NonNull String ID = "org.eclipse.ocl.examples.emf.validation.debug.ui.validity";//$NON-NLS-1$

    protected FilteredCheckboxTree filteredValidatableNodesTree;
    protected FilteredCheckboxTree filteredConstrainingNodesTree;

    private final @NonNull ValidityViewRefreshJob refreshJob = new ValidityViewRefreshJob();

    protected final @NonNull IDEValidityManager validityManager;

    /** Keeps a reference to the toolkit used to create our form. */
    private FormToolkit formToolkit;

    /** Form that will contain the Validity View itself. */
    private Form validityViewForm;

    /** Allows us to display error/warning messages directly on the form. */
    private FormMessageManager messageManager;

    /** Form that will contain the Validatable column View. */
    private SashForm validateableElementsForm;

    /** Form that will contain the Constraining column View. */
    private SashForm constrainingElementsForm;

    /** We'll create this {@link SashForm} as the main body of the Validity view form. */
    private SashForm formBody;

    /**
     * Keeps a reference to the "validateable Elements" section of the Validity view form.
     */
    private Section validatableNodesSection;

    /** The message key. */
    private final String messageKey = "ValidityViewMessageKey";

    /** Kept as an instance member, this will allow us to set unique identifiers to the status messages. */
    private int messageCount;

    /**
     * Keeps a reference to the "constraining Nodes" section of the Validity view form.
     */
    private Section constrainingNodesSection;

    protected ResourceSet modelResourceSet;

    /**Context Menu.*/
    private ShowElementInEditorAction showValidatableElementInEditorAction;
    private ShowElementInEditorAction showConstrainingElementInEditorAction;

    /**Local Tool Bar.*/
    private Action runValidationAction;
    private Action lockValidatableNodesAction;
    private Action exportValidationResultAction;
    private IAction filterValidationResultAction;

    /**Validatable Tool Bar.*/
    private Action enableAllValidatableNodesAction;
    private Action disableAllValidatableNodesAction;
    private Action disableAllUnusedValidatableNodesAction;

    /**Constraining Tool Bar.*/
    private Action enableAllConstrainingNodesAction;
    private Action disableAllConstrainingNodesAction;
    private Action disableAllUnusedConstrainingNodesAction;

    /** Double Click action handlers.*/
    private Action constrainingNodesDoubleClickAction;
    private Action validatableNodesDoubleClickAction;

    private final NodesViewerFilter constrainingNodesFilterByKind = new NodesViewerFilter();
    private final NodesViewerFilter validatableNodesFilterByKind = new NodesViewerFilter();

    class DecoratingNodeLabelProvider extends DecoratingColumLabelProvider {
        public DecoratingNodeLabelProvider(@NonNull ILabelProvider nodeLabelProvider,
                @NonNull SeveritiesDecorator severitiesDecorator) {
            super(nodeLabelProvider, new SeveritiesDecorator(validityManager));
            cellLabelProvider = (CellLabelProvider) nodeLabelProvider;
        }
    }

    public ValidityView() {
        validityManager = new IDEValidityManager(refreshJob);
        modelResourceSet = new ResourceSetImpl();
    }

    private void contributeToActionBars() {
        IToolBarManager toolBarManager = getForm().getToolBarManager();
        fillLocalToolBar(toolBarManager);

        // validatable Column
        ToolBarManager validatableSectionToolBarManager = createSectionToolBar(validatableNodesSection);
        fillValidatableColumnToolBar(validatableSectionToolBarManager);

        // constraining Column
        ToolBarManager constrainingSectionToolBarManager = createSectionToolBar(constrainingNodesSection);
        fillConstrainingColumnToolBar(constrainingSectionToolBarManager);
    }

    /**
     * Creates a tool bar for the given section.
     * 
     * @param section
     *            The section for which we need a tool bar.
     * @return The created tool bar.
     */
    protected static final ToolBarManager createSectionToolBar(Section section) {
        final ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT | SWT.HORIZONTAL);
        final ToolBar toolBar = toolBarManager.createControl(section);

        final Cursor handCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_HAND);
        toolBar.setCursor(handCursor);
        // Cursor needs to be explicitly disposed
        toolBar.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                if (!handCursor.isDisposed()) {
                    handCursor.dispose();
                }
            }
        });

        section.setTextClient(toolBar);
        toolBar.setData(toolBarManager);
        // Do not keep a reference to the manager when we dispose the tool bar
        toolBar.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                toolBar.setData(null);
            }
        });

        return toolBarManager;
    }

    /**
     * This is a callback that will allow us
     * to create the viewer and initialize it.
     */
    @Override
    public void createPartControl(Composite parent) {
        Composite sash = new SashForm(parent, SWT.HORIZONTAL);
        {
            GridLayout layout = new GridLayout();
            layout.marginHeight = 0;
            layout.marginWidth = 0;
            layout.verticalSpacing = 0;
            layout.horizontalSpacing = 0;
            sash.setLayout(layout);
            GridData gridData = new GridData(GridData.FILL_BOTH);
            gridData.horizontalIndent = 1;
            sash.setLayoutData(gridData);
        }

        formToolkit = new FormToolkit(sash.getDisplay());

        createValidityViewForm(formToolkit, sash);
    }

    /**
     * This will be called in order to create the actual body of the validity view, the "Validity" form.
     * 
     * @param toolkit
     *            Toolkit that can be used to create the form.
     * @param parent
     *            Parent composite of the form.
     */
    protected void createValidityViewForm(FormToolkit toolkit, Composite parent) {
        Color blackColor = parent.getDisplay().getSystemColor(SWT.COLOR_BLACK);
        Color blueColor = parent.getDisplay().getSystemColor(SWT.COLOR_BLUE);
        ILabelProvider labelProvider = new AdapterFactoryLabelProvider(validityManager.getAdapterFactory());
        ILabelProvider nodeLabelProvider = new NodeLabelProvider(labelProvider, blackColor, blueColor);
        IContentProvider validatableContentProvider = new ValidatableNodeContentProvider(validityManager,
                nodeLabelProvider);
        IContentProvider constrainingNodeContentProvider = new ConstrainingNodeContentProvider(validityManager,
                nodeLabelProvider);
        ICheckStateProvider nodeCheckStateProvider = new NodeCheckStateProvider();
        ILabelProvider nodeDecoratingLabelProvider = new DecoratingNodeLabelProvider(nodeLabelProvider,
                new SeveritiesDecorator(validityManager));

        validityViewForm = toolkit.createForm(parent);
        messageManager = new FormMessageManager(getForm());
        messageManager.setDecorationPosition(SWT.LEFT | SWT.TOP);
        toolkit.decorateFormHeading(getForm());

        getForm().setText(ValidationDebugMessages.ValidityView_viewTitle);
        messageManager.addMessage(messageKey + messageCount++,
                ValidationDebugMessages.ValidityView_Messages_NoSelection, IStatus.WARNING, getForm());

        Composite mainBody = getForm().getBody();
        mainBody.setLayout(new GridLayout());
        formBody = new SashForm(mainBody, SWT.HORIZONTAL | SWT.SMOOTH);
        toolkit.adapt(formBody);
        formBody.setLayoutData(new GridData(GridData.FILL_BOTH));

        validateableElementsForm = new SashForm(formBody, SWT.VERTICAL | SWT.SMOOTH);
        toolkit.adapt(validateableElementsForm);

        validatableNodesSection = toolkit.createSection(validateableElementsForm, ExpandableComposite.TITLE_BAR);
        validatableNodesSection.setText(ValidationDebugMessages.ValidityView_validatableNodesSectionName);

        CheckboxTreeViewer validatableNodesViewer;
        {
            Composite validatableNodesSectionBody = toolkit.createComposite(validatableNodesSection);
            {
                GridLayout layout = new GridLayout(1, true);
                layout.marginBottom = 0;
                layout.marginLeft = 0;
                layout.marginRight = 0;
                layout.marginTop = 0;
                validatableNodesSectionBody.setLayout(layout);
                GridData gridData = new GridData(GridData.FILL_BOTH);
                gridData.grabExcessHorizontalSpace = true;
                gridData.grabExcessVerticalSpace = true;
                validatableNodesSectionBody.setLayoutData(gridData);
            }

            PatternFilter filter = new PatternFilter();
            filteredValidatableNodesTree = new FilteredCheckboxTree(validatableNodesSectionBody,
                    SWT.CHECK | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, filter);
            filteredValidatableNodesTree.disableTextWidget();

            GridData gridData = new GridData(GridData.FILL_BOTH);
            gridData.grabExcessHorizontalSpace = true;
            gridData.grabExcessVerticalSpace = true;
            filteredValidatableNodesTree.setLayoutData(gridData);

            validatableNodesViewer = getValidatableNodesViewer();
            validatableNodesViewer.getControl().setLayoutData(gridData);

            toolkit.paintBordersFor(validatableNodesSectionBody);
            validatableNodesSection.setClient(validatableNodesSectionBody);
        }

        constrainingElementsForm = new SashForm(formBody, SWT.VERTICAL | SWT.SMOOTH);
        toolkit.adapt(constrainingElementsForm);

        constrainingNodesSection = toolkit.createSection(constrainingElementsForm, ExpandableComposite.TITLE_BAR);
        constrainingNodesSection.setText(ValidationDebugMessages.ValidityView_constrainingNodesSectionName);

        CheckboxTreeViewer constrainingNodesViewer;
        {
            Composite constrainingNodesSectionBody = toolkit.createComposite(constrainingNodesSection);
            {
                GridLayout layout = new GridLayout(1, true);
                layout.marginBottom = 0;
                layout.marginLeft = 0;
                layout.marginRight = 0;
                layout.marginTop = 0;
                constrainingNodesSectionBody.setLayout(layout);
                GridData gridData = new GridData(GridData.FILL_BOTH);
                gridData.grabExcessHorizontalSpace = true;
                gridData.grabExcessVerticalSpace = true;
                constrainingNodesSectionBody.setLayoutData(gridData);
            }

            PatternFilter filter = new PatternFilter();
            filteredConstrainingNodesTree = new FilteredCheckboxTree(constrainingNodesSectionBody,
                    SWT.CHECK | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, filter);
            filteredConstrainingNodesTree.disableTextWidget();

            GridData gridData = new GridData(GridData.FILL_BOTH);
            gridData.grabExcessHorizontalSpace = true;
            gridData.grabExcessVerticalSpace = true;
            filteredConstrainingNodesTree.setLayoutData(gridData);

            constrainingNodesViewer = getConstrainingNodesViewer();
            constrainingNodesViewer.getControl().setLayoutData(gridData);

            toolkit.paintBordersFor(constrainingNodesSectionBody);
            constrainingNodesSection.setClient(constrainingNodesSectionBody);
        }

        ICheckStateListener nodeCheckStateListener = new ValidityNodeCheckStateListener(getValidatableNodesViewer(),
                getConstrainingNodesViewer());
        validatableNodesViewer.setContentProvider(validatableContentProvider);
        validatableNodesViewer.setLabelProvider(nodeDecoratingLabelProvider);
        validatableNodesViewer.setCheckStateProvider(nodeCheckStateProvider);
        validatableNodesViewer.addCheckStateListener(nodeCheckStateListener);
        validatableNodesViewer.addFilter(validatableNodesFilterByKind);

        constrainingNodesViewer.setContentProvider(constrainingNodeContentProvider);
        constrainingNodesViewer.setLabelProvider(nodeDecoratingLabelProvider);
        constrainingNodesViewer.setCheckStateProvider(nodeCheckStateProvider);
        constrainingNodesViewer.addCheckStateListener(nodeCheckStateListener);
        constrainingNodesViewer.addFilter(constrainingNodesFilterByKind);

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

        // Create the help context id for the viewer's control
        makeActions();
        hookContextMenu();
        hookConstrainingNodesDoubleClickAction();
        hookValidatableNodesDoubleClickAction();
        contributeToActionBars();
        ISelectionService service = (ISelectionService) getSite().getService(ISelectionService.class);
        if (service != null) {
            service.addSelectionListener(this);
            ISelection selection = service.getSelection();
            Notifier input = SelectionUtil.getNotifierSelection(selection, this);
            validityManager.setInput(input);
        }
        refreshJob.initViewers(validatableNodesViewer, constrainingNodesViewer);
        Dialog.applyDialogFont(parent);

        ColumnViewerToolTipSupport.enableFor(validatableNodesViewer);
        ColumnViewerToolTipSupport.enableFor(constrainingNodesViewer);
    }

    /**
     * Returns the validity view form.
     * 
     * @return The validity view form.
     */
    protected Form getForm() {
        return validityViewForm;
    }

    @Override
    public void dispose() {
        ISelectionService service = (ISelectionService) getSite().getService(ISelectionService.class);
        if (service != null) {
            service.removeSelectionListener(this);
        }
        filteredValidatableNodesTree.dispose();
        filteredConstrainingNodesTree.dispose();
        super.dispose();
    }

    private void fillValidatableContextMenu(@NonNull IContributionManager manager) {
        // use the same actions as the column tool bar
        manager.add(enableAllValidatableNodesAction);
        manager.add(disableAllValidatableNodesAction);
        manager.add(new Separator());
        manager.add(disableAllUnusedValidatableNodesAction);

        // Other plug-ins can contribute their actions here
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
        manager.add(new Separator());
        manager.add(runValidationAction);
        manager.add(new Separator());
        manager.add(showValidatableElementInEditorAction);
    }

    private void fillConstrainingContextMenu(@NonNull IContributionManager manager) {
        // Use the same actions as the column tool bar
        manager.add(enableAllConstrainingNodesAction);
        manager.add(disableAllConstrainingNodesAction);
        manager.add(new Separator());
        manager.add(disableAllUnusedConstrainingNodesAction);

        // Other plug-ins can contribute there actions here
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
        manager.add(new Separator());
        manager.add(runValidationAction);
        manager.add(new Separator());
        manager.add(showConstrainingElementInEditorAction);
    }

    private void fillLocalToolBar(IToolBarManager manager) {
        manager.add(lockValidatableNodesAction);
        manager.add(runValidationAction);
        manager.add(new Separator());
        manager.add(filterValidationResultAction);
        manager.add(new Separator());
        manager.add(exportValidationResultAction);

        manager.update(true);
    }

    private void fillConstrainingColumnToolBar(IContributionManager manager) {
        manager.add(enableAllConstrainingNodesAction);
        manager.add(disableAllConstrainingNodesAction);
        manager.add(new Separator());
        manager.add(disableAllUnusedConstrainingNodesAction);

        manager.update(true);
    }

    private void fillValidatableColumnToolBar(IContributionManager manager) {
        manager.add(enableAllValidatableNodesAction);
        manager.add(disableAllValidatableNodesAction);
        manager.add(new Separator());
        manager.add(disableAllUnusedValidatableNodesAction);

        manager.update(true);
    }

    private void hookContextMenu() {
        // Validatable context menu
        MenuManager menuMgrValidatable = new MenuManager("#PopupMenu");//$NON-NLS-1$
        menuMgrValidatable.setRemoveAllWhenShown(true);
        menuMgrValidatable.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                @SuppressWarnings("null")
                @NonNull
                IMenuManager manager2 = manager;
                ValidityView.this.fillValidatableContextMenu(manager2);
            }
        });
        Menu menuValidatable = menuMgrValidatable.createContextMenu(getValidatableNodesViewer().getControl());
        getValidatableNodesViewer().getControl().setMenu(menuValidatable);
        getSite().registerContextMenu(menuMgrValidatable, getValidatableNodesViewer());

        // Constraining context menu
        MenuManager menuMgrConstraining = new MenuManager("#PopupMenu");//$NON-NLS-1$
        menuMgrConstraining.setRemoveAllWhenShown(true);
        menuMgrConstraining.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                @SuppressWarnings("null")
                @NonNull
                IMenuManager manager2 = manager;
                ValidityView.this.fillConstrainingContextMenu(manager2);
            }
        });
        Menu menuConstraining = menuMgrConstraining.createContextMenu(getConstrainingNodesViewer().getControl());
        getConstrainingNodesViewer().getControl().setMenu(menuConstraining);
        getSite().registerContextMenu(menuMgrConstraining, getConstrainingNodesViewer());
    }

    private void hookConstrainingNodesDoubleClickAction() {
        getConstrainingNodesViewer().addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                constrainingNodesDoubleClickAction.run();
            }
        });
    }

    private void hookValidatableNodesDoubleClickAction() {
        getValidatableNodesViewer().addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                validatableNodesDoubleClickAction.run();
            }
        });
    }

    private void makeActions() {
        lockValidatableNodesAction = new LockValidatableNodesAction();
        showValidatableElementInEditorAction = new ShowElementInEditorAction(validityManager,
                getValidatableNodesViewer());
        showConstrainingElementInEditorAction = new ShowElementInEditorAction(validityManager,
                getConstrainingNodesViewer());

        /*Toolbar actions*/
        runValidationAction = new RunValidityAction(validityManager);

        exportValidationResultAction = new ExportValidationResultAction(validityManager, this);
        filterValidationResultAction = new FilterValidationResultAction(this);

        /* Validatable Tool bar actions*/
        enableAllValidatableNodesAction = new EnableAllNodesAction(validityManager, getValidatableNodesViewer(),
                true);
        disableAllValidatableNodesAction = new DisableAllNodesAction(validityManager, getValidatableNodesViewer(),
                true);
        disableAllUnusedValidatableNodesAction = new DisableAllUnusedNodesAction(validityManager,
                getValidatableNodesViewer(), true);

        /* Constraining Tool bar actions*/
        enableAllConstrainingNodesAction = new EnableAllNodesAction(validityManager, getConstrainingNodesViewer(),
                false);
        disableAllConstrainingNodesAction = new DisableAllNodesAction(validityManager, getConstrainingNodesViewer(),
                false);
        disableAllUnusedConstrainingNodesAction = new DisableAllUnusedNodesAction(validityManager,
                getConstrainingNodesViewer(), false);

        /*Double Click actions*/
        constrainingNodesDoubleClickAction = new Action() {
            @Override
            public void run() {
                ISelection selection = getConstrainingNodesViewer().getSelection();
                Object obj = ((IStructuredSelection) selection).getFirstElement();
                if (obj instanceof ResultConstrainingNode) {
                    ResultValidatableNode resultValidatableNode = ((ResultConstrainingNode) obj)
                            .getResultValidatableNode();
                    getValidatableNodesViewer().setSelection(new StructuredSelection(resultValidatableNode), true);
                } else if (obj instanceof ConstrainingNode) {
                    Set<Object> expanded = new LinkedHashSet<Object>(
                            Arrays.asList(getConstrainingNodesViewer().getExpandedElements()));
                    if (expanded.contains(obj)) {
                        getConstrainingNodesViewer().setExpandedState(obj, false);
                    } else {
                        getConstrainingNodesViewer().setExpandedState(obj, true);
                    }
                }
            }
        };
        validatableNodesDoubleClickAction = new Action() {
            @Override
            public void run() {
                ISelection selection = getValidatableNodesViewer().getSelection();
                Object obj = ((IStructuredSelection) selection).getFirstElement();
                if (obj instanceof ResultValidatableNode) {
                    ResultConstrainingNode resultConstrainingNode = ((ResultValidatableNode) obj)
                            .getResultConstrainingNode();
                    getConstrainingNodesViewer().setSelection(new StructuredSelection(resultConstrainingNode),
                            true);
                } else if (obj instanceof ValidatableNode) {
                    Set<Object> expanded = new LinkedHashSet<Object>(
                            Arrays.asList(getValidatableNodesViewer().getExpandedElements()));
                    if (expanded.contains(obj)) {
                        getValidatableNodesViewer().setExpandedState(obj, false);
                    } else {
                        getValidatableNodesViewer().setExpandedState(obj, true);
                    }
                }
            }
        };
    }

    public void addFilteredSeverity(Severity severity) {
        constrainingNodesFilterByKind.addFilteredSeverity(severity);
        validatableNodesFilterByKind.addFilteredSeverity(severity);

        getConstrainingNodesViewer().refresh();
        getValidatableNodesViewer().refresh();
    }

    public void removeFilteredSeverity(Severity severity) {
        constrainingNodesFilterByKind.removeFilteredSeverity(severity);
        validatableNodesFilterByKind.removeFilteredSeverity(severity);

        getConstrainingNodesViewer().refresh();
        getValidatableNodesViewer().refresh();
    }

    /**
     * gets the Validity Manager
     * 
     * @return the validityManager
     */
    public @NonNull IDEValidityManager getValidityManager() {
        return validityManager;
    }

    /**
     * gets the validatable Nodes Viewer
     * 
     * @return the validatableNodesViewer
     */
    public @NonNull CheckboxTreeViewer getValidatableNodesViewer() {
        CheckboxTreeViewer viewer = (CheckboxTreeViewer) filteredValidatableNodesTree.getViewer();
        // a filtered tree never has a null viewer
        assert viewer != null;
        return viewer;
    }

    /**
     * gets the Constraining Nodes Viewer
     * 
     * @return the constrainingNodesViewer
     */
    public @NonNull CheckboxTreeViewer getConstrainingNodesViewer() {
        CheckboxTreeViewer viewer = (CheckboxTreeViewer) filteredConstrainingNodesTree.getViewer();
        // a filtered tree never has a null viewer
        assert viewer != null;
        return viewer;
    }

    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
        if (lockValidatableNodesAction.isChecked()) {
            return;
        }
        if (part instanceof EditorPart) {
            Notifier input = SelectionUtil.getNotifierSelection(selection, part);
            validityManager.setInput(input);
            RootNode rootNode = validityManager.getRootNode();
            Object validatableNodesViewerInput = getValidatableNodesViewer().getInput();
            if (validatableNodesViewerInput == null || !validatableNodesViewerInput.equals(rootNode)) {
                getValidatableNodesViewer().setInput(rootNode);
                getConstrainingNodesViewer().setInput(rootNode);

                filteredValidatableNodesTree.resetFilter();
                filteredConstrainingNodesTree.resetFilter();

                validationRootChanged(rootNode);
            }
        }
    }

    private void validationRootChanged(RootNode rootNode) {
        messageManager.removeMessages(getForm());

        String currentMessagekey = null;
        String currentMessageText = null;
        int currentStatus = 0;
        if (rootNode != null) {
            if (rootNode.getValidatableNodes().isEmpty()) {
                filteredValidatableNodesTree.disableTextWidget();

                currentMessagekey = messageKey + messageCount++;
                currentMessageText = ValidationDebugMessages.ValidityView_Messages_NoModelElement;
                currentStatus = IStatus.INFO;
            } else {
                filteredValidatableNodesTree.enableTextWidget();
            }
            if (rootNode.getConstrainingNodes().isEmpty()) {
                filteredConstrainingNodesTree.disableTextWidget();

                currentMessagekey = messageKey + messageCount++;
                currentMessageText = ValidationDebugMessages.ValidityView_Messages_NoConstraints;
                currentStatus = IStatus.WARNING;
            } else {
                filteredConstrainingNodesTree.enableTextWidget();
            }
        } else {
            filteredValidatableNodesTree.disableTextWidget();
            filteredConstrainingNodesTree.disableTextWidget();

            currentMessagekey = messageKey + messageCount++;
            currentMessageText = ValidationDebugMessages.ValidityView_Messages_NoSelection;
            currentStatus = IStatus.WARNING;
        }

        if (currentMessagekey != null) {
            messageManager.addMessage(currentMessagekey, currentMessageText, currentStatus, getForm());
        }
    }

    /**
     * Passing the focus request to the viewer's control. This will Refresh the
     * viewers contents.
     */
    @Override
    public void setFocus() {
        getValidatableNodesViewer().getControl().setFocus();

        // Refresh the view
        filteredValidatableNodesTree.resetFilter();
        filteredConstrainingNodesTree.resetFilter();
    }
}