/*******************************************************************************
* Copyright (c) 2007, 2009 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
*******************************************************************************/
package org.eclipse.cdt.ui.newui;
import java.util.ArrayList;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.internal.ui.cview.IncludeRefContainer;
import org.eclipse.cdt.internal.ui.cview.IncludeReferenceProxy;
/**
* This class provides static methods to work with multiple
* implementors of "ConfigManager" extension point.
*
* @noextend This class is not intended to be subclassed by clients.
* @noinstantiate This class is not intended to be instantiated by clients.
*/
public class ManageConfigSelector {
private static final String EXTENSION_POINT_ID = "org.eclipse.cdt.ui.ConfigManager"; //$NON-NLS-1$
public static final String ELEMENT_NAME = "manager"; //$NON-NLS-1$
public static final String CLASS_NAME = "class"; //$NON-NLS-1$
private static IConfigManager[] mgrs = null;
/**
* Searches for IConfigManager which
* can process given projects.
*
* @param obs - list of projects to handle
* @return first matching ConfigManager
*/
public static IConfigManager getManager(IProject[] obs) {
readMgrs();
if (mgrs == null)
return null;
for (int i=0; i<mgrs.length; i++) {
if (mgrs[i].canManage(obs))
return mgrs[i];
}
return null;
}
/**
* Searches for IConfigManager which
* can process given objects.
*
* @param obs - "raw" array of objects
* @return first matching ConfigManager
*/
public static IConfigManager getManagerFor(Object[] obs) {
return getManager(getProjects(obs));
}
/**
* Filters "raw" objects array
*
* @param obs - objects to filter
* @return array with only new-style projects included
*/
public static IProject[] getProjects(Object[] obs) {
ArrayList<IProject> lst = new ArrayList<IProject>();
if (obs != null) {
for (Object ob : obs) {
IProject prj = null;
// Extract project from selection
if (ob instanceof ICElement) { // for C/C++ view
prj = ((ICElement)ob).getCProject().getProject();
} else if (ob instanceof IResource) { // for other views
prj = ((IResource)ob).getProject();
/* get project from Include folder elements */
} else if (ob instanceof IncludeRefContainer) {
ICProject fCProject = ((IncludeRefContainer)ob).getCProject();
if (fCProject != null)
prj = fCProject.getProject();
} else if (ob instanceof IncludeReferenceProxy) {
IncludeRefContainer irc = ((IncludeReferenceProxy)ob).getIncludeRefContainer();
if (irc != null) {
ICProject fCProject = irc.getCProject();
if (fCProject != null)
prj = fCProject.getProject();
}
}
if (prj == null || lst.contains(prj) ||
!CoreModel.getDefault().isNewStyleProject(prj))
continue;
lst.add(prj);
}
}
return lst.toArray(new IProject[lst.size()]);
}
private static void readMgrs() {
if (mgrs != null)
return;
IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(EXTENSION_POINT_ID);
if (extensionPoint == null)
return;
IExtension[] extensions = extensionPoint.getExtensions();
if (extensions == null)
return;
ArrayList<IConfigManager> list = new ArrayList<IConfigManager>();
for (int i = 0; i < extensions.length; ++i) {
IConfigurationElement[] elements = extensions[i].getConfigurationElements();
for (int k = 0; k < elements.length; k++) {
if (elements[k].getName().equals(ELEMENT_NAME)) {
IConfigManager cm = null;
try {
cm = (IConfigManager) elements[k].createExecutableExtension(CLASS_NAME);
} catch (CoreException e) {
}
if (cm != null)
list.add(cm);
}
}
}
list.add(ManageConfigRunner.getDefault()); // Default manager
mgrs = list.toArray(new IConfigManager[list.size()]);
}
}