/*******************************************************************************
 * Copyright (c) 2000, 2005 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
 *******************************************************************************/
package org.eclipse.ajdt.internal.ui.editor;

import org.eclipse.ajdt.core.javaelements.AJCompilationUnit;
import org.eclipse.ajdt.core.javaelements.AJCompilationUnitManager;
import org.eclipse.ajdt.core.javaelements.PointcutUtilities;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.ISourceReference;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.ui.actions.SelectionConverter;
import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
import org.eclipse.jdt.internal.ui.text.java.hover.AbstractJavaEditorTextHover;
import org.eclipse.jface.text.IInformationControl;
import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextHoverExtension;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.information.IInformationProviderExtension2;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.editors.text.EditorsUI;

/**
 * Hover to show the definition of pointcuts. Loosely based on
 * org.eclipse.jdt.internal.ui.text.java.hover.JavaSourceHover
 */
public class PointcutSourceHover extends AbstractJavaEditorTextHover implements
		ITextHoverExtension, IInformationProviderExtension2 {

	/*
	 * @see ITextHover#getHoverInfo(ITextViewer, IRegion)
	 */
	public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
		if (!(getEditor() instanceof AspectJEditor)) {
			return null;
		}
		IJavaElement input = SelectionConverter
				.getInput((JavaEditor) getEditor());
		int offset = hoverRegion.getOffset();
		if (input instanceof ICompilationUnit) {
			input = AJCompilationUnitManager.mapToAJCompilationUnit((ICompilationUnit)input);
		}
		if (input instanceof AJCompilationUnit) {
			AJCompilationUnit ajcu = (AJCompilationUnit) input;
			String source = PointcutUtilities.isInPointcutContext(ajcu, offset);
			if (source != null) {
				String id = PointcutUtilities.findIdentifier(source, offset);
				if (id != null) {
					try {
						IJavaElement pc = PointcutUtilities.findPointcut(ajcu
								.getElementAt(offset), id);
						if (pc != null) {
							IResource res = pc.getUnderlyingResource();
							AJCompilationUnit cu = AJCompilationUnitManager.INSTANCE
									.getAJCompilationUnit((IFile) res);
							if (cu != null) {
								cu.requestOriginalContentMode();
								String pcs = ((ISourceReference) pc)
										.getSource();
								cu.discardOriginalContentMode();
								return pcs;
							}
							return ((ISourceReference) pc).getSource();
						}
					} catch (JavaModelException e) {
					}
				}
			}
		}
		return null;
	}

	/*
	 * @see org.eclipse.jface.text.ITextHoverExtension#getHoverControlCreator()
	 * @since 3.0
	 */
	public IInformationControlCreator getHoverControlCreator() {
		return new IInformationControlCreator() {
			public IInformationControl createInformationControl(Shell parent) {
				// need to use our own version to get AJ keyword highlighting
				return new AJSourceViewerInformationControl(parent,
						EditorsUI.getTooltipAffordanceString());
			}
		};
	}

	/*
	 * @see IInformationProviderExtension2#getInformationPresenterControlCreator()
	 * @since 3.0
	 */
	public IInformationControlCreator getInformationPresenterControlCreator() {
		return new IInformationControlCreator() {
			public IInformationControl createInformationControl(Shell parent) {
				int shellStyle = SWT.RESIZE | SWT.TOOL;
				int style = SWT.V_SCROLL | SWT.H_SCROLL;
				// need to use our own version to get AJ keyword highlighting
				return new AJSourceViewerInformationControl(parent, shellStyle,
						style);
			}
		};
	}

}
