From 7157af1837d5de1f02a72ce1eacc320ea97760e7 Wed, 8 Feb 2012 10:47:09 +0100 From: Cedric Notot Date: Wed, 8 Feb 2012 10:35:33 +0100 Subject: [PATCH] patch for selection integration diff --git a/r4e/org.eclipse.mylyn.reviews.r4e.core/model/org.eclipse.mylyn.reviews.r4e.core.model.ecore b/r4e/org.eclipse.mylyn.reviews.r4e.core/model/org.eclipse.mylyn.reviews.r4e.core.model.ecore index 1d3479d..6c7ebb7 100644 --- a/r4e/org.eclipse.mylyn.reviews.r4e.core/model/org.eclipse.mylyn.reviews.r4e.core.model.ecore +++ b/r4e/org.eclipse.mylyn.reviews.r4e.core/model/org.eclipse.mylyn.reviews.r4e.core.model.ecore @@ -307,4 +307,9 @@ eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> + + + + diff --git a/r4e/org.eclipse.mylyn.reviews.r4e.core/src/org/eclipse/mylyn/reviews/r4e/core/model/impl/RModelFactoryImpl.java b/r4e/org.eclipse.mylyn.reviews.r4e.core/src/org/eclipse/mylyn/reviews/r4e/core/model/impl/RModelFactoryImpl.java index a2967bc..ea787c1 100644 --- a/r4e/org.eclipse.mylyn.reviews.r4e.core/src/org/eclipse/mylyn/reviews/r4e/core/model/impl/RModelFactoryImpl.java +++ b/r4e/org.eclipse.mylyn.reviews.r4e.core/src/org/eclipse/mylyn/reviews/r4e/core/model/impl/RModelFactoryImpl.java @@ -26,6 +26,7 @@ import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.impl.EFactoryImpl; import org.eclipse.emf.ecore.plugin.EcorePlugin; +import org.eclipse.mylyn.reviews.r4e.core.model.*; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.mylyn.reviews.r4e.core.model.R4EAnomaly; import org.eclipse.mylyn.reviews.r4e.core.model.R4EAnomalyState; @@ -44,6 +45,7 @@ import org.eclipse.mylyn.reviews.r4e.core.model.R4EIDComponent; import org.eclipse.mylyn.reviews.r4e.core.model.R4EItem; import org.eclipse.mylyn.reviews.r4e.core.model.R4EMeetingData; +import org.eclipse.mylyn.reviews.r4e.core.model.R4EModelPosition; import org.eclipse.mylyn.reviews.r4e.core.model.R4EParticipant; import org.eclipse.mylyn.reviews.r4e.core.model.R4EPosition; import org.eclipse.mylyn.reviews.r4e.core.model.R4EReview; @@ -1275,4 +1277,12 @@ return factoryExtension.copyR4EReview(origGroup, destGroup, origReviewName, destReviewName); } + /* (non-Javadoc) + * @see org.eclipse.mylyn.reviews.r4e.core.model.serial.Persistence.UserItemResFactory#createR4EModelPosition(org.eclipse.mylyn.reviews.r4e.core.model.R4EContent) + */ + public R4EModelPosition createR4EModelPosition(R4EContent content) + throws ResourceHandlingException { + return factoryExtension.createR4EModelPosition(content); + } + } //RModelFactoryImpl diff --git a/r4e/org.eclipse.mylyn.reviews.r4e.core/src/org/eclipse/mylyn/reviews/r4e/core/model/serial/Persistence.java b/r4e/org.eclipse.mylyn.reviews.r4e.core/src/org/eclipse/mylyn/reviews/r4e/core/model/serial/Persistence.java index eff5630..e483f17 100644 --- a/r4e/org.eclipse.mylyn.reviews.r4e.core/src/org/eclipse/mylyn/reviews/r4e/core/model/serial/Persistence.java +++ b/r4e/org.eclipse.mylyn.reviews.r4e.core/src/org/eclipse/mylyn/reviews/r4e/core/model/serial/Persistence.java @@ -31,6 +31,7 @@ import org.eclipse.mylyn.reviews.r4e.core.model.R4EFormalReview; import org.eclipse.mylyn.reviews.r4e.core.model.R4EItem; import org.eclipse.mylyn.reviews.r4e.core.model.R4EMeetingData; +import org.eclipse.mylyn.reviews.r4e.core.model.R4EModelPosition; import org.eclipse.mylyn.reviews.r4e.core.model.R4EParticipant; import org.eclipse.mylyn.reviews.r4e.core.model.R4EReview; import org.eclipse.mylyn.reviews.r4e.core.model.R4EReviewGroup; @@ -268,6 +269,13 @@ * @throws ResourceHandlingException */ public R4ETextPosition createR4ETextPosition(R4ETextContent content) throws ResourceHandlingException; + + /** + * @param content + * @return + * @throws ResourceHandlingException + */ + public R4EModelPosition createR4EModelPosition(R4EContent content) throws ResourceHandlingException; } diff --git a/r4e/org.eclipse.mylyn.reviews.r4e.core/src/org/eclipse/mylyn/reviews/r4e/core/model/serial/impl/RModelFactoryExtImpl.java b/r4e/org.eclipse.mylyn.reviews.r4e.core/src/org/eclipse/mylyn/reviews/r4e/core/model/serial/impl/RModelFactoryExtImpl.java index 8c6508f..9b7da21 100644 --- a/r4e/org.eclipse.mylyn.reviews.r4e.core/src/org/eclipse/mylyn/reviews/r4e/core/model/serial/impl/RModelFactoryExtImpl.java +++ b/r4e/org.eclipse.mylyn.reviews.r4e.core/src/org/eclipse/mylyn/reviews/r4e/core/model/serial/impl/RModelFactoryExtImpl.java @@ -40,6 +40,7 @@ import org.eclipse.mylyn.reviews.r4e.core.model.R4EIDComponent; import org.eclipse.mylyn.reviews.r4e.core.model.R4EItem; import org.eclipse.mylyn.reviews.r4e.core.model.R4EMeetingData; +import org.eclipse.mylyn.reviews.r4e.core.model.R4EModelPosition; import org.eclipse.mylyn.reviews.r4e.core.model.R4EParticipant; import org.eclipse.mylyn.reviews.r4e.core.model.R4EReview; import org.eclipse.mylyn.reviews.r4e.core.model.R4EReviewGroup; @@ -1572,4 +1573,22 @@ return null; } + public R4EModelPosition createR4EModelPosition(R4EContent content) throws ResourceHandlingException { + R4EModelPosition modelPosition = null; + if (!(isAssociatedToResource(content))) { + StringBuilder sb = new StringBuilder( + "Can not create a ModelLocation from a Content not associated to a Resource"); + throw new ResourceHandlingException(sb.toString()); + } + + modelPosition = RModelFactoryExt.eINSTANCE.createR4EModelPosition(); + content.setLocation(modelPosition); + + // Associate to resource and save + content.eResource().getContents().add(modelPosition); + fWriter.saveResource(modelPosition.eResource()); + + return modelPosition; + } + } diff --git a/r4e/org.eclipse.mylyn.reviews.r4e.ui/META-INF/MANIFEST.MF b/r4e/org.eclipse.mylyn.reviews.r4e.ui/META-INF/MANIFEST.MF index 0126d63..0718403 100644 --- a/r4e/org.eclipse.mylyn.reviews.r4e.ui/META-INF/MANIFEST.MF +++ b/r4e/org.eclipse.mylyn.reviews.r4e.ui/META-INF/MANIFEST.MF @@ -25,7 +25,10 @@ org.eclipse.mylyn.versions.ui;bundle-version="0.8.0", org.eclipse.mylyn.reviews.ldap;bundle-version="0.2.0";resolution:=optional, org.eclipse.mylyn.reviews.notifications;bundle-version="0.8.0", - org.eclipse.mylyn.reviews.r4e.report;bundle-version="0.9.0";resolution:=optional + org.eclipse.mylyn.reviews.r4e.report;bundle-version="0.9.0";resolution:=optional, + org.eclipse.emf.compare;bundle-version="1.3.0", + org.eclipse.emf.compare.diagram;bundle-version="1.3.0", + org.eclipse.emf.compare.ui;bundle-version="1.3.0" Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-Vendor: %providerName diff --git a/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/commands/FindReviewItemsHandler.java b/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/commands/FindReviewItemsHandler.java index cf28a2f..60eb906 100644 --- a/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/commands/FindReviewItemsHandler.java +++ b/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/commands/FindReviewItemsHandler.java @@ -19,11 +19,18 @@ package org.eclipse.mylyn.reviews.r4e.ui.internal.commands; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.List; +import org.eclipse.compare.IStreamContentAccessor; +import org.eclipse.compare.ITypedElement; import org.eclipse.compare.rangedifferencer.RangeDifference; +import org.eclipse.compare.structuremergeviewer.ICompareInput; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; @@ -33,8 +40,21 @@ import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.compare.diff.metamodel.ComparisonResourceSetSnapshot; +import org.eclipse.emf.compare.diff.metamodel.ComparisonResourceSnapshot; +import org.eclipse.emf.compare.diff.metamodel.ComparisonSnapshot; +import org.eclipse.emf.compare.diff.metamodel.DiffElement; +import org.eclipse.emf.compare.diff.metamodel.DiffModel; +import org.eclipse.emf.compare.diff.metamodel.DiffResourceSet; +import org.eclipse.emf.compare.ui.ModelCompareInput; +import org.eclipse.emf.compare.ui.internal.ModelComparator; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; @@ -61,9 +81,9 @@ import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIDeltaContainer; import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIFileContext; import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIModelController; +import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIModelPosition; import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIReviewBasic; import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIReviewItem; -import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUITextPosition; import org.eclipse.mylyn.reviews.r4e.ui.internal.preferences.PreferenceConstants; import org.eclipse.mylyn.reviews.r4e.ui.internal.utils.CommandUtils; import org.eclipse.mylyn.reviews.r4e.ui.internal.utils.Diff; @@ -280,7 +300,7 @@ R4EUIConstants.DELTAS_LABEL); uiFileContext.addChildren(deltaContainer); } - deltaContainer.createDelta((R4EUITextPosition) position); + deltaContainer.createDelta(position); } } catch (OutOfSyncException e) { R4EUIPlugin.Ftracer.traceError("Exception: " + e.toString() + " (" @@ -331,6 +351,16 @@ } } + private Object retrieveInputFromSnapshot(final ComparisonSnapshot comparisonResult) { + Object retrievedInput = null; + if (comparisonResult instanceof ComparisonResourceSnapshot) { + retrievedInput = ((ComparisonResourceSnapshot) comparisonResult).getDiff(); + } else { + retrievedInput = ((ComparisonResourceSetSnapshot) comparisonResult).getDiffResourceSet(); + } + return retrievedInput; + } + /** * Method updateFilesWithDeltas. * @@ -344,22 +374,100 @@ final R4ECompareEditorInput input = CommandUtils.createCompareEditorInput(aFile.getBase(), aFile.getTarget()); input.prepareCompareInputNoEditor(); - final DiffUtils diffUtils = new DiffUtils(); - final List diffs; - - diffs = diffUtils.doDiff(false, true, input); - - //Add Deltas from the list of differences - for (Diff diff : diffs) { - IR4EUIPosition position = CommandUtils.getPosition(diff.getPosition(R4EUIConstants.LEFT_CONTRIBUTOR) - .getOffset(), diff.getPosition(R4EUIConstants.LEFT_CONTRIBUTOR).getLength(), - diff.getDocument(R4EUIConstants.LEFT_CONTRIBUTOR)); - - if (null == position || RangeDifference.NOCHANGE == diff.getKind()) { - continue; //Cannot resolve position for this delta or no change + if (isModelResource(input)) { + // Model part + try { + input.run(new NullProgressMonitor()); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); } - aFile.getPositions().add(position); + Object diffModel = null; + // Model + final ModelComparator comparator; + Object in = input.getCompareResult(); + if (in instanceof ICompareInput) { + comparator = ModelComparator.getComparator(input.getCompareConfiguration(), (ICompareInput) in); + } else { + comparator = ModelComparator.getComparator(input.getCompareConfiguration()); + } + + ComparisonSnapshot snapshot = null; + if (in instanceof ModelCompareInput) { + snapshot = ((ModelCompareInput) in).getComparisonSnapshot(); + } else if (in instanceof ComparisonSnapshot) { + snapshot = (ComparisonSnapshot) in; + } + + if (snapshot instanceof ComparisonResourceSnapshot) { + diffModel = ((ComparisonResourceSnapshot) snapshot).getDiff(); + } else if (snapshot instanceof ComparisonResourceSetSnapshot) { + diffModel = ((ComparisonResourceSetSnapshot) snapshot).getDiffResourceSet(); + } else if (comparator.getComparisonResult() != null) { + diffModel = retrieveInputFromSnapshot(comparator.getComparisonResult()); + } else if (in instanceof ModelCompareInput) { + diffModel = ((ModelCompareInput) in).getDiff(); + } else if (in instanceof ICompareInput) { + comparator.loadResources((ICompareInput) in); + diffModel = retrieveInputFromSnapshot(comparator.compareSilentlyInThreadUI(input.getCompareConfiguration())); + } + + if (diffModel instanceof DiffModel) { + for (DiffElement adiff : ((DiffModel) diffModel).getDifferences()) { + R4EUIModelPosition position = CommandUtils.getPosition(adiff); + aFile.getPositions().add(position); + } + } else if (diffModel instanceof DiffResourceSet) { + Iterator it = ((DiffResourceSet) diffModel).getDiffModels().iterator(); + //Add Deltas from the list of differences + while (it.hasNext()) { + DiffModel currentDiffModel = it.next(); + for (DiffElement adiff : currentDiffModel.getDifferences()) { + R4EUIModelPosition position = CommandUtils.getPosition(adiff); + aFile.getPositions().add(position); + } + } + } + + } else { + + final DiffUtils diffUtils = new DiffUtils(); + final List diffs; + + diffs = diffUtils.doDiff(false, true, input); + + //Add Deltas from the list of differences + for (Diff diff : diffs) { + IR4EUIPosition position = CommandUtils.getPosition(diff.getPosition(R4EUIConstants.LEFT_CONTRIBUTOR) + .getOffset(), diff.getPosition(R4EUIConstants.LEFT_CONTRIBUTOR).getLength(), + diff.getDocument(R4EUIConstants.LEFT_CONTRIBUTOR)); + + if (null == position || RangeDifference.NOCHANGE == diff.getKind()) { + continue; //Cannot resolve position for this delta or no change + } + aFile.getPositions().add(position); + } } + + } + + private boolean isModelResource(final R4ECompareEditorInput input) throws CoreException { + ITypedElement elt = input.getLeftElement(); + if (elt instanceof IStreamContentAccessor) { + InputStream is = ((IStreamContentAccessor) elt).getContents(); + ResourceSet resourceSet = new ResourceSetImpl(); + Resource resource = resourceSet.createResource(URI.createURI("test.resource.type")); + try { + resource.load(is, Collections.EMPTY_MAP); + resource.unload(); + return true; + } catch (IOException e) { + } + } + return false; } /** diff --git a/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/editors/EditorProxy.java b/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/editors/EditorProxy.java index da6e81d..41e02f8 100644 --- a/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/editors/EditorProxy.java +++ b/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/editors/EditorProxy.java @@ -214,7 +214,7 @@ aPage.activate(editor); //Simply provide focus to editor //Go to the correct element in the compare editor - UIUtils.selectElementInEditor((R4ECompareEditorInput) editor.getEditorInput()); + UIUtils.selectElementInEditor(editor); } else { input = CommandUtils.createCompareEditorInput(aBaseFileVersion, aTargetFileVersion); input.setTitle(R4E_COMPARE_EDITOR_TITLE); // Adjust the compare title diff --git a/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/editors/R4ECompareEditorInput.java b/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/editors/R4ECompareEditorInput.java index 4089f10..88a5c12 100644 --- a/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/editors/R4ECompareEditorInput.java +++ b/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/editors/R4ECompareEditorInput.java @@ -33,6 +33,9 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.team.ui.synchronize.SaveableCompareEditorInput; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PlatformUI; /** * @author lmcdubo @@ -282,8 +285,17 @@ public Control createContents(Composite aParent) { final Control control = super.createContents(aParent); - //Go to the correct element in the compare editor - UIUtils.selectElementInEditor(this); + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + if (page != null) { + IEditorPart editor = page.findEditor(this); + if (editor != null) { + UIUtils.selectElementInEditor(editor); + } + } else { + //Go to the correct element in the compare editor + UIUtils.selectElementInEditor(this); + } + return control; } } diff --git a/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/model/R4EUIDeltaContainer.java b/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/model/R4EUIDeltaContainer.java index 5e1a3ec..f4c25a3 100644 --- a/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/model/R4EUIDeltaContainer.java +++ b/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/model/R4EUIDeltaContainer.java @@ -20,8 +20,9 @@ import org.eclipse.emf.common.util.EList; import org.eclipse.mylyn.reviews.r4e.core.model.R4EDelta; +import org.eclipse.mylyn.reviews.r4e.core.model.R4EModelPosition; import org.eclipse.mylyn.reviews.r4e.core.model.R4EParticipant; -import org.eclipse.mylyn.reviews.r4e.core.model.R4ETextPosition; +import org.eclipse.mylyn.reviews.r4e.core.model.R4EPosition; import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.OutOfSyncException; import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.ResourceHandlingException; import org.eclipse.mylyn.reviews.r4e.ui.R4EUIPlugin; @@ -73,12 +74,19 @@ * @throws ResourceHandlingException * @throws OutOfSyncException */ - public R4EUIDelta createDelta(R4EUITextPosition aUiPosition) throws ResourceHandlingException, OutOfSyncException { + public R4EUIDelta createDelta(IR4EUIPosition aUiPosition) throws ResourceHandlingException, OutOfSyncException { //Create and set content model element final R4EDelta delta = R4EUIModelController.FModelExt.createR4EDelta(((R4EUIFileContext) getParent()).getFileContext()); - final R4ETextPosition position = R4EUIModelController.FModelExt.createR4ETextPosition(R4EUIModelController.FModelExt.createR4ETargetTextContent(delta)); - aUiPosition.setPositionInModel(position); + + R4EPosition position = null; + if (aUiPosition instanceof R4EUITextPosition) { + position = R4EUIModelController.FModelExt.createR4ETextPosition(R4EUIModelController.FModelExt.createR4ETargetTextContent(delta)); + aUiPosition.setPositionInModel(position); + } else if (aUiPosition instanceof R4EUIModelPosition) { + position = R4EUIModelController.FModelExt.createR4EModelPosition(R4EUIModelController.FModelExt.createR4ETargetTextContent(delta)); + aUiPosition.setPositionInModel(position); + } //Create and set UI model element final R4EUIDelta uiDelta = new R4EUIDelta(this, delta, aUiPosition); @@ -97,7 +105,7 @@ public void open() { final EList deltas = ((R4EUIFileContext) getParent()).getFileContext().getDeltas(); if (null != deltas) { - R4EUITextPosition position = null; + IR4EUIPosition uiPosition = null; R4EUIDelta newDelta = null; final int deltaSize = deltas.size(); R4EDelta delta = null; @@ -107,8 +115,13 @@ || R4EUIPlugin.getDefault() .getPreferenceStore() .getBoolean(PreferenceConstants.P_SHOW_DISABLED)) { - position = new R4EUITextPosition(deltas.get(i).getTarget().getLocation()); - newDelta = new R4EUIDelta(this, deltas.get(i), position); + R4EPosition position = deltas.get(i).getTarget().getLocation(); + if (position instanceof R4EModelPosition) { + uiPosition = new R4EUIModelPosition(position); + } else { + uiPosition = new R4EUITextPosition(position); + } + newDelta = new R4EUIDelta(this, deltas.get(i), uiPosition); addChildren(newDelta); } } diff --git a/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/model/R4EUIModelPosition.java b/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/model/R4EUIModelPosition.java new file mode 100644 index 0000000..afe348f --- /dev/null +++ b/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/model/R4EUIModelPosition.java @@ -0,0 +1,115 @@ +/******************************************************************************* + * Copyright (c) 2012 Ericsson Research Canada + * + * 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 + * + * Description: + * + * This class implements the position interface to manage text positions + * within a file under review. + * + * Contributors: + * Cedric Notot - Obeo + * + ******************************************************************************/ + +package org.eclipse.mylyn.reviews.r4e.ui.internal.model; + +import org.eclipse.emf.compare.diagram.diff.util.DiffUtil; +import org.eclipse.emf.compare.diagram.diff.util.DiffUtil.Side; +import org.eclipse.emf.compare.diff.metamodel.DiffElement; +import org.eclipse.emf.compare.util.AdapterUtils; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.mylyn.reviews.r4e.core.model.R4EContent; +import org.eclipse.mylyn.reviews.r4e.core.model.R4EModelPosition; +import org.eclipse.mylyn.reviews.r4e.core.model.R4EPosition; +import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.OutOfSyncException; +import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.ResourceHandlingException; + +/** + * @author cnotot + */ +public class R4EUIModelPosition implements IR4EUIPosition { + + // ------------------------------------------------------------------------ + // Member variables + // ------------------------------------------------------------------------ + private R4EModelPosition fPosition; + + private final String fObjectID; + + private final String fDifferenceDescription; + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + public R4EUIModelPosition(R4EPosition aModelPosition) { + fPosition = (R4EModelPosition) aModelPosition; + fObjectID = ((R4EModelPosition) aModelPosition).getObjectID(); + fDifferenceDescription = ((R4EModelPosition) aModelPosition).getDifferenceDescription(); + } + + public R4EUIModelPosition(DiffElement aDiff) { + EObject obj = DiffUtil.getElement(aDiff, Side.LEFT, EObject.class); + fObjectID = obj.eResource().getURIFragment(obj); + fDifferenceDescription = AdapterUtils.getItemProviderText(aDiff); + } + + // ------------------------------------------------------------------------ + // Methods + // ------------------------------------------------------------------------ + + // Attributes + + public String getObjectID() { + return fObjectID; + } + + /** + * Method setPositionInModel. + * + * @param aModelPosition + * R4EPosition + * @throws OutOfSyncException + * @throws ResourceHandlingException + * @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIPosition#setPositionInModel(R4EPosition) + */ + public void setPositionInModel(R4EPosition aModelPosition) throws ResourceHandlingException, OutOfSyncException { + fPosition = (R4EModelPosition) aModelPosition; + Long bookNum = R4EUIModelController.FResourceUpdater.checkOut(fPosition, R4EUIModelController.getReviewer()); + fPosition.setObjectID(fObjectID); + fPosition.setDifferenceDescription(fDifferenceDescription); + R4EUIModelController.FResourceUpdater.checkIn(bookNum); + + final R4EContent content = (R4EContent) fPosition.eContainer(); + bookNum = R4EUIModelController.FResourceUpdater.checkOut(content, R4EUIModelController.getReviewer()); + content.setInfo(((R4EContent) fPosition.eContainer()).getInfo()); + R4EUIModelController.FResourceUpdater.checkIn(bookNum); + } + + /** + * Method isSameAs. + * + * @param aPosition + * IR4EPosition + * @return boolean + * @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIPosition#isSameAs(IR4EUIPosition) + */ + public boolean isSameAs(IR4EUIPosition aPosition) { + return fObjectID.equals(((R4EModelPosition) aPosition).getObjectID()); + } + + /** + * Method toString. + * + * @return String + * @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIPosition#toString() + */ + @Override + public String toString() { + return fDifferenceDescription; + } +} diff --git a/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/utils/CommandUtils.java b/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/utils/CommandUtils.java index e066831..fe3bdca 100644 --- a/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/utils/CommandUtils.java +++ b/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/utils/CommandUtils.java @@ -36,6 +36,7 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.compare.diff.metamodel.DiffElement; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.ISourceReference; import org.eclipse.jface.dialogs.ErrorDialog; @@ -68,6 +69,7 @@ import org.eclipse.mylyn.reviews.r4e.ui.internal.editors.R4EFileTypedElement; import org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement; import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIModelController; +import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIModelPosition; import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIPostponedContainer; import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIPostponedFile; import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIReviewBasic; @@ -372,6 +374,18 @@ } /** + * Method getPosition. Get position based on a IDiffElement. + * + * @param aDiff + * IDiffElement + * @return R4EUIModelPosition + */ + public static R4EUIModelPosition getPosition(DiffElement aDiff) { + final R4EUIModelPosition position = new R4EUIModelPosition(aDiff); + return position; + } + + /** * Method getPosition. Get position for generic workspace files * * @param aSelectedElement diff --git a/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/utils/UIUtils.java b/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/utils/UIUtils.java index 9604d35..e9475a6 100644 --- a/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/utils/UIUtils.java +++ b/r4e/org.eclipse.mylyn.reviews.r4e.ui/src/org/eclipse/mylyn/reviews/r4e/ui/internal/utils/UIUtils.java @@ -23,6 +23,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.List; import java.util.StringTokenizer; @@ -36,6 +37,7 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; +import org.eclipse.emf.compare.ui.services.CompareServices; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ISelection; @@ -62,6 +64,7 @@ import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIDelta; import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIDeltaContainer; import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIModelController; +import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIModelPosition; import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIPostponedAnomaly; import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIReviewBasic; import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIReviewExtended; @@ -76,6 +79,8 @@ import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.browser.IWebBrowser; @@ -401,6 +406,32 @@ return tempStr.toString(); } + public static void selectElementInEditor(IEditorPart editor) { + + final IR4EUIModelElement element = getR4EUIElement(); + if (element instanceof R4EUIContent) { + final IR4EUIPosition position = ((R4EUIContent) element).getPosition(); + if (position instanceof R4EUIModelPosition) { + selectElementInCompareModelEditor(editor, (R4EUIModelPosition) position); + } else { + final IEditorInput aInput = editor.getEditorInput(); + selectElementInEditor((R4ECompareEditorInput) aInput); + } + } + } + + public static void selectElementInCompareModelEditor(IEditorPart editor, R4EUIModelPosition pos) { + final String id = pos.getObjectID(); + final List ids = Arrays.asList(id); + CompareServices.setSelection(ids, editor); + } + + private static IR4EUIModelElement getR4EUIElement() { + final ISelection selection = R4EUIModelController.getNavigatorView().getTreeViewer().getSelection(); + final IR4EUIModelElement element = (IR4EUIModelElement) ((IStructuredSelection) selection).getFirstElement(); + return element; + } + /** * Method selectElementInEditor. * @@ -408,9 +439,7 @@ * R4ECompareEditorInput */ public static void selectElementInEditor(R4ECompareEditorInput aInput) { - - final ISelection selection = R4EUIModelController.getNavigatorView().getTreeViewer().getSelection(); - final IR4EUIModelElement element = (IR4EUIModelElement) ((IStructuredSelection) selection).getFirstElement(); + final IR4EUIModelElement element = getR4EUIElement(); IR4EUIPosition position = null; int selectionIndex = -1;