diff options
| author | pguilet | 2017-09-21 09:33:24 +0000 |
|---|---|---|
| committer | Pierre-Charles David | 2017-09-22 09:52:45 +0000 |
| commit | e3c03fff8ad48222145c5eabdf4828082f63f008 (patch) | |
| tree | bdc447cc71875b6b103e2d21774cfecd9573e89b | |
| parent | 75aef28f82de39f0d27a8dcf99a2cd2bfd677f45 (diff) | |
| download | org.eclipse.sirius-e3c03fff8ad48222145c5eabdf4828082f63f008.tar.gz org.eclipse.sirius-e3c03fff8ad48222145c5eabdf4828082f63f008.tar.xz org.eclipse.sirius-e3c03fff8ad48222145c5eabdf4828082f63f008.zip | |
[522620] Make aird editor viewers use LockDecorationUpdater
LockDecorationUpdater is modified to accept any tree viewer instead of
CommonNavigator to allow aird editor models viewers to be refreshed when
lock decorator are available.
TooltipAwareNavigatorDecoratingLabelProvider has been modified to allow
tooltip display of the attached label provider with this capability.
Bug: 522620
Change-Id: I3585c1359273bf6eff8bb505034b50696f83d728
Signed-off-by: pguilet <pierre.guilet@obeo.fr>
6 files changed, 85 insertions, 61 deletions
diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalSemanticModelsHandler.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalSemanticModelsHandler.java index 7892660bcf..6aaede32f4 100644 --- a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalSemanticModelsHandler.java +++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalSemanticModelsHandler.java @@ -69,6 +69,7 @@ import org.eclipse.sirius.business.api.session.SessionManager; import org.eclipse.sirius.business.api.session.SessionManagerListener; import org.eclipse.sirius.ui.editor.Messages; import org.eclipse.sirius.ui.editor.SessionEditorPlugin; +import org.eclipse.sirius.ui.tools.api.views.LockDecorationUpdater; import org.eclipse.sirius.ui.tools.api.views.common.item.ProjectDependenciesItem; import org.eclipse.sirius.ui.tools.api.wizards.CreateEMFModelWizard; import org.eclipse.sirius.ui.tools.internal.actions.analysis.AddModelDependencyAction; @@ -232,6 +233,14 @@ public class GraphicalSemanticModelsHandler implements SessionListener, SessionM private IWorkbenchSite site; /** + * The updater in charge of refresh this view according to lock + * notifications send to + * {@link org.eclipse.sirius.ecore.extender.business.api.permission.IAuthorityListener} + * . + */ + private LockDecorationUpdater lockDecorationUpdater; + + /** * Initialize the component with the given session. * * @param theSession @@ -282,6 +291,8 @@ public class GraphicalSemanticModelsHandler implements SessionListener, SessionM resourceSetListenerChangeListener = new ResourceSetListenerChangeListener(); session.getTransactionalEditingDomain().addResourceSetListener(resourceSetListenerChangeListener); + lockDecorationUpdater = new LockDecorationUpdater(); + lockDecorationUpdater.register(treeViewer); } /** @@ -950,7 +961,10 @@ public class GraphicalSemanticModelsHandler implements SessionListener, SessionM } toolkit = null; ecoreActionsHandler = null; - + if (lockDecorationUpdater != null) { + lockDecorationUpdater.unregister(); + lockDecorationUpdater = null; + } } @Override diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/api/views/LockDecorationUpdater.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/api/views/LockDecorationUpdater.java index 34e1719644..0776673967 100644 --- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/api/views/LockDecorationUpdater.java +++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/api/views/LockDecorationUpdater.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2015 THALES GLOBAL SERVICES. + * Copyright (c) 2015, 2017 THALES GLOBAL SERVICES. * 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 @@ -13,50 +13,44 @@ package org.eclipse.sirius.ui.tools.api.views; import java.util.Collection; import org.eclipse.emf.ecore.EObject; +import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.sirius.ecore.extender.business.api.permission.IAuthorityListener; import org.eclipse.sirius.ui.tools.internal.views.modelexplorer.PermissionAuthoritySessionManagerListener; -import org.eclipse.ui.navigator.CommonNavigator; +import org.eclipse.ui.navigator.CommonViewer; import com.google.common.collect.Lists; import com.google.common.collect.Sets; /** - * This class is an helper to refresh lock decoration on a - * {@link CommonNavigator} according to the notifications send to + * This class is an helper to refresh lock decoration on a {@link CommonViewer} according to the notifications send to * {@link IAuthorityListener}.<BR> - * It adds an {@link IAuthorityListener} on each opened - * {@link org.eclipse.sirius.business.api.session.Session} when calling - * {@link #register(CommonNavigator)}. A - * {@link org.eclipse.sirius.business.api.session.SessionManagerListener} is - * also added for future Session. This {@link IAuthorityListener} refreshes the - * {@link CommonNavigator} when notifications are received. This refresh is - * called in a job to avoid deadlock.<BR> - * The {@link IAuthorityListener} and the SessionManagerListener are removed - * when calling {@link #unregister()}.<BR> + * It adds an {@link IAuthorityListener} on each opened {@link org.eclipse.sirius.business.api.session.Session} when + * calling {@link #register(CommonViewer)}. A {@link org.eclipse.sirius.business.api.session.SessionManagerListener} is + * also added for future Session. This {@link IAuthorityListener} refreshes the {@link CommonViewer} when notifications + * are received. This refresh is called in a job to avoid deadlock.<BR> + * The {@link IAuthorityListener} and the SessionManagerListener are removed when calling {@link #unregister()}.<BR> * - * To use this class on your own {@link CommonNavigator}, create a new instance - * of it. The call {@link #register(CommonNavigator)} during the - * {@link CommonNavigator#init(org.eclipse.ui.IViewSite)} method and call - * {@link #unregister()} during the {@link CommonNavigator#dispose()} method. + * To use this class on your own {@link CommonViewer}, create a new instance of it. Then call + * {@link #register(CommonViewer)} during the tree viewer owner graphic component initialization and call + * {@link #unregister()} during the dispose() method. * * @author <a href="mailto:laurent.redor@obeo.fr">Laurent Redor</a> */ public class LockDecorationUpdater implements IAuthorityListener { /** - * The refresh job used to refresh the CommonNavigator. + * The refresh job used to refresh the CommonViewer. */ private RefreshLabelImageJob refreshJob; /** - * The CommonNavigator to refresh. + * The {@link CommonViewer} to refresh. */ - private CommonNavigator commonNavigator; + private TreeViewer commonViewer; /** - * The SessionManagerListener in charge of adding authorityListener on new - * sessions and remove it for removed sessions. It is added to the listeners - * list only during {@link #register(CommonNavigator)} method. + * The SessionManagerListener in charge of adding authorityListener on new sessions and remove it for removed + * sessions. It is added to the listeners list only during {@link #register(CommonViewer)} method. */ private PermissionAuthoritySessionManagerListener permissionAuthoritySessionManagerListener = new PermissionAuthoritySessionManagerListener(); @@ -67,55 +61,53 @@ public class LockDecorationUpdater implements IAuthorityListener { } /** - * Register the <code>commonNavigator</code> to be refreshed when - * notifications are send to {@link IAuthorityListener}. + * Register the <code>commonViewer</code> to be refreshed when notifications are send to {@link IAuthorityListener}. * - * @param commonNavigatorToRefresh - * The {@link CommonNavigator} to refresh + * @param commonViewerToRefresh + * The {@link CommonViewer} to refresh */ - public void register(CommonNavigator commonNavigatorToRefresh) { - this.commonNavigator = commonNavigatorToRefresh; + public void register(TreeViewer commonViewerToRefresh) { + this.commonViewer = commonViewerToRefresh; permissionAuthoritySessionManagerListener.register(this); } /** - * Unregistrer the <code>commonNavigator</code>. It is no longer refreshed - * when notifications are send to {@link IAuthorityListener}. + * Unregistrer the <code>CommonViewer</code>. It is no longer refreshed when notifications are send to + * {@link IAuthorityListener}. */ public void unregister() { permissionAuthoritySessionManagerListener.unregister(); - this.commonNavigator = null; + this.commonViewer = null; this.refreshJob = null; } @Override public void notifyIsLocked(EObject instance) { - launchRefreshModelExplorerViewJob(Lists.newArrayList(instance)); + launchRefreshViewerJob(Lists.newArrayList(instance)); } @Override public void notifyIsReleased(EObject instance) { - launchRefreshModelExplorerViewJob(Lists.newArrayList(instance)); + launchRefreshViewerJob(Lists.newArrayList(instance)); } @Override public void notifyIsLocked(Collection<EObject> instances) { - launchRefreshModelExplorerViewJob(instances); + launchRefreshViewerJob(instances); } @Override public void notifyIsReleased(Collection<EObject> instances) { - launchRefreshModelExplorerViewJob(instances); + launchRefreshViewerJob(instances); } /** - * Updates the decorations inside the Model Explorer View if exists for the - * given lock/unlocked elements. + * Updates the decorations inside the Model Explorer View if exists for the given lock/unlocked elements. * * @param elements * the lock/unlocked element to refresh */ - protected void launchRefreshModelExplorerViewJob(Collection<EObject> elements) { + protected void launchRefreshViewerJob(Collection<EObject> elements) { // Step 1 : collect new elements to refresh final Collection<Object> toRefresh = Sets.newLinkedHashSet(); toRefresh.addAll(elements); @@ -126,7 +118,7 @@ public class LockDecorationUpdater implements IAuthorityListener { toRefresh.addAll(refreshJob.getElementsToRefresh()); refreshJob.cancel(); } - refreshJob = new RefreshLabelImageJob(commonNavigator, toRefresh); + refreshJob = new RefreshLabelImageJob(commonViewer, toRefresh); refreshJob.schedule(RefreshLabelImageJob.REFRESH_JOB_DELAY); } } diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/api/views/RefreshLabelImageJob.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/api/views/RefreshLabelImageJob.java index cb9dc36e52..13719e5e67 100644 --- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/api/views/RefreshLabelImageJob.java +++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/api/views/RefreshLabelImageJob.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2015 THALES GLOBAL SERVICES and others. + * Copyright (c) 2015, 2017 THALES GLOBAL SERVICES 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 @@ -17,14 +17,13 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.IBasicPropertyConstants; +import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.sirius.viewpoint.provider.Messages; -import org.eclipse.ui.navigator.CommonNavigator; import org.eclipse.ui.navigator.CommonViewer; import org.eclipse.ui.progress.UIJob; /** - * A {@link UIJob} to refresh the image of the label in a - * {@link CommonNavigator}. + * A {@link UIJob} to refresh the image of the label in a {@link CommonViewer}. * * @author <a href="mailto:esteban.dugueperoux@obeo.fr">Esteban Dugueperoux</a> */ @@ -34,32 +33,30 @@ public class RefreshLabelImageJob extends UIJob { public static final String FAMILY = RefreshLabelImageJob.class.getName(); /** - * The delay before really launching the job. Avoid to launch several job - * consecutively instead of one. + * The delay before really launching the job. Avoid to launch several job consecutively instead of one. */ public static final long REFRESH_JOB_DELAY = 200; /** - * The properties of the refresh performed on the Model Explorer View: we - * only update image. + * The properties of the refresh performed on the tree viewer: we only update image. */ private final String[] refreshProperties = new String[] { IBasicPropertyConstants.P_IMAGE }; private Collection<Object> elementsToRefresh = Collections.emptySet(); - private CommonNavigator view; + private TreeViewer commonViewer; /** * Default constructor. * - * @param view - * the view to refresh + * @param commonViewer + * the viewer to refresh * @param elementsToRefresh * the element for which refresh TreeItem in the Model explorer */ - public RefreshLabelImageJob(CommonNavigator view, Collection<Object> elementsToRefresh) { + public RefreshLabelImageJob(TreeViewer commonViewer, Collection<Object> elementsToRefresh) { super(Messages.RefreshLabelImageJob_name); - this.view = view; + this.commonViewer = commonViewer; this.elementsToRefresh = elementsToRefresh; } @@ -70,11 +67,10 @@ public class RefreshLabelImageJob extends UIJob { */ @Override public IStatus runInUIThread(IProgressMonitor monitor) { - if (view.getCommonViewer() != null) { + if (commonViewer != null) { if (elementsToRefresh == null || elementsToRefresh.isEmpty()) { - view.getCommonViewer().refresh(); + commonViewer.refresh(); } else { - CommonViewer commonViewer = view.getCommonViewer(); commonViewer.update(elementsToRefresh.toArray(), refreshProperties); } } diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/graphicalcomponents/GraphicalRepresentationHandler.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/graphicalcomponents/GraphicalRepresentationHandler.java index 897fe0d854..868be129a4 100644 --- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/graphicalcomponents/GraphicalRepresentationHandler.java +++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/graphicalcomponents/GraphicalRepresentationHandler.java @@ -52,6 +52,7 @@ import org.eclipse.sirius.business.api.session.SessionListener; import org.eclipse.sirius.business.api.session.SessionManager; import org.eclipse.sirius.business.api.session.SessionManagerListener; import org.eclipse.sirius.common.ui.tools.api.util.SWTUtil; +import org.eclipse.sirius.ui.tools.api.views.LockDecorationUpdater; import org.eclipse.sirius.ui.tools.api.views.common.item.RepresentationDescriptionItem; import org.eclipse.sirius.ui.tools.api.views.common.item.ViewpointItem; import org.eclipse.sirius.ui.tools.internal.viewpoint.ViewpointHelper; @@ -66,6 +67,7 @@ import org.eclipse.sirius.ui.tools.internal.views.common.navigator.SiriusCommonC import org.eclipse.sirius.ui.tools.internal.views.common.navigator.sorter.CommonItemSorter; import org.eclipse.sirius.ui.tools.internal.views.modelexplorer.DeleteActionHandler; import org.eclipse.sirius.ui.tools.internal.views.modelexplorer.RenameActionHandler; +import org.eclipse.sirius.ui.tools.internal.views.modelexplorer.TooltipAwareNavigatorDecoratingLabelProvider; import org.eclipse.sirius.ui.tools.internal.wizards.CreateRepresentationWizard; import org.eclipse.sirius.ui.tools.internal.wizards.pages.SiriusRepresentationWithInactiveStatusLabelProvider; import org.eclipse.sirius.viewpoint.DAnalysis; @@ -330,6 +332,12 @@ public class GraphicalRepresentationHandler implements SessionManagerListener { private RefreshViewerOnChangeResourceSetListener refreshViewerOnChangeResourceSetListener; /** + * The updater in charge of refresh this view according to lock notifications send to + * {@link org.eclipse.sirius.ecore.extender.business.api.permission.IAuthorityListener} . + */ + private LockDecorationUpdater lockDecorationUpdater; + + /** * This builder allow to build the graphical componant handling viewpoint and representation with wanted optional * functionalities available. * @@ -783,7 +791,7 @@ public class GraphicalRepresentationHandler implements SessionManagerListener { if (labelProvider != null) { treeViewer.setLabelProvider(labelProvider); } else { - treeViewer.setLabelProvider(new SiriusRepresentationWithInactiveStatusLabelProvider()); + treeViewer.setLabelProvider(new TooltipAwareNavigatorDecoratingLabelProvider(new SiriusRepresentationWithInactiveStatusLabelProvider())); } treeViewer.setSorter(new CommonItemSorter()); @@ -817,6 +825,9 @@ public class GraphicalRepresentationHandler implements SessionManagerListener { } }); } + + lockDecorationUpdater = new LockDecorationUpdater(); + lockDecorationUpdater.register(treeViewer); return treeViewer; } @@ -1026,6 +1037,10 @@ public class GraphicalRepresentationHandler implements SessionManagerListener { siriusCommonContentProvider = null; menuManager = null; toolkit = null; + if (lockDecorationUpdater != null) { + lockDecorationUpdater.unregister(); + lockDecorationUpdater = null; + } } @Override diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/modelexplorer/ModelExplorerView.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/modelexplorer/ModelExplorerView.java index 26a68e87e3..4d9c229b2c 100644 --- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/modelexplorer/ModelExplorerView.java +++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/modelexplorer/ModelExplorerView.java @@ -251,7 +251,6 @@ public class ModelExplorerView extends CommonNavigator implements IModelExplorer tab.init(site); } } - lockDecorationUpdater.register(this); } /** @@ -343,6 +342,9 @@ public class ModelExplorerView extends CommonNavigator implements IModelExplorer gridData3.grabExcessVerticalSpace = true; commonfilteredTree.setLayoutData(gridData3); + + lockDecorationUpdater.register(commonfilteredTree.getViewer()); + /* Set model viewer providers */ return commonfilteredTree.getViewer(); } diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/modelexplorer/TooltipAwareNavigatorDecoratingLabelProvider.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/modelexplorer/TooltipAwareNavigatorDecoratingLabelProvider.java index 80af46b05d..98b9a66d82 100644 --- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/modelexplorer/TooltipAwareNavigatorDecoratingLabelProvider.java +++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/modelexplorer/TooltipAwareNavigatorDecoratingLabelProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2015 Obeo. + * Copyright (c) 2015, 2017 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 @@ -12,7 +12,7 @@ package org.eclipse.sirius.ui.tools.internal.views.modelexplorer; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.sirius.ext.jface.viewers.IToolTipProvider; +import org.eclipse.jface.viewers.IToolTipProvider; import org.eclipse.ui.internal.navigator.NavigatorDecoratingLabelProvider; /** @@ -23,6 +23,8 @@ import org.eclipse.ui.internal.navigator.NavigatorDecoratingLabelProvider; @SuppressWarnings("restriction") public class TooltipAwareNavigatorDecoratingLabelProvider extends NavigatorDecoratingLabelProvider { + private ILabelProvider commonLabelProvider; + /** * Default constructor. * @@ -31,6 +33,7 @@ public class TooltipAwareNavigatorDecoratingLabelProvider extends NavigatorDecor */ public TooltipAwareNavigatorDecoratingLabelProvider(ILabelProvider commonLabelProvider) { super(commonLabelProvider); + this.commonLabelProvider = commonLabelProvider; } @Override @@ -39,6 +42,8 @@ public class TooltipAwareNavigatorDecoratingLabelProvider extends NavigatorDecor IToolTipProvider tooltipProvider = Platform.getAdapterManager().getAdapter(element, IToolTipProvider.class); if (tooltipProvider != null) { tooltip = tooltipProvider.getToolTipText(element); + } else if (commonLabelProvider instanceof IToolTipProvider) { + tooltip = ((IToolTipProvider) commonLabelProvider).getToolTipText(element); } return tooltip; } |
