/*******************************************************************************
 * Copyright (c) 2000, 2006 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.List;

import org.eclipse.help.*;
import org.xml.sax.*;
/**
 * Context object, as defined in the map.xml
 */
public class Context extends ContextsNode implements IContext2 {
	private String text;
	protected String pluginID;
	protected String shortID;
	protected String title;
	/**
	 * Context constructor.
	 */
	public Context(Attributes attrs) {
		super(attrs);
		if (attrs == null)
			return;
		shortID = attrs.getValue("id"); //$NON-NLS-1$
		title = attrs.getValue("title"); //$NON-NLS-1$
	}
	private static String stripStyle(String s, String style) {
		int len = s.length();
		int skipLen = style.length();
		StringBuffer sb = new StringBuffer(s.length());
		int idx;
		int lastIdx=0;
		
		while ((idx = s.indexOf(style, lastIdx)) != -1) {
			int start = idx;
			boolean hasSpace = false;
			while ((start>lastIdx) && Character.isWhitespace(s.charAt(start-1))) { 
				start--;
			}
			if (idx != start)
				hasSpace = true;
			//add everthing to start
			sb.append(s.substring(lastIdx, start));
			
			// skip style
			idx += skipLen;
			int end = idx;
			while ((end<len) && Character.isWhitespace(s.charAt(end)))
				end++;
			if (end != idx)
				hasSpace = true;
			lastIdx = end;
			
			if (hasSpace)
				sb.append(' ');
		}
		
		// add everything else
		sb.append(s.substring(lastIdx, len));
		return sb.toString();
	}
	/**
	 * @return plain text (without <@#$b>or </@#$b> bug 59541)
	 */
	public String getText() {
		//PAL foundation
		/*
		return text
		// if there are spaces on any or both side of bold they need to be
				// collapsed to one
				.replaceAll("(\\s+</?@#\\$b>\\s*)|(\\s*</?@#\\$b>\\s+)", " ") //$NON-NLS-1$ //$NON-NLS-2$
				.replaceAll("</?@#\\$b>", ""); //$NON-NLS-1$ //$NON-NLS-2$
		*/
		return stripStyle(stripStyle(text,"<@#$b>"),"</@#$b>");  //$NON-NLS-1$//$NON-NLS-2$
	}
	/**
	 * @return styled text with <@#$b>and </@#$b> to mark bold range
	 */
	public String getStyledText() {
		return text;
	}
	public IHelpResource[] getRelatedTopics() {
		if (children.size() > 0) {
			IHelpResource[] related = new IHelpResource[children.size()];
			children.toArray(related);
			return related;
		}
		// signal empty toc. handled by calling class.
		return null;
	}
	public void setStyledText(String s) {
		text = s;
	}
	/**
	 * Obtains short id (without plugin)
	 */
	public String getShortId() {
		return shortID;
	}
	public String getID() {
		return pluginID + "." + shortID; //$NON-NLS-1$
	}
	/**
	 * Sets the pluginID.
	 * 
	 * @param pluginID
	 *            The pluginID to set
	 */
	public void setPluginID(String pluginID) {
		this.pluginID = pluginID;
	}
	/**
	 * @see ContextsNode#build(ContextsBuilder)
	 */
	public void build(ContextsBuilder builder) {
		builder.build(this);
	}
	/**
	 * Replaces children list
	 */
	public void setChildren(List children) {
		this.children = children;
	}
	
	public String getCategory(IHelpResource topic) {
		// For backward compatibility, all the topics
		// will continue to belong to the default category
		return null;
	}
	/* (non-Javadoc)
	 * @see org.eclipse.help.IContext2#getTitle()
	 */
	public String getTitle() {
		return title;
	}
}
