blob: f95486de65b915dfda3840e0852628b65c391f91 [file] [log] [blame]
/***************************************************************************************************
* 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);
}
}
}