com.rcpcompany.uibindings.navigator.internal.handlers.OpenWithContributionFactory.java Source code

Java tutorial

Introduction

Here is the source code for com.rcpcompany.uibindings.navigator.internal.handlers.OpenWithContributionFactory.java

Source

/*******************************************************************************
 * Copyright (c) 2006-2013 The RCP Company 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:
 *     The RCP Company - initial API and implementation
 *******************************************************************************/
package com.rcpcompany.uibindings.navigator.internal.handlers;

import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.menus.ExtensionContributionFactory;
import org.eclipse.ui.menus.IContributionRoot;
import org.eclipse.ui.services.IServiceLocator;

import com.rcpcompany.uibindings.navigator.IEditorInformation;
import com.rcpcompany.uibindings.navigator.IEditorPartDescriptor;
import com.rcpcompany.uibindings.navigator.INavigatorManager;
import com.rcpcompany.utils.extensionpoints.CEResourceHolder;
import com.rcpcompany.utils.selection.SelectionUtils;

/**
 * Adds items to the "Open With" sub-menu based on the type of the current selection.
 * 
 * @author Tonny Madsen, The RCP Company
 */
public class OpenWithContributionFactory extends ExtensionContributionFactory {
    @Override
    public void createContributionItems(IServiceLocator serviceLocator, IContributionRoot additions) {
        final ISelectionService ss = (ISelectionService) serviceLocator.getService(ISelectionService.class);

        final List<EObject> list = SelectionUtils.computeSelection(ss.getSelection(), EObject.class);

        /*
         * Only know how to handle one item
         */
        if (list.size() != 1)
            return;
        final EObject obj = list.get(0);

        final IEditorInformation mt = INavigatorManager.Factory.getManager().getEditorInformation(obj.getClass());
        if (mt == null)
            return;
        final List<IEditorPartDescriptor> editors = mt.getEnabledEditors();

        /*
         * Less than two editors... no need for an open with menu... Ignore.
         */
        if (editors.size() < 2)
            return;

        /*
         * Create contributions items for all the editors based on the name and image
         */
        for (final IEditorPartDescriptor d : editors) {
            final IContributionItem item = new ContributionItem() {
                @Override
                public void fill(Menu menu, int index) {
                    final MenuItem mi = new MenuItem(menu, SWT.NONE);
                    mi.setText(d.getName());
                    final CEResourceHolder image = d.getImage();
                    if (image != null) {
                        mi.setImage(image.getImage());
                    }

                    mi.addSelectionListener(new SelectionAdapter() {
                        @Override
                        public void widgetSelected(SelectionEvent e) {
                            mt.setPreferredEditor(d);
                            INavigatorManager.Factory.getManager().openView(obj, false);
                        }
                    });
                }
            };
            additions.addContributionItem(item, null);
        }
    }
}