/******************************************************************************* * Copyright (c) 2007, 2012 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.help; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.SortedMap; import java.util.TreeMap; import org.eclipse.help.IHelpResource; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.eclipse.cdt.ui.ICHelpBook; import org.eclipse.cdt.ui.ICHelpResourceDescriptor; import org.eclipse.cdt.ui.IFunctionSummary; import org.eclipse.cdt.ui.text.ICHelpInvocationContext; public class CHelpBook implements ICHelpBook { private static final String ATTR_TITLE = "title"; //$NON-NLS-1$ private static final String ATTR_BTYPE = "type"; //$NON-NLS-1$ private static final String NODE_ENTRY = "entry"; //$NON-NLS-1$ private static final String TYPE_C = "HELP_TYPE_C"; //$NON-NLS-1$ private static final String TYPE_CPP = "HELP_TYPE_CPP"; //$NON-NLS-1$ private static final String TYPE_ASM = "HELP_TYPE_ASM"; //$NON-NLS-1$ private static final int DEFAULT_VAL = ICHelpBook.HELP_TYPE_C; private int type; private String title; private TreeMap<String, CHelpEntry> entries; public CHelpBook(Element e) { entries = new TreeMap<String, CHelpEntry>(); if (e.hasAttribute(ATTR_TITLE)) title = e.getAttribute(ATTR_TITLE).trim(); if (e.hasAttribute(ATTR_BTYPE)) { String s = e.getAttribute(ATTR_BTYPE); try { type = Integer.parseInt(s); if (type < DEFAULT_VAL || type > ICHelpBook.HELP_TYPE_ASM) type = DEFAULT_VAL; } catch (NumberFormatException ee) { if (TYPE_C.equalsIgnoreCase(s)) type = ICHelpBook.HELP_TYPE_C; else if (TYPE_CPP.equalsIgnoreCase(s)) type = ICHelpBook.HELP_TYPE_CPP; else if (TYPE_ASM.equalsIgnoreCase(s)) type = ICHelpBook.HELP_TYPE_ASM; else type = DEFAULT_VAL; } } NodeList list = e.getChildNodes(); for(int i = 0; i < list.getLength(); i++){ Node node = list.item(i); if(node.getNodeType() != Node.ELEMENT_NODE) continue; if(NODE_ENTRY.equals(node.getNodeName())) { CHelpEntry he = new CHelpEntry((Element)node); if (he.isValid()) entries.put(he.getKeyword(), he); } } } @Override public int getCHelpType() { return type; } @Override public String getTitle() { return title; } public IFunctionSummary getFunctionInfo( ICHelpInvocationContext context, String name) { if (entries.containsKey(name)) { CHelpEntry he = entries.get(name); IFunctionSummary[] fs = he.getFunctionSummary(); if (fs != null && fs.length > 0) return fs[0]; } return null; } /** * Temporary implementation with slow search * @param context * @param prefix * @return matching functions */ public List<IFunctionSummary> getMatchingFunctions( ICHelpInvocationContext context, String prefix) { Collection<CHelpEntry> col = null; if (prefix == null || prefix.trim().length() == 0) { // return whole data col = entries.values(); } else { String pr1 = prefix.trim(); byte[] bs = pr1.getBytes(); int i = bs.length - 1; while (i >= 0) { byte b = bs[i]; if (++b > bs[i]) { // no overflow bs[i] = b; break; } i--; } SortedMap<String, CHelpEntry> sm = (i>-1) ? entries.subMap(pr1, new String(bs)) : entries.tailMap(pr1); col = sm.values(); } if (col.size() > 0) { ArrayList<IFunctionSummary> out = new ArrayList<IFunctionSummary>(col.size()); for (CHelpEntry he: col) for (IFunctionSummary fs : he.getFunctionSummary()) out.add(fs); return out; } return null; } public ICHelpResourceDescriptor getHelpResources( ICHelpInvocationContext context, String name) { if (entries.containsKey(name)) { CHelpEntry he = entries.get(name); IHelpResource[] hr = he.getHelpResource(); if (hr != null && hr.length > 0) return new HRDescriptor(this, hr); } return null; } private class HRDescriptor implements ICHelpResourceDescriptor { private ICHelpBook book; private IHelpResource[] res; HRDescriptor(ICHelpBook _book, IHelpResource[] _res) { book = _book; res = _res; } @Override public ICHelpBook getCHelpBook() { return book; } @Override public IHelpResource[] getHelpResources() { return res; } } @Override public String toString() { return "<helpBook title=\"" +title +"\" type=\"" + type + "\">"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } }