/******************************************************************************* * Copyright (c) 2010 Philipp Kursawe. * 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: * Philipp Kursawe (phil.kursawe@gmail.com) - initial API and implementation ******************************************************************************/ package copyto.ui.internal; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.Separator; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.actions.CompoundContributionItem; import org.eclipse.ui.menus.CommandContributionItem; import org.eclipse.ui.menus.CommandContributionItemParameter; import org.eclipse.ui.menus.IWorkbenchContribution; import org.eclipse.ui.services.IServiceLocator; import osgiutils.services.ServiceRunnableFallback; import osgiutils.services.Services; import copyto.core.TargetDescriptor; import copyto.core.TargetService; import copyto.ui.internal.commands.CopyToHandler; /** * @author <a href="mailto:phil.kursawe@gmail.com">Philipp Kursawe</a> * */ public class TargetMenuItems extends CompoundContributionItem implements IWorkbenchContribution { private IServiceLocator locator; @Override protected IContributionItem[] getContributionItems() { return Services .run( TargetService.class, new ServiceRunnableFallback<TargetService, IContributionItem[]>() { public IContributionItem[] run( final TargetService targetService) { final int count = targetService.count(); // We allocate one more item for the separator final IContributionItem[] items = new IContributionItem[count > 1 ? count + 1 : count]; if (0 == count) { return items; } if (1 == count) { final TargetDescriptor first = targetService .findFirst(); if (first != null) { final String format = "Copy To {0}"; items[0] = createCommand(format, first); } else { return new IContributionItem[0]; } } else { // Still nothing assigned? final List<TargetDescriptor> targets = targetService .findAll(); Collections.sort(targets, new Comparator<TargetDescriptor>() { public int compare( final TargetDescriptor o1, final TargetDescriptor o2) { return o1 .getLabel() .compareTo( o2.getLabel()); } }); int i = 0; for (final TargetDescriptor target : targets) { final String format = "{0}"; //$NON-NLS-1$ items[i++] = createCommand(format, target); } items[i] = new Separator(); } return items; } public IContributionItem[] serviceNotFound() { return new IContributionItem[0]; } }); } private CommandContributionItem createCommand(final String format, final TargetDescriptor target) { final Map<String, Object> parameters = new HashMap<String, Object>(); final CommandContributionItemParameter contributionParameters = new CommandContributionItemParameter( locator, target.getId(), CopyToHandler.COMMAND_ID, CommandContributionItem.STYLE_PUSH); contributionParameters.label = NLS.bind(format, target.getLabel()); contributionParameters.parameters = parameters; parameters.put("id", target); //$NON-NLS-1$ return new CommandContributionItem(contributionParameters); } public void initialize(final IServiceLocator serviceLocator) { this.locator = serviceLocator; } }