/* * Ext GWT - Ext for GWT * Copyright(c) 2007-2009, Ext JS, LLC. * licensing@extjs.com * * http://extjs.com/license */ package com.extjs.gxt.ui.client.event; import java.util.ArrayList; import java.util.List; import com.extjs.gxt.ui.client.data.ModelData; /** * Provides a selection service where <code>SelectionProviders</code> can * register, allowing any listeners to be notified of selection events. */ public class SelectionService { private static SelectionService instance = new SelectionService(); /** * Returns the singleton instance. * * @return the service */ public static SelectionService get() { return instance; } private SelectionChangedListener<ModelData> listener; private List<SelectionProvider<ModelData>> providers; private List<SelectionChangedListener<ModelData>> listeners; private SelectionService() { listener = new SelectionChangedListener<ModelData>() { public void selectionChanged(SelectionChangedEvent<ModelData> event) { onSelectionChanged(event); } }; listeners = new ArrayList<SelectionChangedListener<ModelData>>(); providers = new ArrayList<SelectionProvider<ModelData>>(); } /** * Adds a listener to be notified of selection events from any registered * selection providers. * * @param listener the listener to add */ @SuppressWarnings("unchecked") public void addListener(SelectionChangedListener<? extends ModelData> listener) { listeners.add((SelectionChangedListener)listener); } /** * Returns a list of all current listeners. * * @return the listeners */ public List<SelectionChangedListener<ModelData>> getListeners() { return new ArrayList<SelectionChangedListener<ModelData>>(listeners); } /** * Returns the list of current providers. * * @return the providers */ public List<SelectionProvider<ModelData>> getProviders() { return new ArrayList<SelectionProvider<ModelData>>(providers); } /** * Registers a selection provider. * * @param provider the provider to add */ public void register(SelectionProvider<ModelData> provider) { provider.addSelectionChangedListener(listener); providers.add(provider); } /** * Removes a previously added listener. * * @param listener the listener to remove */ public void removeListener(SelectionChangedListener<? extends ModelData> listener) { listeners.remove(listener); } /** * Unregisters a selection provider. * * @param provider the provider to unregister */ public void unregister(SelectionProvider<ModelData> provider) { provider.removeSelectionListener(listener); providers.remove(provider); } /** * Called when any selection changed event is received from any registered * providers. * * @param event the selection changed event */ protected void onSelectionChanged(SelectionChangedEvent<ModelData> event) { for (SelectionChangedListener<ModelData> l : listeners) { l.selectionChanged(event); } } }