/*******************************************************************************
* Copyright (c) 2011 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.wst.jsdt.internal.ui.navigator.deferred;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.jsdt.internal.ui.JavaPluginImages;
import org.eclipse.wst.jsdt.internal.ui.packageview.PackageFragmentRootContainer;
import org.eclipse.wst.jsdt.internal.ui.packageview.PackagesMessages;
public class LoadingModelNode {
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 = JavaPluginImages.DESC_TOOL_LOADING_1;
loadingTwo = JavaPluginImages.DESC_TOOL_LOADING_2;
loadingThree = JavaPluginImages.DESC_TOOL_LOADING_3;
loadingFour = JavaPluginImages.DESC_TOOL_LOADING_4;
} catch (RuntimeException 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 PackageFragmentRootContainer packageFragmentRootContainer;
/**
* 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 LoadingModelNode createPlaceHolder(PackageFragmentRootContainer packageFragmentRootContainer) {
LoadingModelNode node = null;
synchronized (LoadingModelNode.class) {
if(placeHolders.containsKey(packageFragmentRootContainer))
node = (LoadingModelNode) placeHolders.get(packageFragmentRootContainer);
else
placeHolders.put(packageFragmentRootContainer, node = new LoadingModelNode(packageFragmentRootContainer));
}
return node;
}
public LoadingModelNode(PackageFragmentRootContainer packageFragmentRootContainer) {
text = PackagesMessages.LoadingJavaScriptNode;
text1 = text + "."; //$NON-NLS-1$
text2 = text + ".."; //$NON-NLS-1$
text3 = text + "..."; //$NON-NLS-1$
this.packageFragmentRootContainer = packageFragmentRootContainer;
}
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 loadingOne.createImage();
case 1 :
return loadingTwo.createImage();
case 2 :
return loadingThree.createImage();
case 3 :
default :
return loadingFour.createImage();
}
}
public boolean isDisposed() {
return disposed;
}
public void dispose() {
synchronized (LoadingModelNode.class) {
disposed = true;
placeHolders.remove(packageFragmentRootContainer);
loadingFiles.remove(packageFragmentRootContainer);
}
}
/**
* 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(PackageFragmentRootContainer packageFragmentRootContainer) {
synchronized (LoadingModelNode.class) {
if(loadingFiles.contains(packageFragmentRootContainer))
return false;
loadingFiles.add(packageFragmentRootContainer);
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(PackageFragmentRootContainer packageFragmentRootContainer) {
synchronized (LoadingModelNode.class) {
return loadingFiles.contains(packageFragmentRootContainer);
}
}
public int hashCode() {
return packageFragmentRootContainer.hashCode();
}
public boolean equals(Object o) {
if(o instanceof LoadingModelNode) {
return packageFragmentRootContainer.equals( ((LoadingModelNode)o).packageFragmentRootContainer );
}
return false;
}
public String toString() {
return "LoadingModelNode for " + packageFragmentRootContainer.getLabel(); //$NON-NLS-1$
}
}