diff options
author | Axel Richard | 2013-07-08 15:54:50 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2013-07-16 09:28:43 +0000 |
commit | a503cf19c9c49133b928e59d6c06d4ad7c98d7b1 (patch) | |
tree | 99f52fb76fbba82bc089a4c2a2cf8eb92e3240b2 /plugins/org.eclipse.emf.compare.ide.ui/src | |
parent | 0c2986d1d749e55ce8dff4cf453c15af420c38e1 (diff) | |
download | org.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')
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; |