/*******************************************************************************
 * Copyright (c) 2000, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ant.internal.ui.editor.text;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.IAnnotationHover;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.ant.internal.ui.editor.AntEditorMessages;
import org.eclipse.ant.internal.ui.editor.derived.HTMLPrinter;


/**
 * Determines all markers for the given line and collects, concatenates, and formulates
 * their messages.
 */
public class XMLAnnotationHover implements IAnnotationHover {
	
	/**
	 * Returns the distance to the ruler line. 
	 */
	private int compareRulerLine(Position position, IDocument document, int line) {
		
		if (position.getOffset() > -1 && position.getLength() > -1) {
			try {
				int xmlAnnotationLine= document.getLineOfOffset(position.getOffset());
				if (line == xmlAnnotationLine)
					return 1;
				if (xmlAnnotationLine <= line && line <= document.getLineOfOffset(position.getOffset() + position.getLength()))
					return 2;
			} catch (BadLocationException x) {
			}
		}
		
		return 0;
	}
	
	/**
	 * Returns one marker which includes the ruler's line of activity.
	 */
	private List getXMLAnnotationsForLine(ISourceViewer viewer, int line) {
		
		IDocument document= viewer.getDocument();
		IAnnotationModel model= viewer.getAnnotationModel();
		
		if (model == null)
			return null;
			
		List exact= new ArrayList();
		
		Iterator e= model.getAnnotationIterator();
		Map messagesAtPosition= new HashMap();
		while (e.hasNext()) {
			Object o= e.next();
			if (o instanceof IXMLAnnotation) {
				IXMLAnnotation a= (IXMLAnnotation)o;
				if (!a.hasOverlay()) {
					Position position= model.getPosition((Annotation)a);
					if (position == null)
						continue;

					if (isDuplicateXMLAnnotation(messagesAtPosition, position, a.getMessage()))
						continue;
	
					switch (compareRulerLine(position, document, line)) {
						case 1:
							exact.add(a);
							break;
					}
				}
			}
		}
		
		return exact;
	}

	private boolean isDuplicateXMLAnnotation(Map messagesAtPosition, Position position, String message) {
		if (messagesAtPosition.containsKey(position)) {
			Object value= messagesAtPosition.get(position);
			if (message.equals(value))
				return true;

			if (value instanceof List) {
				List messages= (List)value;
				if  (messages.contains(message)) {
					return true;
				}
				messages.add(message);
			} else {
				ArrayList messages= new ArrayList();
				messages.add(value);
				messages.add(message);
				messagesAtPosition.put(position, messages);
			}
		} else
			messagesAtPosition.put(position, message);
		return false;
	}
		
	/* (non-Javadoc)
	 * @see org.eclipse.jface.text.source.IAnnotationHover#getHoverInfo(org.eclipse.jface.text.source.ISourceViewer, int)
	 */
	public String getHoverInfo(ISourceViewer sourceViewer, int lineNumber) {
		List xmlAnnotations= getXMLAnnotationsForLine(sourceViewer, lineNumber);
		if (xmlAnnotations != null) {
			
			if (xmlAnnotations.size() == 1) {
				
				// optimization
				IXMLAnnotation xmlAnnotation= (IXMLAnnotation)xmlAnnotations.get(0);
				String message= xmlAnnotation.getMessage();
				if (message != null && message.trim().length() > 0) {
					return formatSingleMessage(message);
				}
					
			} else {
					
				List messages= new ArrayList();
				
				Iterator e= xmlAnnotations.iterator();
				while (e.hasNext()) {
					IXMLAnnotation xmlAnnotation= (IXMLAnnotation)e.next();
					String message= xmlAnnotation.getMessage();
					if (message != null && message.trim().length() > 0) {
						messages.add(message.trim());
					}
				}
				
				if (messages.size() == 1) {
					return formatSingleMessage((String) messages.get(0));
				}
					
				if (messages.size() > 1) {
					return formatMultipleMessages(messages);
				}
			}
		}
		
		return null;
	}
	
	/*
	 * Formats a message as HTML text.
	 */
	private String formatSingleMessage(String message) {
		StringBuffer buffer= new StringBuffer();
		HTMLPrinter.addPageProlog(buffer);
		HTMLPrinter.addParagraph(buffer, HTMLPrinter.convertToHTMLContent(message));
		HTMLPrinter.addPageEpilog(buffer);
		return buffer.toString();
	}
	
	/*
	 * Formats several message as HTML text.
	 */
	private String formatMultipleMessages(List messages) {
		StringBuffer buffer= new StringBuffer();
		HTMLPrinter.addPageProlog(buffer);
		HTMLPrinter.addParagraph(buffer, HTMLPrinter.convertToHTMLContent(AntEditorMessages.getString("AntAnnotationHover.multipleMarkersAtThisLine"))); //$NON-NLS-1$
		
		HTMLPrinter.startBulletList(buffer);
		Iterator e= messages.iterator();
		while (e.hasNext())
			HTMLPrinter.addBullet(buffer, HTMLPrinter.convertToHTMLContent((String) e.next()));
		HTMLPrinter.endBulletList(buffer);	
		
		HTMLPrinter.addPageEpilog(buffer);
		return buffer.toString();
	}
}
