blob: 8e668a3abbaff6fb9fb239a77f56078244edcf12 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2011 Chair for Applied Software Engineering,
* Technische Universitaet Muenchen.
* 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:
******************************************************************************/
package org.eclipse.emf.ecp.emfstorebridge;
import java.util.HashMap;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecp.common.model.workSpaceModel.ECPProject;
import org.eclipse.emf.ecp.common.model.workSpaceModel.ECPWorkspace;
import org.eclipse.emf.ecp.common.model.workSpaceModel.impl.ECPWorkspaceImpl;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.emfstore.client.model.Configuration;
import org.eclipse.emf.emfstore.client.model.ModelPackage;
import org.eclipse.emf.emfstore.client.model.ProjectSpace;
import org.eclipse.emf.emfstore.client.model.Workspace;
import org.eclipse.emf.emfstore.client.model.WorkspaceManager;
import org.eclipse.emf.emfstore.common.observer.ObserverBus;
/**
* Provides an ECPWorspace for the EMFStore.
*
* @author helming
*/
public class EMFECPWorkspace extends ECPWorkspaceImpl implements ECPWorkspace {
private HashMap<ProjectSpace, EMFStoreECPProject> mapping = new HashMap<ProjectSpace, EMFStoreECPProject>();
private AdapterImpl workspaceListenerAdapter;
private Object activeProjectSpace;
/**
* default constructor.
*/
public EMFECPWorkspace() {
EList<ProjectSpace> projectSpaces = WorkspaceManager.getInstance().getCurrentWorkspace().getProjectSpaces();
for (ProjectSpace projectSpace : projectSpaces) {
EMFStoreECPProject emfStoreECPProject = new EMFStoreECPProject(projectSpace);
getProjects().add(emfStoreECPProject);
mapping.put(projectSpace, emfStoreECPProject);
}
workspaceListenerAdapter = new AdapterImpl() {
@Override
public void notifyChanged(Notification msg) {
if ((msg.getFeatureID(Workspace.class)) == ModelPackage.WORKSPACE__PROJECT_SPACES) {
if (msg.getEventType() == Notification.ADD
&& ModelPackage.eINSTANCE.getProjectSpace().isInstance(msg.getNewValue())) {
ProjectSpace projectSpace = (ProjectSpace) msg.getNewValue();
EMFStoreECPProject emfStoreECPProject = new EMFStoreECPProject(projectSpace);
getProjects().add(emfStoreECPProject);
mapping.put(projectSpace, emfStoreECPProject);
} else if (msg.getEventType() == Notification.REMOVE
&& ModelPackage.eINSTANCE.getProjectSpace().isInstance(msg.getOldValue())) {
ProjectSpace projectSpace = (ProjectSpace) msg.getOldValue();
ECPProject project = getProject(projectSpace);
project.dispose();
project.setWorkspace(null);
mapping.remove(projectSpace);
}
}
super.notifyChanged(msg);
}
};
WorkspaceManager.getInstance().getCurrentWorkspace().eAdapters().add(workspaceListenerAdapter);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.model.workSpaceModel.ECPWorkspace#getEditingDomain()
*/
@Override
public EditingDomain getEditingDomain() {
return Configuration.getEditingDomain();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.model.workSpaceModel.ECPWorkspace#getProject(org.eclipse.emf.ecore.EObject)
*/
@Override
public ECPProject getProject(EObject me) {
if (me instanceof EObject) {
try {
ProjectSpace projectSpace = WorkspaceManager.getProjectSpace(me);
return mapping.get(projectSpace);
} catch (IllegalArgumentException e) {
return null;
}
}
if (me instanceof ProjectSpace) {
return mapping.get(me);
}
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.model.workSpaceModel.ECPWorkspace#getActiveProject()
*/
@Override
public ECPProject getActiveProject() {
return mapping.get(activeProjectSpace);
}
/**
* Preliminary way to pass ObserverBus to ECP.
*
* @return observerbus
*/
public ObserverBus getObserverBus() {
return org.eclipse.emf.emfstore.client.model.WorkspaceManager.getObserverBus();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.model.workSpaceModel.ECPWorkspace#setActiveModelelement(org.eclipse.emf.ecore.EObject)
*/
@Override
public void setActiveModelelement(EObject modelelement) {
if (modelelement == null) {
return;
}
final ProjectSpace projectSpace;
if (modelelement instanceof ProjectSpace) {
projectSpace = (ProjectSpace) modelelement;
} else if (modelelement instanceof EObject) {
try {
projectSpace = org.eclipse.emf.emfstore.client.model.WorkspaceManager.getProjectSpace(modelelement);
} catch (IllegalArgumentException exception) {
return;
}
} else {
projectSpace = null;
}
if (projectSpace == null) {
// the active project space should NEVER be null
return;
}
if (activeProjectSpace != null) {
if (activeProjectSpace.equals(projectSpace)) {
return;
}
}
activeProjectSpace = projectSpace;
}
}