/*******************************************************************************
 * Copyright (c) 2010 Standards for Technology in Automotive Retail 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:
 *     David Carver (STAR) - initial API and implementation
 *     David Carver (Intalio) - generalize the implementation for contribution to eclipse
 *******************************************************************************/
package org.eclipse.wst.xml.ui.internal.views.annotations;

import org.eclipse.jface.internal.text.html.HTMLTextPresenter;
import org.eclipse.jface.text.TextPresentation;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
import org.eclipse.wst.xml.ui.internal.taginfo.MarkupTagInfoProvider;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.w3c.dom.Node;

/**
 * Provides a view similar to the JavaDoc view that will display any documentation that resides in
 * the content model for an XML document.
 * 
 * @author dcarver
 *
 */
public class XMLAnnotationsView extends ViewPart implements ISelectionListener {

	public static final String ID = "org.eclipse.wst.xml.ui.view.annotations.XMLAnnotationsView"; //$NON-NLS-1$

	private StyledText styledtext;

	private String xmlDoc = XMLUIMessages.Documentation_view_default_msg;

	private HTMLTextPresenter presenter;

	private final TextPresentation presentation = new TextPresentation();

	private IStructuredSelection currentSelection;
	private CMNode cmNode;

	public XMLAnnotationsView() {
	}

	public void init(IViewSite site) throws PartInitException {
		super.init(site);
		getSite().getPage().addPostSelectionListener(this);
	}

	/**
	 * Create contents of the view part.
	 * 
	 * @param parent
	 */
	public void createPartControl(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);
		container.setLayout(new FillLayout());
		presenter = new HTMLTextPresenter(false);
		createStyledTextWidget(container);
		doStyledTextInput();
	}

	private void createStyledTextWidget(Composite container) {
		styledtext = new StyledText(container, SWT.V_SCROLL | SWT.H_SCROLL);
		styledtext.setBackground(getColor(SWT.COLOR_INFO_BACKGROUND));
		styledtext.setEditable(false);
		styledtext.setBounds(container.getBounds());
		styledtext.addControlListener(new ControlAdapter() {
			/*
			 * @see
			 * org.eclipse.swt.events.ControlAdapter#controlResized(org.eclipse
			 * .swt.events.ControlEvent)
			 */
			public void controlResized(ControlEvent e) {
				doStyledTextInput();
			}
		});
	}

	private void doStyledTextInput() {
		presentation.clear();
		Rectangle size = styledtext.getClientArea();
		int width = size.width;
		int height = size.height;
		if (width == 0) {
			width = 200;
		}
		
		if (height == 0) {
			height = 400;
		}

		String msg = presenter.updatePresentation(styledtext, xmlDoc, presentation, width, height);
		if (msg != null) {
			styledtext.setText(msg);
			TextPresentation.applyTextPresentation(presentation, styledtext);
		}
	}

	public void setFocus() {
		
	}


	public void dispose() {
		styledtext = null;
		getSite().getPage().removePostSelectionListener(this);
		cmNode = null;
		super.dispose();
	}

	public void selectionChanged(IWorkbenchPart part, ISelection selection) {

		IEditorPart edPart = getSite().getPage().getActiveEditor();
		if (part.equals(edPart)) {
			if (selection instanceof IStructuredSelection) {
				currentSelection = (IStructuredSelection) selection;
				if (!selection.isEmpty()
						&& (currentSelection.getFirstElement() instanceof Node)) {
					Node node = (Node) currentSelection.getFirstElement();
					ModelQuery mq = ModelQueryUtil.getModelQuery(node.getOwnerDocument());
					if (mq != null) {
						cmNode = mq.getCMNode(node);
						MarkupTagInfoProvider tagInfo = new MarkupTagInfoProvider();
						xmlDoc = tagInfo.getInfo(cmNode);
					}
					else {
						xmlDoc = XMLUIMessages.Documentation_view_default_msg;
					}
					doStyledTextInput();
				}
			}
		}
	}
	
	private Color getColor(int colorID) {
		Display display = Display.getCurrent();
		return display.getSystemColor(colorID);
	}

}