/*=============================================================================#
# Copyright (c) 2007-2016 Stephan Wahlbrink (WalWare.de) 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:
# Stephan Wahlbrink - initial API and implementation
#=============================================================================*/
package de.walware.docmlet.base.ui.processing.actions;
import java.util.List;
import java.util.Map;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExecutableExtension;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.menus.IWorkbenchContribution;
import org.eclipse.ui.services.IServiceLocator;
import de.walware.jcommons.collections.CollectionUtils;
import de.walware.jcommons.collections.IdentityCollection;
import de.walware.jcommons.collections.ImCollections;
import de.walware.jcommons.collections.ImIdentitySet;
import de.walware.jcommons.collections.ImList;
import de.walware.ecommons.ui.actions.ListContributionItem;
import de.walware.ecommons.ui.actions.SimpleContributionItem;
import de.walware.ecommons.ui.util.MessageUtil;
import de.walware.docmlet.base.ui.DocBaseUI;
import de.walware.docmlet.base.ui.processing.DocProcessingManager;
public class RunConfigsDropdownContribution extends ListContributionItem
implements IWorkbenchContribution, IExecutableExtension {
private static class Data {
private final DocProcessingManager manager;
private final IFile file;
public Data(final DocProcessingManager manager, final IFile file) {
this.manager= manager;
this.file= file;
}
}
protected class ConfigContribution extends SimpleContributionItem {
private Data data;
private final ILaunchConfiguration configuration;
public ConfigContribution(final ImageDescriptor icon,
final String label, final String mnemonic,
final ILaunchConfiguration configuration) {
super(icon, null, label, mnemonic);
this.configuration= configuration;
}
@Override
protected void execute(final Event event) throws ExecutionException {
this.data.manager.setActiveConfig(this.configuration);
this.data.manager.launch(this.configuration, this.data.file, RunConfigsDropdownContribution.this.launchFlags);
}
}
private final ActionUtil util= new ActionUtil(ActionUtil.ACTIVE_EDITOR_MODE);
private ImIdentitySet<String> launchFlags;
private final StringBuilder sBuilder= new StringBuilder(32);
public RunConfigsDropdownContribution(final IContentType contentType,
final IdentityCollection<String> launchFlags) {
this.util.setContentType(contentType);
this.launchFlags= ImCollections.toIdentitySet(launchFlags);
}
/** For instantiation via plugin.xml */
public RunConfigsDropdownContribution() {
}
@Override
public void initialize(final IServiceLocator serviceLocator) {
this.util.setServiceLocator(serviceLocator);
}
@Override
public void setInitializationData(final IConfigurationElement config,
final String propertyName, final Object data) throws CoreException {
if (data instanceof Map) {
try {
final Map<String, String> parameters= (Map<String, String>) data;
{ final String s= parameters.get(ActionUtil.CONTENT_TYPE_PAR_NAME);
if (s != null) {
this.util.setContentType(Platform.getContentTypeManager().getContentType(s));
}
}
{ final String s= parameters.get(ActionUtil.LAUNCH_FLAGS_PAR_NAME);
if (s != null) {
this.launchFlags= CollectionUtils.toIdentifierSet(s.split(";")); //$NON-NLS-1$
}
}
}
catch (final IllegalArgumentException e) {
throw new CoreException(new Status(IStatus.ERROR, DocBaseUI.PLUGIN_ID, 0,
NLS.bind("Invalid declaration of contribution by ''{0}''.", //$NON-NLS-1$
config.getContributor().getName() ),
e ));
}
}
}
private StringBuilder getStringBuilder() {
this.sBuilder.setLength(0);
return this.sBuilder;
}
@Override
protected void createContributionItems(final List<IContributionItem> items) {
final IWorkbenchWindow window= this.util.getWindow();
final IFile file= this.util.getFile(window);
final DocProcessingManager manager= this.util.getManager(this.util.getContentType(window, file));
if (manager == null) {
return;
}
final ImList<ILaunchConfiguration> configs= manager.getAvailableConfigs();
final Data data= new Data(manager, file);
int i= 0;
for (int num= 1; i < configs.size(); i++, num++) {
final ILaunchConfiguration configuration= configs.get(i);
final ImageDescriptor icon= manager.getImageDescriptor(configuration);
String mnemonic= null;
final StringBuilder label= getStringBuilder();
if (num > 0 && num <= 10) {
mnemonic= Integer.toString((num % 10));
label.append(mnemonic);
label.append(' ');
}
label.append(MessageUtil.escapeForMenu(configuration.getName()));
final ConfigContribution item= createConfigContribution(icon, label, mnemonic,
configuration );
item.data= data;
items.add(item);
}
}
protected ConfigContribution createConfigContribution(
final ImageDescriptor icon, final StringBuilder label, final String mnemonic,
final ILaunchConfiguration configuration) {
return new ConfigContribution(icon, label.toString(), mnemonic, configuration);
}
}