/*******************************************************************************
 * Copyright (c) 2003 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.jsp;

import org.eclipse.core.indexsearch.IIndexQuery;
import org.eclipse.core.indexsearch.ISearchResultCollector;
import org.eclipse.core.indexsearch.SearchEngine;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IResourceProxy;
import org.eclipse.core.resources.IResourceProxyVisitor;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPluginDescriptor;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;

import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageRegistry;

import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.editors.text.TextEditorPreferenceConstants;
import org.eclipse.ui.plugin.AbstractUIPlugin;


/**
 */
public class JspUIPlugin extends AbstractUIPlugin implements IResourceChangeListener {
		
	/**
	 * The id of the JavaFamilyExample plugin (value <code>"org.eclipse.jdt.ui.examples.javafamily"</code>).
	 */	
	public static final String ID_PLUGIN= "org.eclipse.jdt.ui.examples.javafamily"; //$NON-NLS-1$

	public static final String JSP_TYPE= "jsp"; //$NON-NLS-1$
	
	private static final boolean DEBUG= false;
	private static JspUIPlugin fgDefault;
	private static boolean fgJSPIndexingIsEnabled= false;
	
	private SearchEngine fSearchEngine;
	
	/**
	 * @param descriptor
	 */
	public JspUIPlugin(IPluginDescriptor descriptor) {
		super(descriptor);
		fgDefault= this;
		fSearchEngine= SearchEngine.getSearchEngine();
	}
	
	public static JspUIPlugin getDefault() {
		return fgDefault;
	}

	void controlJSPIndexing(boolean enable) {
		if (fgJSPIndexingIsEnabled != enable) {
			fgJSPIndexingIsEnabled= enable;
			IWorkspace workspace= ResourcesPlugin.getWorkspace();
			if (enable) {
				
				IResourceProxyVisitor visitor=
					new IResourceProxyVisitor() {
						public boolean visit(IResourceProxy proxy) throws CoreException {
							String name= proxy.getName();
							int pos= name.lastIndexOf('.');
							if (pos >= 0) {
								String extension= name.substring(pos+1);
								if (JSP_TYPE.equalsIgnoreCase(extension)) {
									IResource r= proxy.requestResource();
									if (r instanceof IFile)
										jspAdded((IFile)r);
								}
							}
							return true;
						}
					};
				try {
					workspace.getRoot().accept(visitor, 0);
				} catch (CoreException e) {
					log("visiting jsp files", e); //$NON-NLS-1$
				}
				
				workspace.addResourceChangeListener(this,
	//					IResourceChangeEvent.PRE_AUTO_BUILD |
	//					IResourceChangeEvent.POST_AUTO_BUILD |
						IResourceChangeEvent.POST_CHANGE |
						IResourceChangeEvent.PRE_DELETE |
						IResourceChangeEvent.PRE_CLOSE
				);					
			} else {
				workspace.removeResourceChangeListener(this);					
			}
		}
	}
		
	boolean isJSPIndexingOn() {
		return fgJSPIndexingIsEnabled;
	}
	
	public void resourceChanged(IResourceChangeEvent event) {
		if ( !fgJSPIndexingIsEnabled || event == null)
			return;
		IResourceDelta d= event.getDelta();
		if (d == null)
			return;
		try {
			d.accept(
				new IResourceDeltaVisitor() {
					public boolean visit(IResourceDelta delta) {
						if (delta != null) {
							IResource r= delta.getResource();
							if (r instanceof IFile) {
								IFile file= (IFile) r;
								String type= file.getFileExtension();
								if (JSP_TYPE.equalsIgnoreCase(type)) {
									switch (delta.getKind()) {
									case IResourceDelta.ADDED:
										jspAdded(file);
										break;
									case IResourceDelta.REMOVED:
										jspRemoved(file);
										break;
									case IResourceDelta.CHANGED:
										// no need to index if the content has not changed
										if ((delta.getFlags() & IResourceDelta.CONTENT) != 0)
											jspAdded(file);
										break;
									}					
								}
							}
						}
						return true;
					}
				}
			);
		} catch (CoreException e) {
			log("processing resource delta", e); //$NON-NLS-1$
		}
	}
	
	public static void log(String message, Throwable e) {
		getDefault().getLog().log(new Status(IStatus.ERROR, ID_PLUGIN, IStatus.ERROR, message, e));
	}
	
	void jspAdded(IFile jspFile) {
		if (DEBUG) System.out.println("Added: " + jspFile); //$NON-NLS-1$		
		JspIndexParser indexer= new JspIndexParser(jspFile);
		fSearchEngine.add(jspFile.getProject().getFullPath(), indexer);
	}
	
	void jspRemoved(IFile jspFile) {
		if (DEBUG) System.out.println("Removed: " + jspFile); //$NON-NLS-1$
		fSearchEngine.remove(jspFile.getFullPath().toString(), jspFile.getProject().getFullPath());
	}
	
	public void search(IIndexQuery query, ISearchResultCollector resultCollector, IProgressMonitor pm) {
		fSearchEngine.search(query, resultCollector, pm, SearchEngine.WAIT_UNTIL_READY_TO_SEARCH);
	}
		
	/**
	 * Shutdown the JspCore plug-in.
	 * <p>
	 * De-registers the resource changed listener.
	 * <p>
	 * @see org.eclipse.core.runtime.Plugin#shutdown()
	 */
	public void shutdown() {
		controlJSPIndexing(false);
	}
	
	protected void initializeDefaultPreferences(IPreferenceStore prefs) {
		TextEditorPreferenceConstants.initializeDefaultValues(prefs);
	}
	
	/**
	 * Returns the standard display to be used. The method first checks, if
	 * the thread calling this method has an associated display. If so, this
	 * display is returned. Otherwise the method returns the default display.
	 */
	public static Display getStandardDisplay() {
		Display display= Display.getCurrent();
		if (display == null) {
			display= Display.getDefault();
		}
		return display;		
	}
	
	protected ImageRegistry createImageRegistry() {
		return JspPluginImages.initializeImageRegistry();
	}	
		
}
