]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/jface/BasePostSelectionProvider.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.utils.ui / src / org / simantics / utils / ui / jface / BasePostSelectionProvider.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 /*\r
13  * 23.8.2006\r
14  */\r
15 package org.simantics.utils.ui.jface;\r
16 \r
17 import org.eclipse.core.runtime.ListenerList;\r
18 import org.eclipse.core.runtime.SafeRunner;\r
19 import org.eclipse.jface.util.SafeRunnable;\r
20 import org.eclipse.jface.viewers.IPostSelectionProvider;\r
21 import org.eclipse.jface.viewers.ISelection;\r
22 import org.eclipse.jface.viewers.ISelectionChangedListener;\r
23 import org.eclipse.jface.viewers.SelectionChangedEvent;\r
24 import org.eclipse.jface.viewers.StructuredSelection;\r
25 import org.simantics.utils.ObjectUtils;\r
26 \r
27 /**\r
28  * BaseSelectionProvider is a base implementation ISelectionProvider -interface.\r
29  * <p>\r
30  * Usage:\r
31  *  1) instantiate\r
32  *  2) call {@link #setAndFireSelection(ISelection)} to send a selection event\r
33  * \r
34  * <p>\r
35  * Contains an empty StructuredSelection by default.\r
36  * </p>\r
37  * \r
38  * @author Toni Kalajainen\r
39  */\r
40 public class BasePostSelectionProvider implements IPostSelectionProvider {\r
41 \r
42     protected ListenerList selectionListeners = new ListenerList();\r
43 \r
44     protected ListenerList postSelectionListeners = new ListenerList();\r
45 \r
46     protected ISelection selection = StructuredSelection.EMPTY;\r
47 \r
48     public void addSelectionChangedListener(ISelectionChangedListener listener) {\r
49         selectionListeners.add(listener);\r
50     }\r
51 \r
52     public ISelection getSelection() {\r
53         return selection;\r
54     }\r
55 \r
56     public void clearListeners() {\r
57         selectionListeners.clear();\r
58         postSelectionListeners.clear();\r
59     }\r
60 \r
61     public void clearSelectionChangedListeners() {\r
62         postSelectionListeners.clear();\r
63     }\r
64 \r
65     public void clearPostSelectionChangedListeners() {\r
66         postSelectionListeners.clear();\r
67     }\r
68 \r
69     public void removeSelectionChangedListener(ISelectionChangedListener listener) {\r
70         selectionListeners.remove(listener);\r
71     }\r
72 \r
73     @Override\r
74     public void addPostSelectionChangedListener(ISelectionChangedListener listener) {\r
75         postSelectionListeners.add(listener);\r
76     }\r
77 \r
78     @Override\r
79     public void removePostSelectionChangedListener(ISelectionChangedListener listener) {\r
80         postSelectionListeners.remove(listener);\r
81     }\r
82 \r
83     public void setSelection(ISelection selection) {\r
84         setSelectionWithoutFiring(selection);\r
85     }\r
86 \r
87     protected Object[] getListeners() {\r
88         return selectionListeners.getListeners();\r
89     }\r
90 \r
91     protected Object[] getPostListeners() {\r
92         return postSelectionListeners.getListeners();\r
93     }\r
94 \r
95     /**\r
96      * Notify other UIs that selection has changed\r
97      * @param selection new selection\r
98      */\r
99     public void fireSelection(ISelection selection) {\r
100         if (selection == null)\r
101             return;\r
102         SelectionChangedEvent e = new SelectionChangedEvent(this, selection);\r
103         for (Object l : getListeners())\r
104             ((ISelectionChangedListener) l).selectionChanged(e);\r
105     }\r
106 \r
107     /**\r
108      * Notify other UIs that selection has changed\r
109      * @param selection new selection\r
110      */\r
111     public void firePostSelection(ISelection selection) {\r
112         if (selection == null)\r
113             return;\r
114         final SelectionChangedEvent e = new SelectionChangedEvent(this, selection);\r
115         for (Object o : postSelectionListeners.getListeners()) {\r
116             final ISelectionChangedListener l = (ISelectionChangedListener) o;\r
117             SafeRunner.run(new SafeRunnable() {\r
118                 @Override\r
119                 public void run() throws Exception {\r
120                     l.selectionChanged(e);\r
121                 }\r
122             });\r
123         }\r
124     }\r
125 \r
126     public void setSelectionWithoutFiring(ISelection selection) {\r
127         this.selection = selection;\r
128     }\r
129 \r
130 \r
131     /**\r
132      * Sets a new selection and always fires a SelectionChangedEvent about it.\r
133      * \r
134      * @param selection the new selection\r
135      */\r
136     public void setAndFireSelection(ISelection selection) {\r
137         setSelection(selection);\r
138         fireSelection(selection);\r
139     }\r
140 \r
141     /**\r
142      * Sets the new selection for this provider and fires all selection change\r
143      * listeners if the specified selection differs from the current selection.\r
144      * If the selection is either the same object or considered equal to the\r
145      * current selection, the listeners are not fired.\r
146      * \r
147      * @param selection the new selection\r
148      */\r
149     public void setAndFireNonEqualSelection(ISelection selection) {\r
150         ISelection old = getSelection();\r
151         if (ObjectUtils.objectEquals(old, selection))\r
152             return;\r
153 \r
154         this.selection = selection;\r
155         if (selection != null && !selection.equals(old))\r
156             fireSelection(selection);\r
157     }\r
158 \r
159     public boolean selectionEquals(ISelection s) {\r
160         if (s == selection)\r
161             return true;\r
162         if (s == null)\r
163             // Old selection had to be non-null\r
164             return true;\r
165         return s.equals(selection);\r
166     }\r
167 \r
168 }\r