/******************************************************************************* * Copyright (c) 2000, 2016 IBM 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: * IBM Corporation - initial API and implementation * Phil Loats (IBM Corp.) - fix to use only foundation APIs *******************************************************************************/ package org.eclipse.help.internal.context; import java.util.ArrayList; import org.eclipse.help.ICommandLink; import org.eclipse.help.IContext; import org.eclipse.help.IContext2; import org.eclipse.help.IContext3; import org.eclipse.help.IHelpResource; import org.eclipse.help.ITopic; import org.eclipse.help.internal.CommandLink; import org.eclipse.help.internal.Topic; import org.eclipse.help.internal.UAElement; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; public class Context extends UAElement implements IContext3 { public static final String ATTRIBUTE_TITLE = "title"; //$NON-NLS-1$ public static final String NAME = "context"; //$NON-NLS-1$ public static final String ELEMENT_DESCRIPTION = "description"; //$NON-NLS-1$ public static final String ATTRIBUTE_ID = "id"; //$NON-NLS-1$ public static final String ATTRIBUTE_PLUGIN_ID = "pluginId"; //$NON-NLS-1$ public Context(Element src) { super(src); } public Context(IContext src, String id) { super(NAME); setId(id); children = new ArrayList<>(); mergeContext(src); } public void mergeContext(IContext src) { String text = src.getText(); if (getText() == null || getText().length() == 0) { setText(text); } if (src instanceof IContext2 && getTitle() == null) { String title = ((IContext2)src).getTitle(); if (title != null) { setAttribute(ATTRIBUTE_TITLE, title); } } if (src instanceof IContext3) { ICommandLink[] commands = ((IContext3)src).getRelatedCommands(); for (int i=0;i<commands.length;++i) { appendChild(new CommandLink(commands[i])); } } IHelpResource[] topics = src.getRelatedTopics(); for (int i=0;i<topics.length;++i) { if (topics[i] instanceof ITopic) { appendChild(new Topic((ITopic)topics[i])); } else { Topic topic = new Topic(); topic.setHref(topics[i].getHref()); topic.setLabel(topics[i].getLabel()); appendChild(topic); } } } @Override public String getCategory(IHelpResource topic) { return null; } public String getId() { return getAttribute(ATTRIBUTE_ID); } @Override public ICommandLink[] getRelatedCommands() { return getChildren(ICommandLink.class); } @Override public IHelpResource[] getRelatedTopics() { return getChildren(IHelpResource.class); } @Override public String getStyledText() { return null; } @Override public String getText() { Node node = getElement().getFirstChild(); while (node != null) { if (node.getNodeType() == Node.ELEMENT_NODE) { if (ELEMENT_DESCRIPTION.equals(node.getNodeName())) { node.normalize(); Node text = node.getFirstChild(); if (text == null) { return new String(); } if (text.getNodeType() == Node.TEXT_NODE) { return text.getNodeValue(); } } } node = node.getNextSibling(); } return null; } @Override public String getTitle() { String title = getAttribute(ATTRIBUTE_TITLE); if (title == null || title.length() == 0) { return null; } return title; } public void setId(String id) { setAttribute(ATTRIBUTE_ID, id); } public void setText(String text) { Node node = getElement().getFirstChild(); while (node != null) { if (node.getNodeType() == Node.ELEMENT_NODE) { if (ELEMENT_DESCRIPTION.equals(node.getNodeName())) { getElement().removeChild(node); break; } } node = node.getNextSibling(); } if (text != null) { Document document = getElement().getOwnerDocument(); Node description = getElement().appendChild(document.createElement(ELEMENT_DESCRIPTION)); description.appendChild(document.createTextNode(text)); } } }