/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.motorolamobility.studio.android.db.core.event; import java.util.ArrayList; import java.util.List; import com.motorolamobility.studio.android.db.core.ui.ITreeNode; /** * Manager which notifies {@link IDatabaseModelListener} registered that a {@link DatabaseModelEvent} occurred. * It is a singleton that needs to be called by the hierarchy of {@link ITreeNode} items when they modify the database model. */ public class DatabaseModelEventManager { private static DatabaseModelEventManager _instance; private final List<IDatabaseModelListener> listeners = new ArrayList<IDatabaseModelListener>(); private DatabaseModelEventManager() { //Singleton - avoid extensions and other means to construct an instance } /** * @return single instance of {@link DatabaseModelEvent} */ public synchronized static DatabaseModelEventManager getInstance() { if (_instance == null) { _instance = new DatabaseModelEventManager(); } return _instance; } /** * Adds a new {@link IDatabaseModelListener} * @param listener */ public void addListener(IDatabaseModelListener listener) { synchronized (listener) { listeners.add(listener); } } /** * Removes the {@link IDatabaseModelListener} * @param listener */ public void removeListeners(IDatabaseModelListener listener) { synchronized (listener) { listeners.remove(listener); } } /** * Fires/notifies/deliver the event to the listeners registered. * @param node {@link ITreeNode} that needs to refresh the view based on the model * @param eventType */ public void fireEvent(ITreeNode node, DatabaseModelEvent.EVENT_TYPE eventType) { DatabaseModelEvent databaseModelEvent = new DatabaseModelEvent(node, eventType); synchronized (listeners) { if (listeners != null) { for (IDatabaseModelListener listener : listeners) { switch (eventType) { case ADD: listener.handleNodeAdditionEvent(databaseModelEvent); break; case REMOVE: listener.handleNodeRemovalEvent(databaseModelEvent); break; case UPDATE: listener.handleNodeUpdateEvent(databaseModelEvent); break; case CLEAR: listener.handleNodeClearEvent(databaseModelEvent); break; case EXPAND: listener.handleNodeExpandEvent(databaseModelEvent); break; case SELECT: listener.handleNodeSelectEvent(databaseModelEvent); break; default: break; } } } } } }