/*******************************************************************************
 * Copyright (c) 2001, 2010 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
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.xml.ui.internal.contentassist;

import java.util.HashMap;

import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.TextPresentation;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.jface.text.contentassist.IContextInformationPresenter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
import org.eclipse.wst.sse.ui.internal.contentassist.ContextInformationValidator;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;


/**
 * Responsible for the presentation of the context info popup. This includes
 * text style, and when the window should close.
 * 
 * @author pavery
 */
public class AttributeContextInformationPresenter extends ContextInformationValidator implements IContextInformationPresenter {

	private IContextInformation fInfo = null;
	private ContextInfoModelUtil fModelUtil = null;

	public AttributeContextInformationPresenter() {
		super();
	}
	
	/**
	 * @see org.eclipse.wst.sse.ui.internal.contentassist.ContextInformationValidator#install(org.eclipse.jface.text.contentassist.IContextInformation, org.eclipse.jface.text.ITextViewer, int)
	 */
	public void install(IContextInformation info, ITextViewer viewer, int documentPosition) {
		super.install(info, viewer, documentPosition);
		this.fInfo = info;
		this.fModelUtil = new ContextInfoModelUtil((IStructuredDocument) viewer.getDocument());
	}

	/**
	 * @see org.eclipse.jface.text.contentassist.IContextInformationPresenter#updatePresentation(int,
	 *      org.eclipse.jface.text.TextPresentation)
	 */
	public boolean updatePresentation(int documentPosition, TextPresentation presentation) {
		presentation.clear();

		if (!(fInfo instanceof AttributeContextInformation)) {
			return false;
		}

		// iterate existing attributes from current node
		IDOMNode xmlNode = fModelUtil.getXMLNode(documentPosition);
		if (xmlNode == null)
			return false;
		
		IStructuredDocumentRegion sdRegion = xmlNode.getFirstStructuredDocumentRegion();
		ITextRegionList regions = sdRegion.getRegions();
		ITextRegion r = null;
		String attrName = ""; //$NON-NLS-1$
		Object temp = null;
		Position p = null;
		HashMap map = ((AttributeContextInformation) fInfo).getAttr2RangeMap();

		// so we can add ranges in order
		StyleRange[] sorted = new StyleRange[fInfo.getInformationDisplayString().length()];
		for (int i = 0; i < regions.size(); i++) {
			r = regions.get(i);
			if (r.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
				attrName = sdRegion.getText(r);
				temp = map.get(attrName);
				if (temp != null) {
					p = (Position) temp;
					sorted[p.offset] = new StyleRange(p.offset, p.length, null, null, SWT.BOLD);
				}
			}
		}
		// style ranges need to be added in order
		StyleRange sr = null;
		for (int i = 0; i < sorted.length; i++) {
			sr = sorted[i];
			if (sr != null) {
				presentation.addStyleRange(sr);
			}
		}
		return true;
	}
}
