/******************************************************************************* * Copyright (c) 2000, 2010 QNX Software Systems 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: * QNX Software Systems - Initial API and implementation * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.make.internal.ui.editor; import java.util.ArrayList; import java.util.List; import org.eclipse.cdt.make.core.IMakeTarget; import org.eclipse.cdt.make.core.IMakeTargetManager; import org.eclipse.cdt.make.core.MakeCorePlugin; import org.eclipse.cdt.make.core.makefile.ITargetRule; import org.eclipse.cdt.make.internal.ui.MakeUIPlugin; import org.eclipse.cdt.make.ui.dialogs.MakeTargetDialog; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IFileEditorInput; /** */ public class AddBuildTargetAction extends Action { MakefileContentOutlinePage fOutliner; static final ITargetRule[] EMPTY_TARGET_RULES = { }; public AddBuildTargetAction(MakefileContentOutlinePage outliner) { super(MakeUIPlugin.getResourceString("AddBuildTargetAction.title")); //$NON-NLS-1$ setDescription(MakeUIPlugin.getResourceString("AddBuildTargetAction.description")); //$NON-NLS-1$ setToolTipText(MakeUIPlugin.getResourceString("AddBuildTargetAction.tooltip")); //$NON-NLS-1$ fOutliner = outliner; } /* * (non-Javadoc) * * @see org.eclipse.jface.action.IAction#run() */ @Override public void run() { IMakeTargetManager manager = MakeCorePlugin.getDefault().getTargetManager(); IFile file = getFile(); Shell shell = fOutliner.getControl().getShell(); ITargetRule[] rules = getTargetRules(fOutliner.getSelection()); if (file != null && rules.length > 0 && shell != null) { StringBuffer sbBuildName = new StringBuffer(); StringBuffer sbMakefileTarget = new StringBuffer(); for (ITargetRule rule : rules) { String name = rule.getTarget().toString().trim(); if (sbBuildName.length() == 0) { sbBuildName.append(name); } else { sbBuildName.append('_').append(name); } if (sbMakefileTarget.length() == 0) { sbMakefileTarget.append(name); } else { sbMakefileTarget.append(' ').append(name); } } String buildName = generateUniqueName(file.getParent(), sbBuildName.toString()); String makefileTarget = sbMakefileTarget.toString(); IMakeTarget target = null; try { String[] ids = manager.getTargetBuilders(file.getProject()); if (ids.length > 0) { target = manager.createTarget(file.getProject(), buildName, ids[0]); target.setBuildAttribute(IMakeTarget.BUILD_TARGET, makefileTarget); target.setContainer(file.getParent()); } } catch (CoreException e) { MakeUIPlugin.errorDialog(shell, MakeUIPlugin.getResourceString("AddBuildTargetAction.exception.internal"), e.toString(), e); //$NON-NLS-1$ target = null; } // Always popup the dialog. if (target != null) { MakeTargetDialog dialog; try { dialog = new MakeTargetDialog(shell, target); dialog.open(); } catch (CoreException e) { MakeUIPlugin.errorDialog(shell, MakeUIPlugin.getResourceString("AddBuildTargetAction.exception.internal"), e.toString(), e); //$NON-NLS-1$ } } } } private String generateUniqueName(IContainer container, String targetString) { String newName = targetString; int i = 0; IMakeTargetManager manager = MakeCorePlugin.getDefault().getTargetManager(); try { while (manager.findTarget(container, newName) != null) { i++; newName = targetString + " (" + Integer.toString(i) + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } } catch (CoreException e) { } return newName; } public boolean canActionBeAdded(ISelection selection) { ITargetRule[] rules = getTargetRules(selection); if (rules.length == 0) return false; IFile file = getFile(); if (file == null) return false; if (!MakeCorePlugin.getDefault().getTargetManager().hasTargetBuilder(file.getProject())) return false; return true; } private IFile getFile() { Object input = fOutliner.getInput(); if (input instanceof IFileEditorInput) { return ((IFileEditorInput)input).getFile(); } return null; } private ITargetRule[] getTargetRules(ISelection sel) { if (!sel.isEmpty() && sel instanceof IStructuredSelection) { List<?> list = ((IStructuredSelection)sel).toList(); if (list.size() > 0) { List<ITargetRule> targets = new ArrayList<ITargetRule>(list.size()); Object[] elements = list.toArray(); for (Object element : elements) { if (element instanceof ITargetRule) { targets.add((ITargetRule) element); } } return targets.toArray(EMPTY_TARGET_RULES); } } return EMPTY_TARGET_RULES; } }