blob: dd1fe72bcdc448d9bcd705fd823bec7281d8d2f9 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2013 itemis 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:
* itemis - Initial API and implementation
*
* </copyright>
*/
package org.eclipse.sphinx.examples.hummingbird20.diagram.gmf.navigator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import org.eclipse.core.resources.IFile;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.workspace.WorkspaceEditingDomainFactory;
import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.sphinx.examples.hummingbird20.diagram.gmf.part.Hummingbird20DiagramEditorPlugin;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
import org.eclipse.ui.navigator.ICommonContentProvider;
/**
* @generated
*/
public class Hummingbird20DomainNavigatorContentProvider implements ICommonContentProvider {
/**
* @generated
*/
private AdapterFactoryContentProvider myAdapterFctoryContentProvier;
/**
* @generated
*/
private static final Object[] EMPTY_ARRAY = new Object[0];
/**
* @generated
*/
private Viewer myViewer;
/**
* @generated
*/
private AdapterFactoryEditingDomain myEditingDomain;
/**
* @generated
*/
private WorkspaceSynchronizer myWorkspaceSynchronizer;
/**
* @generated
*/
private Runnable myViewerRefreshRunnable;
/**
* @generated
*/
public Hummingbird20DomainNavigatorContentProvider() {
myAdapterFctoryContentProvier = new AdapterFactoryContentProvider(Hummingbird20DiagramEditorPlugin.getInstance()
.getItemProvidersAdapterFactory());
TransactionalEditingDomain editingDomain = WorkspaceEditingDomainFactory.INSTANCE.createEditingDomain();
myEditingDomain = (AdapterFactoryEditingDomain) editingDomain;
myEditingDomain.setResourceToReadOnlyMap(new HashMap() {
@Override
public Object get(Object key) {
if (!containsKey(key)) {
put(key, Boolean.TRUE);
}
return super.get(key);
}
});
myViewerRefreshRunnable = new Runnable() {
@Override
public void run() {
if (myViewer != null) {
myViewer.refresh();
}
}
};
myWorkspaceSynchronizer = new WorkspaceSynchronizer(editingDomain, new WorkspaceSynchronizer.Delegate() {
@Override
public void dispose() {
}
@Override
public boolean handleResourceChanged(final Resource resource) {
unloadAllResources();
asyncRefresh();
return true;
}
@Override
public boolean handleResourceDeleted(Resource resource) {
unloadAllResources();
asyncRefresh();
return true;
}
@Override
public boolean handleResourceMoved(Resource resource, final URI newURI) {
unloadAllResources();
asyncRefresh();
return true;
}
});
}
/**
* @generated
*/
@Override
public void dispose() {
myWorkspaceSynchronizer.dispose();
myWorkspaceSynchronizer = null;
myViewerRefreshRunnable = null;
myViewer = null;
unloadAllResources();
((TransactionalEditingDomain) myEditingDomain).dispose();
myEditingDomain = null;
}
/**
* @generated
*/
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
myViewer = viewer;
}
/**
* @generated
*/
void unloadAllResources() {
for (Resource nextResource : myEditingDomain.getResourceSet().getResources()) {
nextResource.unload();
}
}
/**
* @generated
*/
void asyncRefresh() {
if (myViewer != null && !myViewer.getControl().isDisposed()) {
myViewer.getControl().getDisplay().asyncExec(myViewerRefreshRunnable);
}
}
/**
* @generated
*/
@Override
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
/**
* @generated
*/
@Override
public void restoreState(IMemento aMemento) {
}
/**
* @generated
*/
@Override
public void saveState(IMemento aMemento) {
}
/**
* @generated
*/
@Override
public void init(ICommonContentExtensionSite aConfig) {
}
/**
* @generated
*/
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof IFile) {
IFile file = (IFile) parentElement;
URI fileURI = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
Resource resource = myEditingDomain.getResourceSet().getResource(fileURI, true);
return wrapEObjects(myAdapterFctoryContentProvier.getChildren(resource), parentElement);
}
if (parentElement instanceof Hummingbird20DomainNavigatorItem) {
return wrapEObjects(myAdapterFctoryContentProvier.getChildren(((Hummingbird20DomainNavigatorItem) parentElement).getEObject()),
parentElement);
}
return EMPTY_ARRAY;
}
/**
* @generated
*/
public Object[] wrapEObjects(Object[] objects, Object parentElement) {
Collection result = new ArrayList();
for (Object object : objects) {
if (object instanceof EObject) {
result.add(new Hummingbird20DomainNavigatorItem((EObject) object, parentElement, myAdapterFctoryContentProvier));
}
}
return result.toArray();
}
/**
* @generated
*/
@Override
public Object getParent(Object element) {
if (element instanceof Hummingbird20AbstractNavigatorItem) {
Hummingbird20AbstractNavigatorItem abstractNavigatorItem = (Hummingbird20AbstractNavigatorItem) element;
return abstractNavigatorItem.getParent();
}
return null;
}
/**
* @generated
*/
@Override
public boolean hasChildren(Object element) {
return element instanceof IFile || getChildren(element).length > 0;
}
}