blob: 069b5b345f4378b9c401bf5abc7ac992302a5380 [file] [log] [blame]
/*
* Copyright (c) 2010-2012 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.internal.ui;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.CDOState;
import org.eclipse.emf.cdo.internal.ui.messages.Messages;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import java.util.ArrayList;
import java.util.List;
import java.util.WeakHashMap;
/**
* @author Eike Stepper
* @since 3.0
*/
@Deprecated
public class AsyncContentProvider implements ITreeContentProvider
{
private static final Object[] NO_CHILDREN = {};
private ITreeContentProvider delegate;
private WeakHashMap<Object, LoadJob> loadJobs = new WeakHashMap<Object, LoadJob>();
public AsyncContentProvider(ITreeContentProvider delegate)
{
this.delegate = delegate;
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
delegate.inputChanged(viewer, oldInput, newInput);
}
public void dispose()
{
delegate.dispose();
}
public final Object[] getElements(Object inputElement)
{
return getChildren(inputElement);
}
public Object[] getChildren(Object parentElement)
{
if (parentElement instanceof LoadJob)
{
return NO_CHILDREN;
}
if (parentElement instanceof CDOObject)
{
CDOObject object = (CDOObject)parentElement;
if (object.cdoState() == CDOState.PROXY)
{
LoadJob loadJob = getLoadJob(parentElement);
return loadJob.getChildren();
}
}
return delegate.getChildren(parentElement);
}
public boolean hasChildren(Object parentElement)
{
if (parentElement instanceof LoadJob)
{
return false;
}
if (parentElement instanceof CDOObject)
{
CDOObject object = (CDOObject)parentElement;
if (object.cdoState() == CDOState.PROXY)
{
LoadJob loadJob = getLoadJob(parentElement);
return loadJob.hasChildren();
}
}
return delegate.hasChildren(parentElement);
}
public Object getParent(Object element)
{
if (element instanceof LoadJob)
{
LoadJob loadJob = (LoadJob)element;
return loadJob.getParent();
}
if (element instanceof CDOObject)
{
CDOObject object = (CDOObject)element;
if (object.cdoState() == CDOState.PROXY)
{
LoadJob loadJob = getLoadJob(element);
return loadJob.getParent();
}
}
return delegate.getParent(element);
}
private synchronized LoadJob getLoadJob(Object parentElement)
{
LoadJob loadJob = loadJobs.get(parentElement);
if (loadJob == null)
{
loadJob = new LoadJob(parentElement);
loadJobs.put(parentElement, loadJob);
new Thread(loadJob).start();
}
return loadJob;
}
/**
* @author Eike Stepper
*/
private final class LoadJob implements Runnable
{
private Object parent;
private List<Object> children = new ArrayList<Object>();
public LoadJob(Object parent)
{
this.parent = parent;
}
public Object getParent()
{
return parent;
}
public Object[] getChildren()
{
synchronized (children)
{
return children.toArray(new Object[children.size()]);
}
}
public boolean hasChildren()
{
return false;
}
public void run()
{
}
@Override
public String toString()
{
return Messages.getString("AsyncContentProvider_0"); //$NON-NLS-1$
}
}
}