/********************************************************************** * Copyright (c) 2004, 2008 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.internal.ui.text; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.ICHelpBook; import org.eclipse.cdt.ui.ICHelpProvider; import org.eclipse.cdt.ui.ICHelpResourceDescriptor; import org.eclipse.cdt.ui.IFunctionSummary; import org.eclipse.cdt.ui.text.ICHelpInvocationContext; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.Platform; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; /** * This class represents the Help settings for the current project * * @since 2.1 */ public class CHelpSettings { public static final String CONTRIBUTION_EXTENSION = "CHelpProvider"; //$NON-NLS-1$ final private static String ELEMENT_PROJECT = "project"; //$NON-NLS-1$ final private static String ATTRIBUTE_NAME = "name"; //$NON-NLS-1$ private IProject fProject; private static IConfigurationElement fConfigElements[] = null; private CHelpProviderDescriptor fProviderDescriptors[] = null; public CHelpSettings(IProject project){ this(project,null); } public CHelpSettings(IProject project, Element parentElement){ fProject = project; if(parentElement == null) return; Element projectElement = getProjectElement(parentElement); if(projectElement == null) return; getCHelpProviderDescriptors(projectElement); } private Element getProjectElement(Element parentElement){ NodeList nodes = parentElement.getElementsByTagName(ELEMENT_PROJECT); for(int i = 0; i < nodes.getLength(); i++){ Element curProject = (Element)nodes.item(i); if(getProject().getName().equals(curProject.getAttribute(ATTRIBUTE_NAME))) return curProject; } return null; } public IProject getProject(){ return fProject; } public CHelpProviderDescriptor[] getCHelpProviderDescriptors(Element projectElement){ if(fProviderDescriptors == null || projectElement != null){ IConfigurationElement congifElements[] = getConfigElements(); fProviderDescriptors = new CHelpProviderDescriptor[congifElements.length]; for(int i = 0; i < congifElements.length; i++){ fProviderDescriptors[i] = new CHelpProviderDescriptor(fProject,congifElements[i],projectElement); } } return fProviderDescriptors; } public CHelpProviderDescriptor[] getCHelpProviderDescriptors(){ return getCHelpProviderDescriptors(null); } public CHelpBookDescriptor[] getCHelpBookDescriptors(){ CHelpProviderDescriptor providerDescriptors[] = getCHelpProviderDescriptors(); if(providerDescriptors.length == 0) return new CHelpBookDescriptor[0]; List<CHelpBookDescriptor> bookList = new ArrayList<CHelpBookDescriptor>(); for(int i = 0; i < providerDescriptors.length; i++){ CHelpBookDescriptor bookDescriptors[] = providerDescriptors[i].getCHelpBookDescriptors(); if(bookDescriptors.length != 0) bookList.addAll(Arrays.asList(bookDescriptors)); } return bookList.toArray(new CHelpBookDescriptor[bookList.size()]); } private static IConfigurationElement[] getConfigElements(){ if(fConfigElements == null){ fConfigElements= Platform.getExtensionRegistry().getConfigurationElementsFor(CUIPlugin.PLUGIN_ID, CONTRIBUTION_EXTENSION); if(fConfigElements == null) fConfigElements = new IConfigurationElement[0]; } return fConfigElements; } public IFunctionSummary getFunctionInfo(ICHelpInvocationContext context, String name){ CHelpProviderDescriptor providerDescriptors[] = getCHelpProviderDescriptors(); for(int i = 0; i < providerDescriptors.length; i++){ ICHelpBook books[] = providerDescriptors[i].getEnabledMatchedCHelpBooks(context); if(books != null && books.length != 0){ ICHelpProvider provider = providerDescriptors[i].getCHelpProvider(); if(provider != null){ IFunctionSummary summary = provider.getFunctionInfo(context,books,name); if(summary != null) return summary; } } } return null; } public IFunctionSummary[] getMatchingFunctions(ICHelpInvocationContext context, String frag){ CHelpProviderDescriptor providerDescriptors[] = getCHelpProviderDescriptors(); List<IFunctionSummary> sumaryList = new ArrayList<IFunctionSummary>(); for(int i = 0; i < providerDescriptors.length; i++){ ICHelpBook books[] = providerDescriptors[i].getEnabledMatchedCHelpBooks(context); if(books != null && books.length != 0){ ICHelpProvider provider = providerDescriptors[i].getCHelpProvider(); if(provider != null){ IFunctionSummary summaries[] = provider.getMatchingFunctions(context,books,frag); if(summaries != null && summaries.length != 0) sumaryList.addAll(Arrays.asList(summaries)); } } } if(sumaryList.size() == 0) return null; return sumaryList.toArray(new IFunctionSummary[sumaryList.size()]); } public ICHelpResourceDescriptor[] getHelpResources(ICHelpInvocationContext context, String name){ CHelpProviderDescriptor providerDescriptors[] = getCHelpProviderDescriptors(); List<ICHelpResourceDescriptor> resourcesList = new ArrayList<ICHelpResourceDescriptor>(); for(int i = 0; i < providerDescriptors.length; i++){ ICHelpBook books[] = providerDescriptors[i].getEnabledMatchedCHelpBooks(context); if(books != null && books.length != 0){ ICHelpProvider provider = providerDescriptors[i].getCHelpProvider(); if(provider != null){ ICHelpResourceDescriptor resources[] = provider.getHelpResources(context,books,name); if(resources != null && resources.length != 0) resourcesList.addAll(Arrays.asList(resources)); } } } if(resourcesList.size() == 0) return null; return resourcesList.toArray(new ICHelpResourceDescriptor[resourcesList.size()]); } public void serialize(Document doc, Element parentElement){ CHelpProviderDescriptor providerDescriptors[] = getCHelpProviderDescriptors(); Element oldProjectElement = getProjectElement(parentElement); Element projectElement = doc.createElement(ELEMENT_PROJECT); projectElement.setAttribute(ATTRIBUTE_NAME,getProject().getName()); if(oldProjectElement != null) parentElement.replaceChild(projectElement,oldProjectElement); else parentElement.appendChild(projectElement); for(int i = 0; i < providerDescriptors.length; i++){ providerDescriptors[i].serialize(doc,projectElement); } } }