Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAxel Richard2013-07-08 15:54:50 +0000
committerGerrit Code Review @ Eclipse.org2013-07-16 09:28:43 +0000
commita503cf19c9c49133b928e59d6c06d4ad7c98d7b1 (patch)
tree99f52fb76fbba82bc089a4c2a2cf8eb92e3240b2 /plugins/org.eclipse.emf.compare.ide.ui/src
parent0c2986d1d749e55ce8dff4cf453c15af420c38e1 (diff)
downloadorg.eclipse.emf.compare-a503cf19c9c49133b928e59d6c06d4ad7c98d7b1.tar.gz
org.eclipse.emf.compare-a503cf19c9c49133b928e59d6c06d4ad7c98d7b1.tar.xz
org.eclipse.emf.compare-a503cf19c9c49133b928e59d6c06d4ad7c98d7b1.zip
[412748] EMF Compare Property View
The compare editor now display the properties of the selected item in the properties view. Bug: 412748 Change-Id: I7c207cf4f2dddd0d7b1379367111a5bf6af3c581
Diffstat (limited to 'plugins/org.eclipse.emf.compare.ide.ui/src')
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/EMFCompareIDEUIPlugin.java4
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/EMFCompareContentMergeViewer.java136
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/editor/PropertySheetAdapterFactory.java66
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java1
4 files changed, 206 insertions, 1 deletions
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/EMFCompareIDEUIPlugin.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/EMFCompareIDEUIPlugin.java
index c3df55225..ef86007f1 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/EMFCompareIDEUIPlugin.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/EMFCompareIDEUIPlugin.java
@@ -14,10 +14,12 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+import org.eclipse.compare.internal.CompareEditor;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.compare.ide.ui.internal.editor.PropertySheetAdapterFactory;
import org.eclipse.emf.compare.ide.ui.internal.logical.IModelResolverRegistry;
import org.eclipse.emf.compare.ide.ui.internal.logical.ModelResolverRegistryImpl;
import org.eclipse.emf.compare.ide.ui.internal.logical.ModelResolverRegistryListener;
@@ -72,6 +74,8 @@ public class EMFCompareIDEUIPlugin extends AbstractUIPlugin {
getLog(), modelResolverRegistry);
globalRegistry.addListener(modelResolverRegistryListener);
modelResolverRegistryListener.readRegistry(globalRegistry);
+
+ Platform.getAdapterManager().registerAdapters(new PropertySheetAdapterFactory(), CompareEditor.class);
}
/**
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/EMFCompareContentMergeViewer.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/EMFCompareContentMergeViewer.java
index 0ab47750e..2380ed34a 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/EMFCompareContentMergeViewer.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/EMFCompareContentMergeViewer.java
@@ -19,6 +19,7 @@ import java.util.Collection;
import java.util.EventObject;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.ResourceBundle;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -26,6 +27,7 @@ import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.contentmergeviewer.ContentMergeViewer;
import org.eclipse.compare.internal.CompareHandlerService;
import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CommandStackListener;
import org.eclipse.emf.compare.Comparison;
@@ -45,9 +47,17 @@ import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.ICompareColor;
import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.IMergeViewer;
import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.IMergeViewer.MergeViewerSide;
import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.item.IMergeViewerItem;
+import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.item.impl.MergeViewerItem;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.impl.CascadingDifferencesFilter;
import org.eclipse.emf.compare.utils.EMFComparePredicates;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
+import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
@@ -63,10 +73,16 @@ import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.menus.IMenuService;
+import org.eclipse.ui.part.IPage;
import org.eclipse.ui.services.IServiceLocator;
+import org.eclipse.ui.views.properties.PropertySheet;
/**
* @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
@@ -99,6 +115,12 @@ public abstract class EMFCompareContentMergeViewer extends ContentMergeViewer im
/** The list of active filters. */
private Collection<IDifferenceFilter> selectedFilters;
+ /** The compare configuration object. */
+ private CompareConfiguration configuration;
+
+ /** The AdapterFactoryContentProvider useful to fill in the property sheet page. */
+ private final AdapterFactoryContentProvider fAdapterFactoryContentProvider;
+
/**
* @param style
* @param bundle
@@ -111,7 +133,11 @@ public abstract class EMFCompareContentMergeViewer extends ContentMergeViewer im
editingDomainChange(null, getEditingDomain());
setSelectedFilters((Collection<IDifferenceFilter>)cc
.getProperty(EMFCompareConstants.SELECTED_FILTERS));
- cc.addPropertyChangeListener(this);
+ configuration = cc;
+ configuration.addPropertyChangeListener(this);
+ ComposedAdapterFactory adapterFactory = (ComposedAdapterFactory)configuration
+ .getProperty(EMFCompareConstants.COMPOSED_ADAPTER_FACTORY);
+ fAdapterFactoryContentProvider = new AdapterFactoryContentProvider(adapterFactory);
}
public void propertyChange(PropertyChangeEvent event) {
@@ -466,6 +492,7 @@ public abstract class EMFCompareContentMergeViewer extends ContentMergeViewer im
if (fSyncingSelections.compareAndSet(false, true)) { // prevents stack overflow :)
try {
ISelection selection = event.getSelection();
+ updatePropertiesView(selection);
fLeft.setSelection(selection, true);
fRight.setSelection(selection, true);
fAncestor.setSelection(selection, true);
@@ -473,6 +500,113 @@ public abstract class EMFCompareContentMergeViewer extends ContentMergeViewer im
fSyncingSelections.set(false);
}
}
+
+ }
+
+ /**
+ * Update the properties view with the given selection.
+ *
+ * @param selection
+ * the given selection.
+ */
+ private void updatePropertiesView(ISelection selection) {
+ if (selection instanceof StructuredSelection) {
+ StructuredSelection structuredSelection = (StructuredSelection)selection;
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ ExtendedPropertySheetPage propertySheetPage = getExtendedPropertySheetPage(page);
+ if (propertySheetPage != null) {
+ StructuredSelection selectionForPropertySheet = null;
+ IWorkbenchPart activePart = page.getActivePart();
+ Object firstElement = structuredSelection.getFirstElement();
+ if (firstElement instanceof MergeViewerItem) {
+ MergeViewerItem mergeViewerItem = (MergeViewerItem)firstElement;
+ MergeViewerSide side = mergeViewerItem.getSide();
+ Object newSelectedObject = mergeViewerItem.getSideValue(side);
+ propertySheetPage.setPropertySourceProvider(fAdapterFactoryContentProvider);
+ if (newSelectedObject != null) {
+ if (newSelectedObject instanceof EObject) {
+ manageReadOnly((EObject)newSelectedObject, side);
+ }
+ selectionForPropertySheet = new StructuredSelection(newSelectedObject);
+ propertySheetPage.selectionChanged(activePart, selectionForPropertySheet);
+ }
+ }
+ if (selectionForPropertySheet == null) {
+ selectionForPropertySheet = new StructuredSelection(new Object());
+ propertySheetPage.selectionChanged(activePart, selectionForPropertySheet);
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the extended property sheet page.
+ *
+ * @return the extended property sheet page.
+ */
+ private ExtendedPropertySheetPage getExtendedPropertySheetPage(IWorkbenchPage activePage) {
+ ExtendedPropertySheetPage propertyPage = null;
+ if (activePage != null) {
+ IViewPart view = activePage.findView("org.eclipse.ui.views.PropertySheet"); //$NON-NLS-1$
+ if (view != null) {
+ if (view instanceof PropertySheet) {
+ PropertySheet propertySheet = (PropertySheet)view;
+ IPage currentPage = propertySheet.getCurrentPage();
+ if (currentPage instanceof ExtendedPropertySheetPage) {
+ propertyPage = (ExtendedPropertySheetPage)currentPage;
+ } else {
+ IEditorPart activeEditor = activePage.getActiveEditor();
+ if (activeEditor != null
+ && Platform.getAdapterManager().hasAdapter(activeEditor,
+ "org.eclipse.ui.views.properties.IPropertySheetPage")) { //$NON-NLS-1$
+ propertySheet.partActivated(activePage.getActivePart());
+ }
+ }
+
+ }
+ }
+ }
+ return propertyPage;
+ }
+
+ /**
+ * Manages the read-only state of the properties sheet page for the given selected object.
+ *
+ * @param selectedObject
+ * the given selected object.
+ * @param side
+ * the side of the selected object.
+ */
+ private void manageReadOnly(EObject selectedObject, MergeViewerSide side) {
+ if (MergeViewerSide.LEFT == side) {
+ if (!configuration.isLeftEditable()) {
+ setToReadOnly(selectedObject);
+ }
+ } else if (MergeViewerSide.RIGHT == side) {
+ if (!configuration.isRightEditable()) {
+ setToReadOnly(selectedObject);
+ }
+ } else if (MergeViewerSide.ANCESTOR == side) {
+ setToReadOnly(selectedObject);
+ }
+ }
+
+ /**
+ * Sets the resource of the selected object to read-only in the appropriate editing domain.
+ *
+ * @param selectedObject
+ * the given selected object.
+ */
+ private void setToReadOnly(EObject selectedObject) {
+ EditingDomain editingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(selectedObject);
+ if (editingDomain instanceof AdapterFactoryEditingDomain) {
+ Resource r = selectedObject.eResource();
+ Map<Resource, Boolean> resourceToReadOnlyMap = ((AdapterFactoryEditingDomain)editingDomain)
+ .getResourceToReadOnlyMap();
+ if (!resourceToReadOnlyMap.containsKey(r)) {
+ resourceToReadOnlyMap.put(r, Boolean.TRUE);
+ }
+ }
}
/**
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/editor/PropertySheetAdapterFactory.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/editor/PropertySheetAdapterFactory.java
new file mode 100644
index 000000000..6d20f9887
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/editor/PropertySheetAdapterFactory.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.compare.ide.ui.internal.editor;
+
+import org.eclipse.compare.CompareConfiguration;
+import org.eclipse.compare.CompareEditorInput;
+import org.eclipse.compare.internal.CompareEditor;
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.emf.compare.rcp.ui.internal.EMFCompareConstants;
+import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+
+/**
+ * Specific Adapter factory that provides an {@link ExtendedPropertySheetPage} for the Compare Editor.
+ *
+ * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a>
+ */
+public class PropertySheetAdapterFactory implements IAdapterFactory {
+
+ /** The extended property sheet page provided by this adapter factory. */
+ private ExtendedPropertySheetPage propertySheetPage;
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(Object, Class)
+ */
+ @SuppressWarnings("rawtypes")
+ public Object getAdapter(Object adaptableObject, Class adapterType) {
+ if (adapterType == IPropertySheetPage.class) {
+ if (propertySheetPage == null) {
+ if (adaptableObject instanceof CompareEditor) {
+ IEditorInput editorInput = ((CompareEditor)adaptableObject).getEditorInput();
+ if (editorInput instanceof CompareEditorInput) {
+ propertySheetPage = new ExtendedPropertySheetPage(null);
+ CompareConfiguration configuration = ((CompareEditorInput)editorInput)
+ .getCompareConfiguration();
+ configuration.setProperty(EMFCompareConstants.PROPERTY_SHEET, propertySheetPage);
+ }
+ }
+ }
+ return propertySheetPage;
+ }
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
+ */
+ @SuppressWarnings("rawtypes")
+ public Class[] getAdapterList() {
+ return new Class[] {IPropertySheetPage.class };
+ }
+
+}
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java
index f6c9b4494..b50571d5b 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java
@@ -155,6 +155,7 @@ public class EMFCompareStructureMergeViewer extends AbstractViewerWrapper implem
fAdapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
fAdapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());
+ config.setProperty(EMFCompareConstants.COMPOSED_ADAPTER_FACTORY, fAdapterFactory);
GridLayout layout = new GridLayout(2, false);
layout.marginWidth = 0;

Back to the top