| /******************************************************************************* |
| * Copyright (c) 2006, 2008 Oracle. All rights reserved. This |
| * program and the accompanying materials are made available under the terms of |
| * the Eclipse Public License v1.0 which accompanies this distribution, and is |
| * available at http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: Oracle. - initial API and implementation |
| * |
| *******************************************************************************/ |
| package org.eclipse.jpt.ui.internal.selection; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| import org.eclipse.ui.IWindowListener; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.PlatformUI; |
| |
| public class SelectionManagerFactory |
| { |
| private static SelectionManagerFactory INSTANCE; |
| |
| private static Object MUTEX = new Object(); |
| |
| |
| /** |
| * Each <code>IWorkbenchWindow</code> has its own <code>JpaSelectionManager</code> |
| * to track the selection events in the <code>IWorkbenchWindow</code>. All |
| * <code>ISelectionListener</code>s in the same <code>IWorkbenchWindow</code> |
| * share the same <code>JpaSelectionManager</code>. |
| * |
| * @return The <code>JpaSelectionManager</code> associated with the current |
| * <code>IWorkbenchWindow</code> |
| */ |
| public static JpaSelectionManager getSelectionManager(IWorkbenchWindow window) { |
| if (INSTANCE == null) { |
| // this is thread safe for now. you never know whats comming |
| synchronized (MUTEX) { |
| if(INSTANCE == null) { |
| INSTANCE = new SelectionManagerFactory(); |
| // if we do the init inside the constructor we end up in a loop |
| // because the addWindowListener(this) does a callback to us |
| INSTANCE.init(); |
| } |
| } |
| } |
| return INSTANCE.internalGetSelectionManager(window); |
| } |
| |
| |
| private Map<IWorkbenchWindow, DefaultJpaSelectionManager> managers; |
| |
| private WindowListener windowListener; |
| |
| |
| private SelectionManagerFactory() { |
| managers = new HashMap<IWorkbenchWindow, DefaultJpaSelectionManager>(); |
| windowListener = new WindowListener(); |
| } |
| |
| private void init() { |
| IWorkbench workbench = PlatformUI.getWorkbench(); |
| workbench.addWindowListener(windowListener); |
| } |
| |
| /** |
| * Returns the JpaSelectionManager for the IWorkbenchWindow. |
| * Creates a new one if none exists yet. |
| */ |
| private DefaultJpaSelectionManager internalGetSelectionManager(IWorkbenchWindow window) { |
| if (window == null) { |
| throw new IllegalArgumentException("The IWorkbenchWindow cannot be null"); |
| } |
| |
| if (! managers.containsKey(window)) { |
| DefaultJpaSelectionManager manager = new DefaultJpaSelectionManager(); |
| this.managers.put(window, manager); |
| manager.init(window); |
| } |
| |
| return managers.get(window); |
| } |
| |
| |
| private class WindowListener implements IWindowListener |
| { |
| public void windowOpened(IWorkbenchWindow aWindow) {} |
| |
| public void windowClosed(IWorkbenchWindow aWindow) { |
| DefaultJpaSelectionManager manager = internalGetSelectionManager(aWindow); |
| manager.dispose(); |
| managers.remove(aWindow); |
| } |
| |
| public void windowActivated(IWorkbenchWindow aWindow) {} |
| |
| public void windowDeactivated(IWorkbenchWindow aWindow) {} |
| } |
| } |