org.eclipse.n4js.ui.navigator.internal.N4JSNavigatorActionProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.n4js.ui.navigator.internal.N4JSNavigatorActionProvider.java

Source

/**
 * Copyright (c) 2016 NumberFour AG.
 * 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:
 *   NumberFour AG - Initial API and implementation
 */
package org.eclipse.n4js.ui.navigator.internal;

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

import org.eclipse.jdt.ui.IContextMenuConstants;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.n4js.ui.workingsets.WorkingSet;
import org.eclipse.n4js.ui.workingsets.internal.AssignWorkingSetsAction;
import org.eclipse.n4js.ui.workingsets.internal.N4JSProjectActionGroup;
import org.eclipse.n4js.ui.workingsets.internal.N4JSWorkingSetActionProvider;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.ICommonActionExtensionSite;
import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;

import com.google.inject.Inject;

/**
 * Common Navigator Framework (CNF) action provider for N4JS elements in the navigator. (resources, working sets,
 * projects)
 */
public class N4JSNavigatorActionProvider extends CommonActionProvider {

    private N4JSProjectActionGroup projectGroup;
    private N4JSWorkingSetActionProvider workingSetActionProvider;

    @Inject
    private AssignWorkingSetsAction assignWorkingSetsAction;

    private boolean selectionContainsWorkingSet = false;

    @Override
    public void init(final ICommonActionExtensionSite site) {
        ICommonViewerWorkbenchSite workbenchSite = null;
        if (site.getViewSite() instanceof ICommonViewerWorkbenchSite)
            workbenchSite = (ICommonViewerWorkbenchSite) site.getViewSite();

        if (workbenchSite != null) {
            if (workbenchSite.getPart() != null && workbenchSite.getPart() instanceof IViewPart) {
                final IViewPart viewPart = (IViewPart) workbenchSite.getPart();

                projectGroup = new N4JSProjectActionGroup(viewPart);

                workingSetActionProvider = new N4JSWorkingSetActionProvider();
                workingSetActionProvider.init(site);

                assignWorkingSetsAction.init(site);
            }
        }

    }

    @Override
    public void fillContextMenu(final IMenuManager menu) {
        // {@link N4JSProjectActionGroup} does enablement-logic
        // on its own, thus always invoke it here
        projectGroup.fillContextMenu(menu);

        // Only delegate to {@link N4JSWorkingSetActionProvider},
        // if the current selection contains working sets.
        if (selectionContainsWorkingSet) {
            workingSetActionProvider.fillContextMenu(menu);
        }

        if (assignWorkingSetsAction.isEnabled()) {
            menu.appendToGroup(IContextMenuConstants.GROUP_BUILD, assignWorkingSetsAction);
        }
    }

    @Override
    public void fillActionBars(final IActionBars actionBars) {
        projectGroup.fillActionBars(actionBars);

        if (selectionContainsWorkingSet) {
            workingSetActionProvider.fillActionBars(actionBars);
        }
    }

    @Override
    public void setContext(final ActionContext context) {
        super.setContext(context);

        projectGroup.setContext(context);

        // context is null if disposal of the provider is triggered
        if (null != context) {
            StructuredSelection selection = (StructuredSelection) context.getSelection();
            List<Object> selectedElements = Arrays.asList(selection.toArray());

            selectionContainsWorkingSet = selectedElements.stream()
                    .anyMatch(element -> element instanceof WorkingSet);

            // try to minimize number of context updates for working set action provider
            if (selectionContainsWorkingSet) {
                workingSetActionProvider.setContext(context);
            }

            assignWorkingSetsAction.selectionChanged(selection);
        }
    }

    @Override
    public void dispose() {
        projectGroup.dispose();
        workingSetActionProvider.dispose();

        super.dispose();
    }
}