/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.elementedit.jsp;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.Action;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.wst.sse.core.internal.util.URIResolver;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.w3c.dom.Element;

/**
 * @author mengbo
 * @version 1.5
 */
public class TaglibURIAction extends Action {
	private String URI;

	private Element element;

	public TaglibURIAction() {
		setText(PDPlugin.getResourceString("ElementEdit.Submenu.Taglib"));//$NON-NLS-1$
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.action.IAction#isEnabled()
	 */
	public boolean isEnabled() {
		if (element == null || URI == null || "".equals(URI))//$NON-NLS-1$
		{
			return false;
		}
		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.action.IAction#run()
	 */
	public void run() {
		String fileName = getResolvedURL(getElement(), URI);

		if (fileName != null && fileName.length() > 0) {
			IPath includedPath = new Path(fileName);
			includedPath.makeAbsolute();

			IFile file = getFile(includedPath);
			if (file != null && file.exists()) {
				try {
					IDE.openEditor(getPage(), file);
					return;
				} catch (PartInitException e) {
					PDPlugin.getAlerts().warning(
							"Message.Warning.Title", e.getLocalizedMessage());//$NON-NLS-1$
				}
			}
		}
		PDPlugin.getAlerts().warning(
				"Message.Warning.Title", "Taglib.OpenFile.ERROR");//$NON-NLS-1$ //$NON-NLS-2$
	}

	private IWorkbenchPage getPage() {
		IWorkbench workbench = PlatformUI.getWorkbench();
		IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
		return window.getActivePage();
	}

	/**
	 * @param uri
	 */
	public void setURI(String uri) {
		this.URI = uri;
	}

	private IFile getFile(IPath includedPath) {
		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
		IProject[] projects = workspaceRoot.getProjects();

		for (int i = 0, length = projects.length; i < length; i++) {
			IPath path = projects[i].getLocation();
			path = path.makeAbsolute();
			if (path != null && path.isPrefixOf(includedPath)) {
				// -1 so we still have the project path
				includedPath = includedPath.removeFirstSegments(path
						.segmentCount() - 1);
				return ResourcesPlugin.getWorkspace().getRoot().getFile(
						includedPath);
			}
		}
		return null;
	}

	private String getResolvedURL(Element element, String attrName) {
		URIResolver resolver = null;
		if (element instanceof IDOMNode) {
			resolver = ((IDOMNode) element).getModel().getResolver();
		}
		if (null == resolver) {
			return null;
		}
		String src = URI;
		if (src != null && src.length() > 0) {
			return resolver.getLocationByURI(src);
		}
		return null;
	}

	/**
	 * @return Returns the element.
	 */
	public Element getElement() {
		return element;
	}

	/**
	 * @param element
	 *            The element to set.
	 */
	public void setElement(Element element) {
		this.element = element;
	}
}
