/*******************************************************************************
* Copyright (c) 2007, 2014 Borland Software 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:
* Borland Software Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.m2m.internal.qvt.oml.common.ui.views;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.m2m.internal.qvt.oml.common.CommonPlugin;
import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.MetamodelRegistry;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.services.IServiceLocator;
/**
* @author vrepeshko
*/
public class MetamodelBrowserView extends ViewPart implements IResourceChangeListener {
public static final String ID = "org.eclipse.m2m.internal.qvt.oml.common.views.MetamodelBrowserView"; //$NON-NLS-1$
private MetamodelBrowser browser;
/**
* Default constructor.
*/
public MetamodelBrowserView() {
super();
ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
}
public void resourceChanged(IResourceChangeEvent event) {
try {
handleResourceChanged(event);
} catch (Exception e) {
CommonPlugin.log(e);
}
}
private void handleResourceChanged(IResourceChangeEvent event) {
IResourceDelta delta = event.getDelta();
if(delta == null) {
// nothing applicable
return;
}
final WorkspaceMetamodelsDelta wsDelta = new WorkspaceMetamodelsDelta();
try {
delta.accept(new IResourceDeltaVisitor() {
public boolean visit(IResourceDelta delta) throws CoreException {
if(delta.getResource().getType() == IResource.FILE && MetamodelRegistry.isMetamodelFileName(delta.getResource().getName())) {
if(delta.getKind() == IResourceDelta.ADDED) {
wsDelta.addAddition(delta.getFullPath());
} else if(delta.getKind() == IResourceDelta.REMOVED) {
wsDelta.addDeletion(delta.getFullPath());
} else if(delta.getKind() == IResourceDelta.CHANGED) {
wsDelta.addModification(delta.getFullPath());
} else if(delta.getKind() == IResourceDelta.MOVED_FROM) {
wsDelta.addMove(delta.getMovedFromPath(), delta.getMovedToPath());
}
}
return true;
}
});
} catch (CoreException e) {
CommonPlugin.log(e);
}
getSite().getShell().getDisplay().asyncExec(new Runnable() {
public void run() {
if(!browser.getControl().isDisposed()) {
if(!wsDelta.isEmpty()) {
browser.update(wsDelta);
}
}
}
});
}
public EObject navigate(EModelElement eModelElement) {
if(browser != null) {
return browser.navigate(eModelElement);
}
return null;
}
@Override
public void createPartControl(final Composite parent) {
browser = new MetamodelBrowser(parent) {
@Override
protected IServiceLocator getServiceLocator() {
//return org.eclipse.ui.PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart().getSite();
return MetamodelBrowserView.this.getSite();
}
@Override
protected IToolBarManager getToolBarManager() {
return MetamodelBrowserView.super.getViewSite().getActionBars().getToolBarManager();
}
};
getSite().setSelectionProvider(browser.getViewer());
}
@Override
public void setFocus() {
if(browser != null) {
browser.setFocus();
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public Object getAdapter(Class key) {
Object adaptedObject = browser != null ? browser.getAdapter(key) : null;
if(adaptedObject == null) {
adaptedObject = super.getAdapter(key);
}
return adaptedObject;
}
@Override
public void dispose() {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
super.dispose();
}
}