blob: 251ed7fe86e3cc87e749cc671009e187fa87960d [file] [log] [blame]
/*
* Copyright (c) 2015 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.ui;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.cdo.view.CDOViewTargetChangedEvent;
import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.ui.UIUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.spi.cdo.InternalCDOObject;
/**
* @author Eike Stepper
* @since 4.4
*/
public abstract class CDOInvalidRootAgent implements IListener
{
private static final Object EMPTY_INPUT = new Object();
private final CDOView view;
private CDOID inputID;
public CDOInvalidRootAgent(CDOView view)
{
this.view = view;
view.addListener(this);
}
public void notifyEvent(IEvent event)
{
if (event instanceof CDOViewTargetChangedEvent)
{
final CDOViewTargetChangedEvent e = (CDOViewTargetChangedEvent)event;
UIUtil.getDisplay().asyncExec(new Runnable()
{
public void run()
{
Object input = getRootFromUI();
if (inputID != null)
{
try
{
InternalCDOObject object = (InternalCDOObject)view.getObject(inputID);
if (!object.cdoInvalid())
{
setRootToUI(object.cdoInternalInstance());
inputID = null;
}
}
catch (Exception ex)
{
// Ignore
}
}
else if (input instanceof EObject)
{
CDOObject object = CDOUtil.getCDOObject((EObject)input);
if (object.cdoInvalid())
{
if (e.getBranchPoint().getTimeStamp() == e.getOldBranchPoint().getTimeStamp())
{
inputID = null;
closeUI();
}
else
{
inputID = object.cdoID();
Object emptyRoot = createEmptyRoot(object);
setRootToUI(emptyRoot);
}
}
}
}
});
}
}
public void dispose()
{
view.removeListener(this);
}
protected Object createEmptyRoot(CDOObject invalidRoot)
{
return EMPTY_INPUT;
}
protected abstract Object getRootFromUI();
protected abstract void setRootToUI(Object root);
protected void closeUI()
{
}
}