| /* |
| * Copyright (c) 2011-2013 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: |
| * Martin Fluegge - initial API and implementation |
| * Christian W. Damus (CEA) - Bug 404184: handle View that has no element |
| */ |
| package org.eclipse.emf.cdo.dawn.gmf.synchronize; |
| |
| import org.eclipse.emf.cdo.CDOObject; |
| import org.eclipse.emf.cdo.CDOState; |
| import org.eclipse.emf.cdo.dawn.editors.IDawnEditor; |
| import org.eclipse.emf.cdo.dawn.gmf.appearance.DawnAppearancer; |
| import org.eclipse.emf.cdo.dawn.gmf.util.DawnDiagramUpdater; |
| import org.eclipse.emf.cdo.internal.dawn.bundle.OM; |
| import org.eclipse.emf.cdo.transaction.CDOTransaction; |
| import org.eclipse.emf.cdo.util.CDOUtil; |
| import org.eclipse.emf.cdo.view.CDOView; |
| |
| import org.eclipse.net4j.util.om.trace.ContextTracer; |
| |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.transaction.RecordingCommand; |
| |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor; |
| import org.eclipse.gmf.runtime.notation.View; |
| |
| /** |
| * @author Martin Fluegge |
| */ |
| public class DawnConflictHelper |
| { |
| private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, DawnConflictHelper.class); |
| |
| public static boolean handleConflictedView(CDOObject cdoObject, View view, DiagramDocumentEditor editor) |
| { |
| boolean cdoConflict = cdoObject.cdoConflict(); |
| if (cdoConflict && view != null) |
| { |
| if (TRACER.isEnabled()) |
| { |
| TRACER.format("Object ({0}) is in state conflict!", cdoObject); //$NON-NLS-1$ |
| } |
| EditPart editPart = DawnDiagramUpdater.createOrFindEditPartIfViewExists(view, editor); |
| int typeConflictLocallyDeleted = evaluateConflictType(cdoObject); |
| DawnAppearancer.setEditPartConflicted(editPart, typeConflictLocallyDeleted); |
| } |
| return cdoConflict; |
| } |
| |
| private static int evaluateConflictType(CDOObject cdoObject) |
| { |
| if (cdoObject.cdoState() == CDOState.DIRTY) |
| { |
| return DawnAppearancer.TYPE_CONFLICT_REMOTELY_AND_LOCALLY_CHANGED; |
| } |
| return DawnAppearancer.TYPE_CONFLICT_REMOTELY_DELETED; |
| } |
| |
| public static void rollback(final DiagramDocumentEditor editor) |
| { |
| CDOView view = ((IDawnEditor)editor).getView(); |
| |
| if (view != null && view instanceof CDOTransaction) |
| { |
| ((CDOTransaction)view).rollback(); |
| } |
| |
| editor.getEditingDomain().getCommandStack().execute(new RecordingCommand(editor.getEditingDomain()) |
| { |
| @Override |
| public void doExecute() |
| { |
| DawnAppearancer.setEditPartDefaultAllChildren(editor.getDiagramEditPart()); |
| DawnDiagramUpdater.refreshEditPart(editor.getDiagramEditPart()); |
| } |
| }); |
| } |
| |
| /** |
| * TODO this method should decide whether the object is conflicted or not using special Policies |
| * |
| * @param object a non-{@code null} object |
| * @return whether the object is conflicted |
| */ |
| public static boolean isConflicted(EObject object) |
| { |
| CDOObject cdoObject = CDOUtil.getCDOObject(object); |
| if (cdoObject.cdoConflict()) |
| { |
| return true; |
| } |
| if (object instanceof View) |
| { |
| // if the view is not, itself, conflicted, maybe its semantic element is (if it has one) |
| EObject element = ((View)object).getElement(); |
| if (element != null) |
| { |
| CDOObject cdoElement = CDOUtil.getCDOObject(element); |
| return cdoElement.cdoConflict(); |
| } |
| } |
| return false; |
| } |
| } |