/*******************************************************************************
 * Copyright (c) 2003, 2007 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.ui.internal.navigator.extensions;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
import org.eclipse.ui.internal.navigator.NavigatorPlugin;
import org.eclipse.ui.progress.UIJob;

/**
 * <p>
 * Provides a consistent mechanism to interact with StructuredViewers over time.
 * The Common Navigator framework attempts to defer the loading of extensions,
 * which also means defering the loading of Content Providers. To follow the
 * contracts already in place by
 * {@link org.eclipse.jface.viewers.ITreeContentProvider}, the Viewer, Old
 * Input, and New Input parameters for
 * {@link org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)}
 * are cached for content providers that have not been loaded yet.
 * </p>
 * <p>
 * <b>WARNING: </b> The following class is not inherently thread-safe.
 * Appropriate measures should be taken to ensure that
 * {@link #inputChanged(Object, Object)}and
 * {@link #inputChanged(Viewer, Object, Object)}are not called concurrently
 * with {@link #initialize(IStructuredContentProvider)}.
 * 
 * 
 * 
 * @since 3.2
 */
public class StructuredViewerManager {

	private Viewer viewer;

	private Object cachedOldInput;

	private Object cachedNewInput;
	
	private UIJob refreshJob = new UIJob(
			CommonNavigatorMessages.StructuredViewerManager_0) {
		public IStatus runInUIThread(IProgressMonitor monitor) {
			if(viewer != null) {
				try {
					if (viewer.getControl().isDisposed()) {
						return Status.OK_STATUS;
					}					
	
					
					Display display = viewer.getControl().getDisplay();
					if (!display.isDisposed() && viewer != null) {
						try {
							viewer.getControl().setRedraw(false);
							viewer.refresh();
						} finally {
							viewer.getControl().setRedraw(true);
						}
						 
					}
				} catch (RuntimeException e) {
					NavigatorPlugin.logError(0, e.toString(), e);
				}
			}
			return Status.OK_STATUS;
		}
	};

	/**
	 * 
	 * @param aViewer
	 */
	public StructuredViewerManager(Viewer aViewer) {
		super();
		viewer = aViewer;
		refreshJob.setSystem(true);
	}

	/**
	 * 
	 * @return The real viewer.
	 */
	public Viewer getViewer() {
		return viewer;
	}

	/**
	 * 
	 * @param anOldInput
	 * @param aNewInput
	 */
	public void inputChanged(Object anOldInput, Object aNewInput) {
		cachedOldInput = anOldInput;
		cachedNewInput = aNewInput;
	}

	/**
	 * 
	 * @param aViewer
	 * @param anOldInput
	 * @param aNewInput
	 */
	public void inputChanged(Viewer aViewer, Object anOldInput, Object aNewInput) {
		viewer = aViewer;
		cachedOldInput = anOldInput;
		cachedNewInput = aNewInput;
	}

	/**
	 * 
	 * @param aContentProvider
	 * @return True if all is well.
	 */
	public boolean initialize(IStructuredContentProvider aContentProvider) {
		boolean result = true;
		try {
			if (aContentProvider != null) {
				aContentProvider.inputChanged(viewer, cachedOldInput,
						cachedNewInput);
			}
		} catch (RuntimeException e) {
			NavigatorPlugin.logError(0, e.toString(), e);
			result = false;
		}
		return result;
	}

	/**
	 * 
	 */
	public void safeRefresh() {
		refreshJob.schedule(10);

	}

}
