/*
* Copyright (c) 2015, 2016 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.explorer.ui.checkouts;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.explorer.CDOExplorerUtil;
import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout;
import org.eclipse.emf.cdo.explorer.ui.bundle.OM;
import org.eclipse.emf.cdo.internal.ui.CDOEditorInputImpl;
import org.eclipse.emf.cdo.internal.ui.InteractiveConflictHandlerSelector;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.ui.CDOEditorOpener;
import org.eclipse.emf.cdo.ui.CDOEditorUtil;
import org.eclipse.emf.cdo.util.CDOURIUtil;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.internal.cdo.transaction.CDOHandlingConflictResolver;
import org.eclipse.net4j.util.om.OMPlatform;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.spi.cdo.CDOMergingConflictResolver;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
/**
* @author Eike Stepper
*/
public class CDOModelEditorOpener extends CDOEditorOpener.Default
{
private static final boolean INTERACTIVE_CONFLICT_RESOLUTION = !"false"
.equalsIgnoreCase(OMPlatform.INSTANCE.getProperty("cdo.interactive.conflict.resolution"));
public CDOModelEditorOpener()
{
}
@Override
protected IEditorPart doOpenEditor(final IWorkbenchPage page, URI uri)
{
CDOCheckout checkout = CDOExplorerUtil.getCheckout(uri);
if (checkout == null)
{
MessageDialog.openError(page.getWorkbenchWindow().getShell(), "Error", "The checkout for " + uri + " could not be found.");
return null;
}
final CDOView view = checkout.openView();
if (view instanceof CDOTransaction)
{
configureTransaction((CDOTransaction)view);
}
CDOID objectID = null;
if (uri.hasFragment())
{
CDOObject cdoObject = CDOUtil.getCDOObject(view.getResourceSet().getEObject(uri, true));
if (cdoObject != null)
{
objectID = cdoObject.cdoID();
}
}
final IEditorPart editor = openEditor(page, view, CDOURIUtil.extractResourcePath(uri), objectID);
page.addPartListener(new IPartListener()
{
public void partClosed(IWorkbenchPart part)
{
if (part == editor)
{
try
{
view.close();
}
catch (Exception ex)
{
OM.LOG.error(ex);
}
finally
{
page.removePartListener(this);
}
}
}
public void partOpened(IWorkbenchPart part)
{
// Do nothing.
}
public void partDeactivated(IWorkbenchPart part)
{
// Do nothing.
}
public void partBroughtToTop(IWorkbenchPart part)
{
// Do nothing.
}
public void partActivated(IWorkbenchPart part)
{
// Do nothing.
}
});
return editor;
}
protected void configureTransaction(CDOTransaction transaction)
{
addConflictResolver(transaction);
}
private IEditorPart openEditor(IWorkbenchPage page, CDOView view, String resourcePath, CDOID objectID)
{
try
{
String editorID = CDOEditorUtil.getEditorID();
IEditorReference[] references = CDOEditorUtil.findEditor(page, view, resourcePath);
for (IEditorReference reference : references)
{
if (editorID.equals(reference.getId()))
{
IEditorPart editor = references[0].getEditor(true);
page.activate(editor);
return editor;
}
}
IEditorInput input = CDOEditorUtil.createCDOEditorInput(view, resourcePath, false);
((CDOEditorInputImpl)input).setObjectID(objectID);
return page.openEditor(input, editorID);
}
catch (Exception ex)
{
OM.LOG.error(ex);
}
return null;
}
public static void addConflictResolver(CDOTransaction transaction)
{
if (INTERACTIVE_CONFLICT_RESOLUTION)
{
CDOHandlingConflictResolver conflictResolver = new CDOHandlingConflictResolver();
conflictResolver.setConflictHandlerSelector(new InteractiveConflictHandlerSelector());
transaction.options().addConflictResolver(conflictResolver);
}
else
{
transaction.options().addConflictResolver(new CDOMergingConflictResolver());
}
}
}