X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.utils.ui%2Fsrc%2Forg%2Fsimantics%2Futils%2Fui%2Fjface%2FBasePostSelectionProvider.java;h=c5ca0e754cada161035bbcee68289b4dc135062a;hp=b06143bf6ee23cc82574666390a0d49c3c99de4a;hb=b7250834202635a09dd18e25370ed9b4c32b1380;hpb=dfd710b04c7d7cdfab7747ba9a650b2cdc650092 diff --git a/bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/jface/BasePostSelectionProvider.java b/bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/jface/BasePostSelectionProvider.java index b06143bf6..c5ca0e754 100644 --- a/bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/jface/BasePostSelectionProvider.java +++ b/bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/jface/BasePostSelectionProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2018 Association for Decentralized Information Management + * Copyright (c) 2007, 2010 Association for Decentralized Information Management * in Industry THTH ry. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -21,6 +21,8 @@ import org.eclipse.jface.viewers.IPostSelectionProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; +import org.simantics.utils.ObjectUtils; /** * BaseSelectionProvider is a base implementation ISelectionProvider -interface. @@ -34,21 +36,40 @@ import org.eclipse.jface.viewers.SelectionChangedEvent; *

* * @author Toni Kalajainen - * @author Tuukka Lehtonen */ -public class BasePostSelectionProvider extends BaseSelectionProvider implements IPostSelectionProvider { +public class BasePostSelectionProvider implements IPostSelectionProvider { - protected ListenerList postSelectionListeners = new ListenerList<>(); + protected ListenerList selectionListeners = new ListenerList(); + + protected ListenerList postSelectionListeners = new ListenerList(); + + protected ISelection selection = StructuredSelection.EMPTY; + + public void addSelectionChangedListener(ISelectionChangedListener listener) { + selectionListeners.add(listener); + } + + public ISelection getSelection() { + return selection; + } public void clearListeners() { - super.clearListeners(); - clearPostSelectionChangedListeners(); + selectionListeners.clear(); + postSelectionListeners.clear(); + } + + public void clearSelectionChangedListeners() { + postSelectionListeners.clear(); } public void clearPostSelectionChangedListeners() { postSelectionListeners.clear(); } + public void removeSelectionChangedListener(ISelectionChangedListener listener) { + selectionListeners.remove(listener); + } + @Override public void addPostSelectionChangedListener(ISelectionChangedListener listener) { postSelectionListeners.add(listener); @@ -59,10 +80,30 @@ public class BasePostSelectionProvider extends BaseSelectionProvider implements postSelectionListeners.remove(listener); } + public void setSelection(ISelection selection) { + setSelectionWithoutFiring(selection); + } + + protected Object[] getListeners() { + return selectionListeners.getListeners(); + } + protected Object[] getPostListeners() { return postSelectionListeners.getListeners(); } + /** + * Notify other UIs that selection has changed + * @param selection new selection + */ + public void fireSelection(ISelection selection) { + if (selection == null) + return; + SelectionChangedEvent e = new SelectionChangedEvent(this, selection); + for (Object l : getListeners()) + ((ISelectionChangedListener) l).selectionChanged(e); + } + /** * Notify other UIs that selection has changed * @param selection new selection @@ -82,4 +123,46 @@ public class BasePostSelectionProvider extends BaseSelectionProvider implements } } + public void setSelectionWithoutFiring(ISelection selection) { + this.selection = selection; + } + + + /** + * Sets a new selection and always fires a SelectionChangedEvent about it. + * + * @param selection the new selection + */ + public void setAndFireSelection(ISelection selection) { + setSelection(selection); + fireSelection(selection); + } + + /** + * Sets the new selection for this provider and fires all selection change + * listeners if the specified selection differs from the current selection. + * If the selection is either the same object or considered equal to the + * current selection, the listeners are not fired. + * + * @param selection the new selection + */ + public void setAndFireNonEqualSelection(ISelection selection) { + ISelection old = getSelection(); + if (ObjectUtils.objectEquals(old, selection)) + return; + + this.selection = selection; + if (selection != null && !selection.equals(old)) + fireSelection(selection); + } + + public boolean selectionEquals(ISelection s) { + if (s == selection) + return true; + if (s == null) + // Old selection had to be non-null + return true; + return s.equals(selection); + } + }