]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/TabbedPageSelectionProvider.java
Merge remote-tracking branch 'origin/svn' commit 'ccc1271c9d6657fb9dcf4cf3cb115fa0c8c...
[simantics/platform.git] / bundles / org.simantics.browsing.ui.swt / src / org / simantics / browsing / ui / swt / TabbedPageSelectionProvider.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 package org.simantics.browsing.ui.swt;\r
13 \r
14 /*******************************************************************************\r
15  * Copyright (c) 2000, 2007 IBM Corporation and others.\r
16  * All rights reserved. This program and the accompanying materials\r
17  * are made available under the terms of the Eclipse Public License v1.0\r
18  * which accompanies this distribution, and is available at\r
19  * http://www.eclipse.org/legal/epl-v10.html\r
20  *\r
21  * Contributors:\r
22  *     IBM Corporation - initial API and implementation\r
23  *******************************************************************************/\r
24 \r
25 import org.eclipse.core.runtime.Assert;\r
26 import org.eclipse.core.runtime.ListenerList;\r
27 import org.eclipse.core.runtime.SafeRunner;\r
28 import org.eclipse.jface.util.SafeRunnable;\r
29 import org.eclipse.jface.viewers.IPostSelectionProvider;\r
30 import org.eclipse.jface.viewers.ISelection;\r
31 import org.eclipse.jface.viewers.ISelectionChangedListener;\r
32 import org.eclipse.jface.viewers.ISelectionProvider;\r
33 import org.eclipse.jface.viewers.SelectionChangedEvent;\r
34 import org.eclipse.jface.viewers.StructuredSelection;\r
35 import org.eclipse.ui.IEditorPart;\r
36 \r
37 /**\r
38  * Manages the current selection in a multi-page editor by tracking the active\r
39  * nested editor within the multi-page editor. When the selection changes,\r
40  * notifications are sent to all registered listeners.\r
41  * <p>\r
42  * This class may be instantiated; it is not intended to be subclassed.\r
43  * The base implementation of <code>MultiPageEditor.init</code> creates\r
44  * an instance of this class.\r
45  * </p>\r
46  */\r
47 public class TabbedPageSelectionProvider implements IPostSelectionProvider {\r
48 \r
49     /**\r
50      * Registered selection changed listeners (element type:\r
51      * <code>ISelectionChangedListener</code>).\r
52      */\r
53     private final ListenerList listeners = new ListenerList();\r
54 \r
55     /**\r
56      * Registered post selection changed listeners.\r
57      */\r
58     private final ListenerList postListeners = new ListenerList();\r
59 \r
60     /**\r
61      * The multi-page editor.\r
62      */\r
63     private final TabbedPropertyPage multiPageEditor;\r
64 \r
65     /**\r
66      * Creates a selection provider for the given multi-page editor.\r
67      *\r
68      * @param multiPageEditor the multi-page editor\r
69      */\r
70     public TabbedPageSelectionProvider(TabbedPropertyPage multiPageEditor) {\r
71         Assert.isNotNull(multiPageEditor);\r
72         this.multiPageEditor = multiPageEditor;\r
73     }\r
74 \r
75     /* (non-Javadoc)\r
76      * Method declared on <code>ISelectionProvider</code>.\r
77      */\r
78     public void addSelectionChangedListener(ISelectionChangedListener listener) {\r
79         listeners.add(listener);\r
80     }\r
81 \r
82     /**\r
83      * Adds a listener for post selection changes in this multi page selection provider.\r
84      *\r
85      * @param listener a selection changed listener\r
86      * @since 3.2\r
87      */\r
88     public void addPostSelectionChangedListener(ISelectionChangedListener listener) {\r
89         postListeners.add(listener);\r
90     }\r
91 \r
92     /**\r
93      * Notifies all registered selection changed listeners that the editor's\r
94      * selection has changed. Only listeners registered at the time this method is\r
95      * called are notified.\r
96      *\r
97      * @param event the selection changed event\r
98      */\r
99     public void fireSelectionChanged(final SelectionChangedEvent event) {\r
100         Object[] listeners = this.listeners.getListeners();\r
101         fireEventChange(event, listeners);\r
102     }\r
103 \r
104     /**\r
105      * Notifies all post selection changed listeners that the editor's\r
106      * selection has changed.\r
107      * \r
108      * @param event the event to propogate.\r
109      * @since 3.2\r
110      */\r
111     public void firePostSelectionChanged(final SelectionChangedEvent event) {\r
112         Object[] listeners = postListeners.getListeners();\r
113         fireEventChange(event, listeners);\r
114     }\r
115 \r
116     private void fireEventChange(final SelectionChangedEvent event, Object[] listeners) {\r
117         for (int i = 0; i < listeners.length; ++i) {\r
118             final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];\r
119             SafeRunner.run(new SafeRunnable() {\r
120                 public void run() {\r
121                     l.selectionChanged(event);\r
122                 }\r
123             });\r
124         }\r
125     }\r
126 \r
127     /**\r
128      * Returns the multi-page editor.\r
129      * @return the multi-page editor.\r
130      */\r
131     public TabbedPropertyPage getMultiPageEditor() {\r
132         return multiPageEditor;\r
133     }\r
134 \r
135     /* (non-Javadoc)\r
136      * Method declared on <code>ISelectionProvider</code>.\r
137      */\r
138     public ISelection getSelection() {\r
139         IEditorPart activeEditor = multiPageEditor.getActiveEditor();\r
140         if (activeEditor != null) {\r
141             ISelectionProvider selectionProvider = activeEditor.getSite()\r
142             .getSelectionProvider();\r
143             if (selectionProvider != null) {\r
144                 return selectionProvider.getSelection();\r
145             }\r
146         }\r
147         return StructuredSelection.EMPTY;\r
148     }\r
149 \r
150     /* (non-JavaDoc)\r
151      * Method declaed on <code>ISelectionProvider</code>.\r
152      */\r
153     public void removeSelectionChangedListener(\r
154             ISelectionChangedListener listener) {\r
155         listeners.remove(listener);\r
156     }\r
157 \r
158     /**\r
159      * Removes a listener for post selection changes in this multi page selection provider.\r
160      *\r
161      * @param listener a selection changed listener\r
162      * @since 3.2\r
163      */\r
164     public void removePostSelectionChangedListener(ISelectionChangedListener listener) {\r
165         postListeners.remove(listener);\r
166     }\r
167 \r
168     /* (non-Javadoc)\r
169      * Method declared on <code>ISelectionProvider</code>.\r
170      */\r
171     public void setSelection(ISelection selection) {\r
172         IEditorPart activeEditor = multiPageEditor.getActiveEditor();\r
173         if (activeEditor != null) {\r
174             ISelectionProvider selectionProvider = activeEditor.getSite()\r
175             .getSelectionProvider();\r
176             if (selectionProvider != null) {\r
177                 selectionProvider.setSelection(selection);\r
178             }\r
179         }\r
180     }\r
181 }\r