/***************************************************************************************************
 * Copyright (c) 2003, 2004 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.jst.j2ee.navigator.internal;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jst.j2ee.internal.navigator.ui.Messages;
import org.eclipse.jst.j2ee.navigator.internal.plugin.J2EENavigatorPlugin;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;

public class LoadingDDNode {

	private static ImageDescriptor loadingOne;
	private static ImageDescriptor loadingTwo;
	private static ImageDescriptor loadingThree;
	private static ImageDescriptor loadingFour;
	

	private static final Set loadingFiles = new HashSet();
	private static final Map placeHolders = new HashMap();

	static {
		try {
			loadingOne = J2EENavigatorPlugin.getDefault().getImageDescriptor("full/etool16/loading1.gif"); //$NON-NLS-1$
			loadingTwo = J2EENavigatorPlugin.getDefault().getImageDescriptor("full/etool16/loading2.gif"); //$NON-NLS-1$
			loadingThree = J2EENavigatorPlugin.getDefault().getImageDescriptor("full/etool16/loading3.gif"); //$NON-NLS-1$
			loadingFour = J2EENavigatorPlugin.getDefault().getImageDescriptor("full/etool16/loading4.gif"); //$NON-NLS-1$
		} catch (RuntimeException e) {
			String msg = e.getMessage() != null ? e.getMessage() : e.toString();
			J2EENavigatorPlugin.logError(0, msg, e);
			loadingOne = ImageDescriptor.getMissingImageDescriptor();
			loadingTwo = ImageDescriptor.getMissingImageDescriptor();
			loadingThree = ImageDescriptor.getMissingImageDescriptor();
			loadingFour = ImageDescriptor.getMissingImageDescriptor();
		}
	}
 
	private String text; 
	private String text1;
	private String text2;
	private String text3;
	private int count = 0;

	private boolean disposed = false;
	private IProject modelProject;
	

	/**
	 * Return a place holder node to sit in the tree until data is available.
	 * This place holder node will be animated for the user's enjoyment. 
	 *  
	 * @param modelFile The modelFile to be loaded
	 * @return A new unique place holder for this file for a given load cycle
	 */
	public static LoadingDDNode createPlaceHolder(IProject modelFile) {
		LoadingDDNode node = null;
		synchronized (LoadingDDNode.class) {
			if(placeHolders.containsKey(modelFile))
				node = (LoadingDDNode) placeHolders.get(modelFile);
			else 			
				placeHolders.put(modelFile, node = new LoadingDDNode(modelFile));
		}
		return node;
	}
	
	public LoadingDDNode(IProject model) {
		text = NLS.bind(Messages.LoadingDDNode_Loading_0_, model.getName());
		text1 = text  + "."; //$NON-NLS-1$
		text2 = text  + ".."; //$NON-NLS-1$
		text3 = text  + "..."; //$NON-NLS-1$
		modelProject = model;
	}

	public String getText() {

		switch ( count % 4) {
			case 0 :
				return text;
			case 1 :
				return text1;
			case 2 :
				return text2;
			case 3 :
			default :
				return text3;
		} 
	}

	public Image getImage() {
		switch ( count = (++count % 4)) {
			case 0 :
				return J2EENavigatorPlugin.getDefault().getImage(loadingOne);
			case 1 :
				return J2EENavigatorPlugin.getDefault().getImage(loadingTwo);
			case 2 :
				return J2EENavigatorPlugin.getDefault().getImage(loadingThree);
			case 3 :
			default :
				return J2EENavigatorPlugin.getDefault().getImage(loadingFour);
		}
	} 
	
	
	
	public boolean isDisposed() {
		return disposed;
	}
	
	public void dispose() {
		synchronized (LoadingDDNode.class) {
			disposed = true;
			placeHolders.remove(modelProject);	
			loadingFiles.remove(modelProject);
		}
	}

	/**
	 * Employ a Test and Set (TST) primitive to ensure 
	 * that only job is spawned to load the model file
	 *   
	 * 
	 * @return True only if no other jobs are trying to load this model.
	 */
	public static boolean canBeginLoading(IProject modelProject) {
		synchronized (LoadingDDNode.class) {  
			if(loadingFiles.contains(modelProject))
				return false;
			loadingFiles.add(modelProject);
			return true;
		}

	}

	/**
	 * Return true if a job has requested permission to load the model file   
	 * @param modelFile The model file that should be loaded
	 * @return True only if a job is trying to load the model.
	 */
	public static boolean isBeingLoaded(IProject modelProject) {
		synchronized (LoadingDDNode.class) {  
			return loadingFiles.contains(modelProject);
		}
	}
	
}
