/********************************************************************** * Copyright (c) 2004, 2006 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 * Markus Schorn (Wind River Systems) **********************************************************************/ package org.eclipse.cdt.internal.ui; import java.io.File; import java.io.FileWriter; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.internal.ui.text.CHelpBookDescriptor; import org.eclipse.cdt.internal.ui.text.CHelpSettings; import org.eclipse.cdt.ui.CUIPlugin; 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.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * This class is used to manage external plugins that contribute * C/C++ help information through the CHelpProvider extension point */ public class CHelpProviderManager { final private static String C_HELP_SETTINGS_FILE_NAME = "cHelpSettings.xml"; //$NON-NLS-1$ final private static String ELEMENT_ROOT = "cHelpSettings"; //$NON-NLS-1$ //private static Map fProjectHelpSettings = null; private static CHelpSettings fDefaultHelpSettings = null; private static File fSettingsFile = null; static private CHelpProviderManager fInstance = null; private static IProject fCurrentProject = null; private static CHelpSettings fCurrentSettings = null; private CHelpProviderManager() { } private static File getSettingsFile(){ if(fSettingsFile == null){ fSettingsFile = CUIPlugin.getDefault().getStateLocation().append(C_HELP_SETTINGS_FILE_NAME).toFile(); } return fSettingsFile; } // private static Map getSettingsMap(){ // if(fProjectHelpSettings == null) // fProjectHelpSettings = new HashMap(); // return fProjectHelpSettings; // } private static CHelpSettings getDefaultHelpSettings(){ if(fDefaultHelpSettings == null){ fDefaultHelpSettings = new CHelpSettings(null); } return fDefaultHelpSettings; } private static CHelpSettings getPersistedHelpSettings(IProject project){ /* uncomment to use Map Map settingsMap = getSettingsMap(); CHelpSettings settings = (CHelpSettings)settingsMap.get(project.getName()); if(settings == null){ settings = createHelpSettings(project); settingsMap.put(project.getName(),settings); } return settings; */ return createHelpSettings(project); } private static CHelpSettings createHelpSettings(IProject project){ // String projectName = project.getName(); File file = getSettingsFile(); CHelpSettings settings = null; Element rootElement = null; if(file.isFile()){ try{ DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.parse(file); NodeList nodes = doc.getElementsByTagName(ELEMENT_ROOT); if (nodes.getLength() > 0) rootElement = (Element)nodes.item(0); }catch(ParserConfigurationException e){ }catch(SAXException e){ }catch(IOException e){ } } settings = new CHelpSettings(project,rootElement); return settings; } private static CHelpSettings getHelpSettings(IProject project){ if(project == null) return getDefaultHelpSettings(); CHelpSettings settings = null; if(fCurrentProject != null && fCurrentSettings != null && project == fCurrentProject) settings = fCurrentSettings; else{ fCurrentProject = project; fCurrentSettings = getPersistedHelpSettings(project); settings = fCurrentSettings; } return settings; } private static CHelpSettings getHelpSettings(ICHelpInvocationContext context){ IProject project = getProjectFromContext(context); return getHelpSettings(project); } private static IProject getProjectFromContext(ICHelpInvocationContext context){ IProject project = context.getProject(); if(project == null){ ITranslationUnit unit = context.getTranslationUnit(); if(unit != null) project = unit.getCProject().getProject(); } return project; } public static CHelpProviderManager getDefault() { if (fInstance == null) { fInstance = new CHelpProviderManager(); } return fInstance; } public IFunctionSummary getFunctionInfo(ICHelpInvocationContext context, String name) { CHelpSettings settings = getHelpSettings(context); return settings.getFunctionInfo(context,name); } public IFunctionSummary[] getMatchingFunctions(ICHelpInvocationContext context, String frag) { CHelpSettings settings = getHelpSettings(context); return settings.getMatchingFunctions(context,frag); } public ICHelpResourceDescriptor[] getHelpResources(ICHelpInvocationContext context, String name){ CHelpSettings settings = getHelpSettings(context); return settings.getHelpResources(context,name); } public CHelpBookDescriptor[] getCHelpBookDescriptors(ICHelpInvocationContext context){ return getHelpSettings(context).getCHelpBookDescriptors(); } public void serialize(ICHelpInvocationContext context){ CHelpSettings settings = getHelpSettings(context); File file = getSettingsFile(); try{ DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc; Element rootElement = null; if(file.exists()){ doc = builder.parse(file); NodeList nodes = doc.getElementsByTagName(ELEMENT_ROOT); if (nodes.getLength() > 0) rootElement = (Element)nodes.item(0); } else{ doc = builder.newDocument(); } if(rootElement == null){ rootElement = doc.createElement(ELEMENT_ROOT); doc.appendChild(rootElement); } settings.serialize(doc,rootElement); FileWriter writer = new FileWriter(file); Transformer transformer=TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$ transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$ transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$ DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(writer); transformer.transform(source, result); writer.close(); }catch(ParserConfigurationException e){ }catch(SAXException e){ }catch(TransformerConfigurationException e){ }catch(TransformerException e){ }catch(IOException e){ } } }