1 /******************************************************************************* 2 * Copyright (c) 2007, 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 15 package org.eclipse.ui.internal; 16 17 import java.util.HashMap; 18 import java.util.Map; 19 import java.util.Map.Entry; 20 import org.eclipse.core.runtime.ListenerList; 21 import org.eclipse.jface.viewers.ISelection; 22 import org.eclipse.ui.ISelectionListener; 23 import org.eclipse.ui.ISelectionService; 24 import org.eclipse.ui.services.IDisposable; 25 26 /** 27 * @since 3.4 28 * 29 */ 30 public class SlaveSelectionService implements ISelectionService, IDisposable { 31 32 private ListenerList<ISelectionListener> postListeners = new ListenerList<>(ListenerList.IDENTITY); 33 private ListenerList<ISelectionListener> listeners = new ListenerList<>(ListenerList.IDENTITY); 34 private Map<ISelectionListener, String> listenersToPartId = new HashMap<>(); 35 private Map<ISelectionListener, String> postListenersToPartId = new HashMap<>(); 36 37 private ISelectionService parentSelectionService; 38 39 /** 40 * @param parentSelectionService 41 */ SlaveSelectionService(ISelectionService parentSelectionService)42 public SlaveSelectionService(ISelectionService parentSelectionService) { 43 if (parentSelectionService == null) { 44 throw new IllegalArgumentException("The parent selection service cannot be null"); //$NON-NLS-1$ 45 } 46 this.parentSelectionService = parentSelectionService; 47 } 48 49 @Override addPostSelectionListener(ISelectionListener listener)50 public void addPostSelectionListener(ISelectionListener listener) { 51 postListeners.add(listener); 52 parentSelectionService.addPostSelectionListener(listener); 53 } 54 55 @Override addPostSelectionListener(String partId, ISelectionListener listener)56 public void addPostSelectionListener(String partId, ISelectionListener listener) { 57 listenersToPartId.put(listener, partId); 58 parentSelectionService.addPostSelectionListener(partId, listener); 59 } 60 61 @Override addSelectionListener(ISelectionListener listener)62 public void addSelectionListener(ISelectionListener listener) { 63 listeners.add(listener); 64 parentSelectionService.addSelectionListener(listener); 65 } 66 67 @Override addSelectionListener(String partId, ISelectionListener listener)68 public void addSelectionListener(String partId, ISelectionListener listener) { 69 postListenersToPartId.put(listener, partId); 70 parentSelectionService.addPostSelectionListener(partId, listener); 71 } 72 73 @Override getSelection()74 public ISelection getSelection() { 75 return parentSelectionService.getSelection(); 76 } 77 78 @Override getSelection(String partId)79 public ISelection getSelection(String partId) { 80 return parentSelectionService.getSelection(partId); 81 } 82 83 @Override removePostSelectionListener(ISelectionListener listener)84 public void removePostSelectionListener(ISelectionListener listener) { 85 postListeners.remove(listener); 86 parentSelectionService.removePostSelectionListener(listener); 87 } 88 89 @Override removePostSelectionListener(String partId, ISelectionListener listener)90 public void removePostSelectionListener(String partId, ISelectionListener listener) { 91 postListenersToPartId.remove(listener); 92 parentSelectionService.removePostSelectionListener(partId, listener); 93 } 94 95 @Override removeSelectionListener(ISelectionListener listener)96 public void removeSelectionListener(ISelectionListener listener) { 97 listeners.remove(listener); 98 parentSelectionService.removeSelectionListener(listener); 99 } 100 101 @Override removeSelectionListener(String partId, ISelectionListener listener)102 public void removeSelectionListener(String partId, ISelectionListener listener) { 103 listenersToPartId.remove(listener); 104 parentSelectionService.removeSelectionListener(partId, listener); 105 } 106 107 @Override dispose()108 public void dispose() { 109 for (Object listener : listeners.getListeners()) { 110 parentSelectionService.removeSelectionListener((ISelectionListener) listener); 111 } 112 listeners.clear(); 113 114 for (Object listener : postListeners.getListeners()) { 115 parentSelectionService.removePostSelectionListener((ISelectionListener) listener); 116 } 117 postListeners.clear(); 118 119 for (Entry<ISelectionListener, String> entry : listenersToPartId.entrySet()) { 120 parentSelectionService.removeSelectionListener(entry.getValue(), entry.getKey()); 121 } 122 listenersToPartId.clear(); 123 124 for (Entry<ISelectionListener, String> entry : postListenersToPartId.entrySet()) { 125 parentSelectionService.removePostSelectionListener(entry.getValue(), entry.getKey()); 126 } 127 postListenersToPartId.clear(); 128 } 129 } 130