/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.core.internal.event; import java.util.ArrayList; import java.util.List; import org.xmind.core.event.CoreEvent; import org.xmind.core.event.ICoreEventRegistration; /** * @author frankshaka * */ public class CoreEventRegistrationList { public static final int ONLY_ONCE = 1; public static final int ONLY_NORMAL = 1 << 1; public static final int ALL = ONLY_NORMAL | ONLY_ONCE; private List<CoreEventRegistration> regs; private int numOnceRegs = 0; public CoreEventRegistrationList() { } public void add(CoreEventRegistration reg) { if (reg == null) return; if (regs == null) { regs = new ArrayList<CoreEventRegistration>(4); } regs.add(reg); if (reg.isOnce()) { numOnceRegs++; } } public void remove(CoreEventRegistration reg) { if (reg == null || this.regs == null) return; boolean isRemoved = regs.remove(reg); if (reg.isOnce() && isRemoved) { numOnceRegs--; } if (regs.isEmpty()) { regs = null; } } public boolean isEmpty() { return regs == null || regs.isEmpty(); } public void fireCoreEvent(CoreEvent e, int group) { if (regs == null) return; Object[] array = regs.toArray(); for (Object obj : array) { CoreEventRegistration reg = (CoreEventRegistration) obj; if (group == ALL || ((group == ONLY_ONCE && reg.isOnce()) || (group == ONLY_NORMAL && !reg .isOnce()))) { reg.getListener().handleCoreEvent(e); if (reg.isOnce()) { reg.unregister(); } } } } public boolean hasRegistration(ICoreEventRegistration reg) { return regs != null && regs.contains(reg); } public boolean hasOnceRegistration() { return numOnceRegs > 0; } }