/**
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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.
*
*/
package gov.redhawk.prf.ui.wizard;
import gov.redhawk.sca.properties.Category;
import gov.redhawk.sca.properties.IPropertiesProvider;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import mil.jpeojtrs.sca.prf.Properties;
import mil.jpeojtrs.sca.prf.Struct;
import mil.jpeojtrs.sca.prf.StructSequence;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.progress.DeferredTreeContentManager;
import org.eclipse.ui.progress.IDeferredWorkbenchAdapter;
import org.eclipse.ui.progress.PendingUpdateAdapter;
/**
* @since 4.0
*/
public class PropertiesBrowserContentProvider extends AdapterFactoryContentProvider {
private DeferredTreeContentManager deferredContentManager;
private final Map<Object, List<IPropertiesProvider>> map = new HashMap<Object, List<IPropertiesProvider>>();
private final Set<IJobChangeListener> jobListeners = new HashSet<IJobChangeListener>();
private final IJobChangeListener mainListener = new IJobChangeListener() {
@Override
public void sleeping(final IJobChangeEvent event) {
for (final IJobChangeListener listener : PropertiesBrowserContentProvider.this.jobListeners) {
listener.sleeping(event);
}
}
@Override
public void scheduled(final IJobChangeEvent event) {
for (final IJobChangeListener listener : PropertiesBrowserContentProvider.this.jobListeners) {
listener.scheduled(event);
}
}
@Override
public void running(final IJobChangeEvent event) {
for (final IJobChangeListener listener : PropertiesBrowserContentProvider.this.jobListeners) {
listener.running(event);
}
}
@Override
public void done(final IJobChangeEvent event) {
for (final IJobChangeListener listener : PropertiesBrowserContentProvider.this.jobListeners) {
listener.done(event);
}
}
@Override
public void awake(final IJobChangeEvent event) {
for (final IJobChangeListener listener : PropertiesBrowserContentProvider.this.jobListeners) {
listener.awake(event);
}
}
@Override
public void aboutToRun(final IJobChangeEvent event) {
for (final IJobChangeListener listener : PropertiesBrowserContentProvider.this.jobListeners) {
listener.aboutToRun(event);
}
}
};
/**
*
* @param adapterFactory
*/
public PropertiesBrowserContentProvider(AdapterFactory adapterFactory) {
super(adapterFactory);
}
/**
* {@inheritDoc}
*/
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof List) {
return ((List< ? >) parentElement).toArray();
} else if (parentElement instanceof IPropertiesProvider) {
return ((IPropertiesProvider) parentElement).getCategories().toArray();
} else if (parentElement instanceof Category) {
List<Object> children = new ArrayList<Object>();
children.addAll(((Category) parentElement).getCategories());
for (Properties props : ((Category) parentElement).getProperties()) {
children.addAll(this.getPropertiesChildren(props));
}
return children.toArray();
} else if (parentElement instanceof Struct) {
Struct struct = (Struct) parentElement;
List<Object> children = new ArrayList<Object>();
children.addAll(struct.getSimple());
children.addAll(struct.getSimpleSequence());
return children.toArray();
} else if (parentElement instanceof StructSequence) {
StructSequence sequence = (StructSequence) parentElement;
return Collections.singletonList(sequence.getStruct()).toArray();
}
return super.getChildren(parentElement);
}
/**
* {@inheritDoc}
*/
@Override
public Object getParent(Object element) {
return null;
}
/**
* {@inheritDoc}
*/
@Override
public boolean hasChildren(Object element) {
return element instanceof IPropertiesProvider || element instanceof Category || element instanceof Struct || element instanceof StructSequence;
}
/**
* {@inheritDoc}
*/
@Override
public void dispose() {
//Nothing to do
}
/**
* {@inheritDoc}
*/
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
super.inputChanged(viewer, oldInput, newInput);
this.deferredContentManager = createDeferredContentManager((AbstractTreeViewer) viewer);
}
/**
* {@inheritDoc}
*/
@Override
public Object[] getElements(Object inputElement) {
final List<IPropertiesProvider> providers = this.map.get(inputElement);
if (providers != null) {
return getChildren(providers);
}
return this.deferredContentManager.getChildren(inputElement);
}
/**
* @param viewer
*/
private DeferredTreeContentManager createDeferredContentManager(final AbstractTreeViewer viewer) {
final DeferredTreeContentManager contentManager = new DeferredTreeContentManager(viewer) {
/**
* {@inheritDoc}
*/
@Override
protected IDeferredWorkbenchAdapter getAdapter(final Object element) {
return new PropertiesBrowserDeferredWorkbenchAdapter(map);
}
/**
* {@inheritDoc}
*/
@Override
protected PendingUpdateAdapter createPendingUpdateAdapter() {
return new PropertiesPendingUpdateAdapter();
}
};
contentManager.addUpdateCompleteListener(this.mainListener);
return contentManager;
}
private List<Object> getPropertiesChildren(Properties props) {
List<Object> children = new ArrayList<Object>();
children.addAll(props.getSimple());
children.addAll(props.getSimpleSequence());
children.addAll(props.getStruct());
children.addAll(props.getStructSequence());
return children;
}
}