/*****************************************************************************
* Copyright (c) 2011 CEA LIST.
*
* 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:
* Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
*****************************************************************************/
package org.eclipse.papyrus.infra.table.menu.handler;
import java.util.List;
import org.eclipse.core.expressions.EvaluationResult;
import org.eclipse.core.expressions.Expression;
import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.facet.widgets.nattable.INatTableWidget;
import org.eclipse.emf.facet.widgets.nattable.INatTableWidgetProvider;
import org.eclipse.emf.facet.widgets.nattable.tableconfiguration.InstantiationMethod;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.papyrus.infra.table.menu.messages.Messages;
import org.eclipse.papyrus.uml.diagram.common.Activator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.menus.IContributionRoot;
import org.eclipse.ui.services.IServiceLocator;
/**
*
* This class create a menu to get the action to create new elements in the table in the popup menu.
* This code is adapted from the class org.eclipse.emf.facet.widgets.nattable.workbench.internal.handlers.CreateNewElementContributionItem
*/
public class CreateNewElementInTableMenuContributionItem extends AbstractTableExtensionContributionFactory {
/**
* A listener on the selection
*/
private ISelectionListener listener;
/**
*
* Constructor.
*
*/
public CreateNewElementInTableMenuContributionItem() {
this.listener = null;
}
/**
*
* {@inheritDoc}
*/
@Override
public void createContributionItems(final IServiceLocator serviceLocator, IContributionRoot additions) {
super.createContributionItems(serviceLocator, additions);
final MenuManager manager = new MenuManager(Messages.CreateMenuForNewElementInPopupContributionItem_CreateNewElementMenu) {
/**
*
* {@inheritDoc}
*/
@Override
public void fill(Menu parent, int index) {
super.fill(parent, index);
Image image = Activator.getImage("IMG_OBJ_ADD"); //$NON-NLS-1$
getMenu().getParentItem().setImage(image);
INatTableWidgetProvider provider = CreateNewElementInTableMenuContributionItem.this.getINatTableWidgetProvider();
if(provider != null) {
List<InstantiationMethod> methods = provider.getNatTableWidget().getInstantionMethodHistory();
getMenu().getParentItem().setEnabled(methods.size() != 0);
}
}
/**
*
* {@inheritDoc}
*/
@Override
public void dispose() {
if(CreateNewElementInTableMenuContributionItem.this.listener != null) {
ISelectionService selectionService = (ISelectionService)serviceLocator.getService(ISelectionService.class);
selectionService.removeSelectionListener(listener);
}
super.dispose();
}
/**
*
* {@inheritDoc}
*/
@Override
public boolean isDynamic() {
return true;
}
};
final IContributionItem item = new ContributionItem() {
/**
*
* {@inheritDoc}
*/
@Override
public void fill(final Menu menu, int index) {
INatTableWidgetProvider provider = getINatTableWidgetProvider();
if(provider != null) {
final INatTableWidget natTableWidget = provider.getNatTableWidget();
for(int i = 0; i < natTableWidget.getInstantionMethodHistory().size(); i++) {
final InstantiationMethod meth = natTableWidget.getInstantionMethodHistory().get(i);
MenuItem menuItem = new MenuItem(menu, SWT.CHECK);
menuItem.setText(i + " " + meth.getName()); //$NON-NLS-1$
menuItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
for(MenuItem menuItem2 : menu.getItems()) {
menuItem2.setSelection(false);
}
MenuItem localMenuItem = (MenuItem)e.widget;
localMenuItem.setSelection(true);
natTableWidget.createNewElement(meth);
}
});
}
boolean enabled = menu.getItemCount() != 0;
menu.setEnabled(enabled);
}
}
/**
*
* {@inheritDoc}
*/
@Override
public boolean isDynamic() {
return true;
}
};
manager.add(item);
Expression visibleWhen = new Expression() {
/**
*
* {@inheritDoc}
*/
@Override
public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
INatTableWidgetProvider provider = getINatTableWidgetProvider();
if(provider != null) {
return EvaluationResult.TRUE;
}
return EvaluationResult.FALSE;
}
};
additions.addContributionItem(manager, visibleWhen);
addSelectionListener(manager);
}
/**
* Add a listener to refresh the menu when the selection changes.
*
* @param manager
* the menu manager for the contribution of this class
*/
protected void addSelectionListener(final MenuManager manager) {
ISelectionService selectionService = (ISelectionService)this.serviceLocator.getService(ISelectionService.class);
this.listener = new ISelectionListener() {
/**
*
* {@inheritDoc}
*/
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
final INatTableWidgetProvider provider = getINatTableWidgetProvider();
if(provider != null) {
manager.setVisible(true);
INatTableWidget widget = provider.getNatTableWidget();
if(manager.getMenu() != null && !manager.getMenu().isDisposed()) {
manager.getMenu().getParentItem().setEnabled(widget.getInstantionMethodHistory().size() != 0);
}
} else {
manager.setVisible(false);
}
manager.updateAll(true);
}
};
selectionService.addSelectionListener(listener);
}
}