/******************************************************************************* * Copyright (c) 2007, 2010 Intel Corporation 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: * Intel Corporation - initial API and implementation * Nokia - converted from action to handler *******************************************************************************/ package org.eclipse.cdt.internal.ui.actions; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.window.Window; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.ISources; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ListSelectionDialog; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICContainer; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.core.settings.model.ICResourceDescription; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.newui.AbstractPage; /** * Handler for command that deletes resource description. (If resource description is missing * one from parent is normally used) */ public class DeleteResConfigsHandler extends AbstractHandler { protected ArrayList<IResource> objects; private ArrayList<ResCfgData> outData; @Override public void setEnabled(Object context) { ISelection selection = getSelection(context); setEnabledFromSelection(selection); } protected ISelection getSelection(Object context) { Object s = HandlerUtil.getVariable(context, ISources.ACTIVE_MENU_SELECTION_NAME); if (s instanceof ISelection) { return (ISelection) s; } return null; } public void setEnabledFromSelection(ISelection selection) { objects = null; if ((selection != null) && !selection.isEmpty()) { // case for context menu Object[] obs = null; if (selection instanceof IStructuredSelection) { obs = ((IStructuredSelection)selection).toArray(); } else if (selection instanceof ITextSelection) { IFile file = getFileFromActiveEditor(); if (file != null) obs = Collections.singletonList(file).toArray(); } if (obs != null && obs.length > 0) { for (int i=0; i<obs.length; i++) { IResource res = null; // only folders and files may be affected by this action if (obs[i] instanceof ICContainer || obs[i] instanceof ITranslationUnit) res = ((ICElement)obs[i]).getResource(); // project's configuration cannot be deleted else if (obs[i] instanceof IResource && !(obs[i] instanceof IProject)) res = (IResource)obs[i]; if (res != null) { IProject p = res.getProject(); if (!p.isOpen()) continue; if (!CoreModel.getDefault().isNewStyleProject(p)) continue; IPath path = res.getProjectRelativePath(); // getting description in read-only mode ICProjectDescription prjd = CoreModel.getDefault().getProjectDescription(p, false); if (prjd == null) continue; ICConfigurationDescription[] cfgds = prjd.getConfigurations(); if (cfgds == null || cfgds.length == 0) continue; for (ICConfigurationDescription cfgd : cfgds) { ICResourceDescription rd = cfgd.getResourceDescription(path, true); if (rd != null) { if (objects == null) objects = new ArrayList<IResource>(); objects.add(res); break; // stop configurations scanning } } } } } } setBaseEnabled(objects != null); } private IFile getFileFromActiveEditor() { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window != null) { IWorkbenchPage page = window.getActivePage(); if (page != null) { IEditorPart editor = page.getActiveEditor(); if (editor != null) { IEditorInput input = editor.getEditorInput(); if (input != null) return (IFile) input.getAdapter(IFile.class); } } } return null; } public Object execute(ExecutionEvent event) throws ExecutionException { openDialog(); return null; } private void openDialog() { if (objects == null || objects.size() == 0) return; // create list of configurations to delete ListSelectionDialog dialog = new ListSelectionDialog( CUIPlugin.getActiveWorkbenchShell(), objects, createSelectionDialogContentProvider(), new LabelProvider() {}, ActionMessages.DeleteResConfigsAction_0); dialog.setTitle(ActionMessages.DeleteResConfigsAction_1); if (dialog.open() == Window.OK) { Object[] selected = dialog.getResult(); if (selected != null && selected.length > 0) { for (Object element : selected) { ((ResCfgData)element).delete(); AbstractPage.updateViews(((ResCfgData)element).res); } } } } // Stores data for resource description with its "parents". class ResCfgData { IResource res; ICProjectDescription prjd; ICConfigurationDescription cfgd; ICResourceDescription rdesc; public ResCfgData(IResource res2, ICProjectDescription prjd2, ICConfigurationDescription cfgd2, ICResourceDescription rdesc2) { res = res2; prjd = prjd2; cfgd = cfgd2; rdesc = rdesc2; } // performs deletion public void delete() { try { cfgd.removeResourceDescription(rdesc); CoreModel.getDefault().setProjectDescription(res.getProject(), prjd); } catch (CoreException e) {} } @Override public String toString() { return "[" + cfgd.getName() + "] for " + res.getName(); //$NON-NLS-1$ //$NON-NLS-2$ } } private IStructuredContentProvider createSelectionDialogContentProvider() { outData = null; return new IStructuredContentProvider() { public Object[] getElements(Object inputElement) { if (outData != null) return outData.toArray(); outData = new ArrayList<ResCfgData>(); List<?> ls = (List<?>)inputElement; Iterator<?> it = ls.iterator(); IProject proj = null; ICProjectDescription prjd = null; ICConfigurationDescription[] cfgds = null; // creating list of all res descs for all objects while (it.hasNext()) { IResource res = (IResource)it.next(); IPath path = res.getProjectRelativePath(); if (res.getProject() != proj) { proj = res.getProject(); prjd = CoreModel.getDefault().getProjectDescription(proj); cfgds = prjd.getConfigurations(); } if (cfgds != null) { for (ICConfigurationDescription cfgd : cfgds) { ICResourceDescription rd = cfgd.getResourceDescription(path, true); if (rd != null) outData.add(new ResCfgData(res, prjd, cfgd, rd)); } } } return outData.toArray(); } public void dispose() {} public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {} }; } }