1 /*******************************************************************************
2  * Copyright (c) 2000, 2015 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.ui.internal;
15 
16 import org.eclipse.core.commands.common.EventManager;
17 import org.eclipse.core.runtime.SafeRunner;
18 import org.eclipse.jface.dialogs.IPageChangedListener;
19 import org.eclipse.jface.dialogs.PageChangedEvent;
20 import org.eclipse.jface.util.SafeRunnable;
21 import org.eclipse.ui.IPartListener2;
22 import org.eclipse.ui.IWorkbenchPartReference;
23 import org.eclipse.ui.internal.misc.UIStats;
24 
25 /**
26  * Part listener list.
27  */
28 public class PartListenerList2 extends EventManager {
29 
30 	/**
31 	 * PartListenerList2 constructor comment.
32 	 */
PartListenerList2()33 	public PartListenerList2() {
34 		super();
35 	}
36 
37 	/**
38 	 * Adds an PartListener to the part service.
39 	 */
addPartListener(IPartListener2 l)40 	public void addPartListener(IPartListener2 l) {
41 		addListenerObject(l);
42 	}
43 
44 	/**
45 	 * Calls a part listener with associated performance event instrumentation
46 	 *
47 	 * @param runnable
48 	 * @param listener
49 	 * @param ref
50 	 * @param string
51 	 */
fireEvent(SafeRunnable runnable, IPartListener2 listener, IWorkbenchPartReference ref, String string)52 	private void fireEvent(SafeRunnable runnable, IPartListener2 listener, IWorkbenchPartReference ref, String string) {
53 		String label = null;// for debugging
54 		if (UIStats.isDebugging(UIStats.NOTIFY_PART_LISTENERS)) {
55 			label = string + ref.getTitle();
56 			UIStats.start(UIStats.NOTIFY_PART_LISTENERS, label);
57 		}
58 		SafeRunner.run(runnable);
59 		if (UIStats.isDebugging(UIStats.NOTIFY_PART_LISTENERS)) {
60 			UIStats.end(UIStats.NOTIFY_PART_LISTENERS, listener, label);
61 		}
62 	}
63 
64 	/**
65 	 * Notifies the listener that a part has been activated.
66 	 */
firePartActivated(final IWorkbenchPartReference ref)67 	public void firePartActivated(final IWorkbenchPartReference ref) {
68 		for (Object listener : getListeners()) {
69 			final IPartListener2 partListener = (IPartListener2) listener;
70 			fireEvent(new SafeRunnable() {
71 				@Override
72 				public void run() {
73 					partListener.partActivated(ref);
74 				}
75 			}, partListener, ref, "activated::"); //$NON-NLS-1$
76 		}
77 	}
78 
79 	/**
80 	 * Notifies the listener that a part has been brought to top.
81 	 */
firePartBroughtToTop(final IWorkbenchPartReference ref)82 	public void firePartBroughtToTop(final IWorkbenchPartReference ref) {
83 		for (Object listener : getListeners()) {
84 			final IPartListener2 partListener = (IPartListener2) listener;
85 			fireEvent(new SafeRunnable() {
86 				@Override
87 				public void run() {
88 					partListener.partBroughtToTop(ref);
89 				}
90 			}, partListener, ref, "broughtToTop::"); //$NON-NLS-1$
91 		}
92 	}
93 
94 	/**
95 	 * Notifies the listener that a part has been closed
96 	 */
firePartClosed(final IWorkbenchPartReference ref)97 	public void firePartClosed(final IWorkbenchPartReference ref) {
98 		for (Object listener : getListeners()) {
99 			final IPartListener2 partListener = (IPartListener2) listener;
100 			fireEvent(new SafeRunnable() {
101 				@Override
102 				public void run() {
103 					partListener.partClosed(ref);
104 				}
105 			}, partListener, ref, "closed::"); //$NON-NLS-1$
106 		}
107 	}
108 
109 	/**
110 	 * Notifies the listener that a part has been deactivated.
111 	 */
firePartDeactivated(final IWorkbenchPartReference ref)112 	public void firePartDeactivated(final IWorkbenchPartReference ref) {
113 		for (Object listener : getListeners()) {
114 			final IPartListener2 partListener = (IPartListener2) listener;
115 			fireEvent(new SafeRunnable() {
116 				@Override
117 				public void run() {
118 					partListener.partDeactivated(ref);
119 				}
120 			}, partListener, ref, "deactivated::"); //$NON-NLS-1$
121 		}
122 	}
123 
124 	/**
125 	 * Notifies the listener that a part has been opened.
126 	 */
firePartOpened(final IWorkbenchPartReference ref)127 	public void firePartOpened(final IWorkbenchPartReference ref) {
128 		for (Object listener : getListeners()) {
129 			final IPartListener2 partListener = (IPartListener2) listener;
130 			fireEvent(new SafeRunnable() {
131 				@Override
132 				public void run() {
133 					partListener.partOpened(ref);
134 				}
135 			}, partListener, ref, "opened::"); //$NON-NLS-1$
136 		}
137 	}
138 
139 	/**
140 	 * Notifies the listener that a part has been opened.
141 	 */
firePartHidden(final IWorkbenchPartReference ref)142 	public void firePartHidden(final IWorkbenchPartReference ref) {
143 		for (Object element : getListeners()) {
144 			final IPartListener2 partListener;
145 			if (element instanceof IPartListener2) {
146 				partListener = (IPartListener2) element;
147 			} else {
148 				continue;
149 			}
150 
151 			fireEvent(new SafeRunnable() {
152 				@Override
153 				public void run() {
154 					partListener.partHidden(ref);
155 				}
156 			}, partListener, ref, "hidden::"); //$NON-NLS-1$
157 		}
158 	}
159 
160 	/**
161 	 * Notifies the listener that a part has been opened.
162 	 */
firePartVisible(final IWorkbenchPartReference ref)163 	public void firePartVisible(final IWorkbenchPartReference ref) {
164 		for (Object listener : getListeners()) {
165 			final IPartListener2 partListener;
166 			if (listener instanceof IPartListener2) {
167 				partListener = (IPartListener2) listener;
168 			} else {
169 				continue;
170 			}
171 
172 			fireEvent(new SafeRunnable() {
173 				@Override
174 				public void run() {
175 					partListener.partVisible(ref);
176 				}
177 			}, partListener, ref, "visible::"); //$NON-NLS-1$
178 		}
179 	}
180 
181 	/**
182 	 * Notifies the listener that a part has been opened.
183 	 */
firePartInputChanged(final IWorkbenchPartReference ref)184 	public void firePartInputChanged(final IWorkbenchPartReference ref) {
185 		for (Object listener : getListeners()) {
186 			final IPartListener2 partListener;
187 			if (listener instanceof IPartListener2) {
188 				partListener = (IPartListener2) listener;
189 			} else {
190 				continue;
191 			}
192 
193 			fireEvent(new SafeRunnable() {
194 				@Override
195 				public void run() {
196 					partListener.partInputChanged(ref);
197 				}
198 			}, partListener, ref, "inputChanged::"); //$NON-NLS-1$
199 		}
200 	}
201 
202 	/**
203 	 * Removes an IPartListener from the part service.
204 	 */
removePartListener(IPartListener2 l)205 	public void removePartListener(IPartListener2 l) {
206 		removeListenerObject(l);
207 	}
208 
firePageChanged(final PageChangedEvent event)209 	public void firePageChanged(final PageChangedEvent event) {
210 		for (Object listener : getListeners()) {
211 			final IPageChangedListener partListener;
212 			if (listener instanceof IPageChangedListener) {
213 				partListener = (IPageChangedListener) listener;
214 			} else {
215 				continue;
216 			}
217 
218 			SafeRunnable.run(new SafeRunnable() {
219 				@Override
220 				public void run() {
221 					partListener.pageChanged(event);
222 				}
223 			});
224 		}
225 	}
226 }
227