/*******************************************************************************
* Copyright (c) 2008, 2011 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.eef.runtime.context.impl;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.change.util.ChangeRecorder;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent;
import org.eclipse.emf.eef.runtime.api.notify.ResourceSetAdapter;
import org.eclipse.emf.eef.runtime.context.ExtendedPropertiesEditingContext;
import org.eclipse.emf.eef.runtime.context.PropertiesEditingContext;
import org.eclipse.emf.eef.runtime.impl.utils.EEFUtils;
import org.eclipse.emf.eef.runtime.providers.PropertiesEditingProvider;
import org.eclipse.emf.eef.runtime.ui.parts.ViewHelper;
import org.eclipse.emf.eef.runtime.ui.parts.impl.BindingViewHelper;
import org.eclipse.emf.eef.runtime.ui.widgets.settings.EEFEditorSettings;
/**
* @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a>
*/
public class EObjectPropertiesEditionContext implements ExtendedPropertiesEditingContext {
/**
* the source EditionComponent
* @since 1.1
*/
protected IPropertiesEditionComponent parentPropertiesEditionComponent;
/**
* Helper for created graphical elements of the view
*/
private ViewHelper helper;
/**
* the EObject to edit
*/
protected EObject eObject;
/**
* EEF editor settings to use.
*/
private List<EEFEditorSettings> allSettings;
/**
*
*/
protected ChangeRecorder changeRecorder;
/**
* The AdapterFactory to use in the editing context
*/
protected AdapterFactory adapterFactory;
/**
* The parent context (can be null)
*/
protected PropertiesEditingContext parentContext;
/**
* The {@link IPropertiesEditionComponent} of the context
*/
private IPropertiesEditionComponent propertiesEditingComponent;
/**
* @param parentContext
* the parent context
* @param propertiesEditionComponent
* editingComponent holding the EObject editing
* @param eObject
* eObject to edit
* @param adapterFactory
* adapterFactory to use to get editing providers
*/
public EObjectPropertiesEditionContext(PropertiesEditingContext parentContext,
IPropertiesEditionComponent propertiesEditionComponent, EObject eObject,
AdapterFactory adapterFactory) {
this.parentContext = parentContext;
this.parentPropertiesEditionComponent = propertiesEditionComponent;
this.eObject = eObject;
this.adapterFactory = adapterFactory;
this.allSettings = new ArrayList<EEFEditorSettings>();
}
/**
* @return the parentContext
*/
public PropertiesEditingContext getParentContext() {
return parentContext;
}
/**
* (non-Javadoc)
* @see org.eclipse.emf.eef.runtime.context.PropertiesEditingContext#initializeRecorder()
*/
public void initializeRecorder() {
if (this.changeRecorder == null) {
Notifier highestNotifier = EEFUtils.highestNotifier(eObject);
if (highestNotifier instanceof ResourceSet) {
this.changeRecorder = new ChangeRecorder((ResourceSet) highestNotifier);
} else if (highestNotifier instanceof Resource) {
this.changeRecorder = new ChangeRecorder((Resource) highestNotifier);
} else if (highestNotifier instanceof EObject) {
this.changeRecorder = new ChangeRecorder((EObject) highestNotifier);
}
}
if (getParentContext() != null) {
getParentContext().initializeRecorder();
}
}
/**
* @return the changeRecorder
*/
public ChangeRecorder getChangeRecorder() {
return changeRecorder;
}
/**
* {@inheritDoc}
* @see org.eclipse.emf.eef.runtime.context.PropertiesEditingContext#disposeRecorder()
*/
public void disposeRecorder() {
changeRecorder.dispose();
changeRecorder = null;
}
/**
* @return the eObject
*/
public EObject getEObject() {
return eObject;
}
/**
* @param eObject
*/
public void seteObject(EObject eObject) {
this.eObject = eObject;
}
/**
* @return the settings to use.
*/
public List<EEFEditorSettings> getAllSettings() {
return allSettings;
}
/**
* set the settings to use.
*/
public void setAllSettings(List<EEFEditorSettings> settings) {
this.allSettings = settings;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.eef.runtime.context.PropertiesEditingContext#createPropertiesEditingComponent(java.lang.String)
* @since 1.1
*/
public IPropertiesEditionComponent createPropertiesEditingComponent(String mode) {
if (propertiesEditingComponent == null) {
PropertiesEditingProvider propertiesEditionProvider = (PropertiesEditingProvider)adapterFactory
.adapt(eObject, PropertiesEditingProvider.class);
if (propertiesEditionProvider != null) {
this.propertiesEditingComponent = propertiesEditionProvider.getPropertiesEditingComponent(
this, mode);
}
}
return propertiesEditingComponent;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.eef.runtime.context.PropertiesEditingContext#createPropertiesEditingComponent(java.lang.String,
* java.lang.String)
* @since 1.1
*/
public IPropertiesEditionComponent createPropertiesEditingComponent(String mode, String part) {
if (propertiesEditingComponent == null) {
PropertiesEditingProvider propertiesEditionProvider = (PropertiesEditingProvider)adapterFactory
.adapt(eObject, PropertiesEditingProvider.class);
if (propertiesEditionProvider != null) {
this.propertiesEditingComponent = propertiesEditionProvider.getPropertiesEditingComponent(
this, mode, part);
}
}
return propertiesEditingComponent;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.eef.runtime.context.PropertiesEditingContext#createPropertiesEditingComponent(java.lang.String,
* java.lang.String, java.lang.Class)
* @since 1.1
*/
public IPropertiesEditionComponent createPropertiesEditingComponent(String mode, String part,
Class<?> refinement) {
if (propertiesEditingComponent == null) {
PropertiesEditingProvider propertiesEditionProvider = (PropertiesEditingProvider)adapterFactory
.adapt(eObject, PropertiesEditingProvider.class);
if (propertiesEditionProvider != null) {
this.propertiesEditingComponent = propertiesEditionProvider.getPropertiesEditingComponent(
this, mode, part, refinement);
}
}
return propertiesEditingComponent;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.eef.runtime.context.PropertiesEditingContext#getPropertiesEditingComponent()
* @since 1.1
*/
public IPropertiesEditionComponent getPropertiesEditingComponent() {
return propertiesEditingComponent;
}
/**
* @return the resourceSet
*/
public ResourceSet getResourceSet() {
if (eObject != null && eObject.eResource() != null && eObject.eResource().getResourceSet() != null)
return eObject.eResource().getResourceSet();
if (parentContext != null)
return parentContext.getResourceSet();
return null;
}
/**
* @return the adapterFactory
*/
public AdapterFactory getAdapterFactory() {
return adapterFactory;
}
/**
* Dispose the change recorder
*/
public void dispose() {
if (changeRecorder != null)
changeRecorder.dispose();
}
/**
* @return the {@link ViewHelper} of the context.
* @since 1.1
*/
public ViewHelper getHelper() {
if (helper == null) {
helper = new BindingViewHelper(this);
}
return helper;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.eef.runtime.context.PropertiesEditingContext#setHelper(org.eclipse.emf.eef.runtime.ui.parts.ViewHelper)
* @since 1.1
*/
public void setHelper(ViewHelper helper) {
this.helper = helper;
}
/**
* {@inheritDoc}
* @see org.eclipse.emf.eef.runtime.context.ExtendedPropertiesEditingContext#getResourceSetAdapter()
*/
public ResourceSetAdapter getResourceSetAdapter() {
ResourceSet resourceSet = getResourceSet();
for (Adapter adapter : resourceSet.eAdapters()) {
if (adapter instanceof ResourceSetAdapter) {
return (ResourceSetAdapter)adapter;
}
}
ResourceSetAdapter resourceSetAdapter = new ResourceSetAdapter(resourceSet);
resourceSetAdapter.activate();
return resourceSetAdapter;
}
/**
* {@inheritDoc}
* @see org.eclipse.emf.eef.runtime.context.ExtendedPropertiesEditingContext#canReachResourceSetAdapter()
*/
public boolean canReachResourceSetAdapter() {
return eObject != null && eObject.eResource() != null && eObject.eResource().getResourceSet() != null;
}
}