/*******************************************************************************
 * Copyright (c) 2000, 2003 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.ui.views.bookmarkexplorer;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.widgets.Control;

/**
 * Provides content for the bookmark navigator
 */ 
class BookmarkContentProvider implements IStructuredContentProvider, IResourceChangeListener, IBasicPropertyConstants {
	
	private BookmarkNavigator bookmarksView;
	private IResource input;
	private Viewer viewer;
	
	/**
	 * The constructor.
	 */
	public BookmarkContentProvider(BookmarkNavigator bookmarksView) {
		this.bookmarksView = bookmarksView;
	}
	/**
	 * The visual part that is using this content provider is about
	 * to be disposed. Deallocate all allocated SWT resources.
	 */
	public void dispose() {
		IResource resource = (IResource) viewer.getInput();
		if (resource != null) {
			resource.getWorkspace().removeResourceChangeListener(this);
		}
	}
	/**
	 * Returns all the bookmarks that should be shown for
	 * the current settings.
	 */
	Object[] getBookmarks(IResource resource) {
		try {
			return resource.findMarkers(IMarker.BOOKMARK, true, IResource.DEPTH_INFINITE);
		} catch (CoreException e) {
			return new Object[0];
		}
	}
	public Object[] getChildren(Object element) {
		// If the input element is a workbench return a list
		// of the existing bookmarks.  Otherwise, return an empty list.
		if (element instanceof IResource)
			return getBookmarks((IResource) element);
		else
			return new Object[0];
	}
	public Object[] getElements(Object element) {
		return getChildren(element);
	}
	/**
	 * Recursively walks over the resource delta and gathers all marker deltas.  Marker
	 * deltas are placed into one of the three given vectors depending on
	 * the type of delta (add, remove, or change).
	 */
	void getMarkerDeltas(IResourceDelta delta, List additions, List removals, List changes) {
		IMarkerDelta[] markerDeltas = delta.getMarkerDeltas();
		for (int i = 0; i < markerDeltas.length; i++) {
			IMarkerDelta markerDelta = markerDeltas[i];
			IMarker marker = markerDelta.getMarker();
			switch (markerDelta.getKind()) {
				case IResourceDelta.ADDED:
					if (markerDelta.isSubtypeOf(IMarker.BOOKMARK)) {
						additions.add(marker);
					}
					break;
				case IResourceDelta.REMOVED:
					if (markerDelta.isSubtypeOf(IMarker.BOOKMARK)) {
						removals.add(marker);
					}
					break;
				case IResourceDelta.CHANGED:
					if (markerDelta.isSubtypeOf(IMarker.BOOKMARK)) {
						changes.add(marker);
					}
					break;
			}
		}
	
		//recurse on child deltas
		IResourceDelta[] children = delta.getAffectedChildren();
		for (int i = 0; i < children.length; i++) {
			getMarkerDeltas(children[i], additions, removals, changes);
		}
	}
	/* (non-Javadoc)
	 * Method declared on ITreeContentProvider,
	 */
	public Object getParent(Object element) {
		return input;
	}
	/**
	 * hasChildren method comment.
	 */
	public boolean hasChildren(Object element) {
		if (element instanceof IWorkspace)
			return true;
		else
			return false;
	}
	public void inputChanged(Viewer newViewer, Object oldInput, Object newInput) {
		if (oldInput == null) {
			IResource resource = (IResource) newInput;
			resource.getWorkspace().addResourceChangeListener(this);
		}
		this.viewer = newViewer;
		this.input = (IResource) newInput;
	}
	/**
	 * The workbench has changed.  Process the delta and issue updates to the viewer,
	 * inside the UI thread.
	 *
	 * @see IResourceChangeListener#resourceChanged
	 */
	public void resourceChanged(final IResourceChangeEvent event) {
	
		// gather all marker changes from the delta.
		// be sure to do this in the calling thread, 
		// as the delta is destroyed when this method returns
		final List additions = new ArrayList();
		final List removals = new ArrayList();
		final List changes = new ArrayList();
		
		IResourceDelta delta = event.getDelta();
		if(delta == null) return;
		getMarkerDeltas(delta, additions, removals, changes);
	
		// update the viewer based on the marker changes, in the UI thread
		if (additions.size() + removals.size() + changes.size() > 0) {
			viewer.getControl().getDisplay().asyncExec(new Runnable() {
				public void run() {
					// This method runs inside an asyncExec.  The widget may have been destroyed
					// by the time this is run.  Check for this and do nothing if so.
					Control ctrl = viewer.getControl();
					if (ctrl == null || ctrl.isDisposed())
						return;
					
					viewer.refresh();
				}
			});
		}
	}
}
