001/*
002 * This library is part of OpenCms -
003 * the Open Source Content Management System
004 *
005 * Copyright (C) Alkacon Software (http://www.alkacon.com)
006 *
007 * This library is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 *
012 * This library is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * Lesser General Public License for more details.
016 *
017 * For further information about Alkacon Software, please see the
018 * company website: http://www.alkacon.com
019 *
020 * For further information about OpenCms, please see the
021 * project website: http://www.opencms.org
022 *
023 * You should have received a copy of the GNU Lesser General Public
024 * License along with this library; if not, write to the Free Software
025 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
026 */
027
028package org.opencms.gwt.client.dnd;
029
030import java.util.ArrayList;
031import java.util.List;
032
033import com.google.web.bindery.event.shared.HandlerRegistration;
034
035/**
036 * A DND controller which forwards method calls to multiple other DND controllers.<p>
037 */
038public class CmsCompositeDNDController implements I_CmsDNDController {
039
040    /** The list of internal controllers. */
041    List<I_CmsDNDController> m_controllers = new ArrayList<I_CmsDNDController>();
042
043    /**
044     * Adds another sub-controller to this controller.<p>
045     *
046     * @param controller the controller to add
047     *
048     * @return a registration object to remove the controller later
049     */
050    public HandlerRegistration addController(final I_CmsDNDController controller) {
051
052        m_controllers.add(controller);
053        return new HandlerRegistration() {
054
055            public void removeHandler() {
056
057                m_controllers.remove(controller);
058            }
059        };
060    }
061
062    /**
063     * @see org.opencms.gwt.client.dnd.I_CmsDNDController#onAnimationStart(org.opencms.gwt.client.dnd.I_CmsDraggable, org.opencms.gwt.client.dnd.I_CmsDropTarget, org.opencms.gwt.client.dnd.CmsDNDHandler)
064     */
065    public void onAnimationStart(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
066
067        for (I_CmsDNDController controller : m_controllers) {
068            controller.onAnimationStart(draggable, target, handler);
069        }
070    }
071
072    /**
073     * @see org.opencms.gwt.client.dnd.I_CmsDNDController#onBeforeDrop(org.opencms.gwt.client.dnd.I_CmsDraggable, org.opencms.gwt.client.dnd.I_CmsDropTarget, org.opencms.gwt.client.dnd.CmsDNDHandler)
074     */
075    public boolean onBeforeDrop(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
076
077        boolean result = true;
078        for (I_CmsDNDController controller : m_controllers) {
079            result &= controller.onBeforeDrop(draggable, target, handler);
080        }
081        return result;
082    }
083
084    /**
085     * @see org.opencms.gwt.client.dnd.I_CmsDNDController#onDragCancel(org.opencms.gwt.client.dnd.I_CmsDraggable, org.opencms.gwt.client.dnd.I_CmsDropTarget, org.opencms.gwt.client.dnd.CmsDNDHandler)
086     */
087    public void onDragCancel(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
088
089        for (I_CmsDNDController controller : m_controllers) {
090            controller.onDragCancel(draggable, target, handler);
091        }
092    }
093
094    /**
095     * @see org.opencms.gwt.client.dnd.I_CmsDNDController#onDragStart(org.opencms.gwt.client.dnd.I_CmsDraggable, org.opencms.gwt.client.dnd.I_CmsDropTarget, org.opencms.gwt.client.dnd.CmsDNDHandler)
096     */
097    public boolean onDragStart(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
098
099        boolean result = true;
100        for (I_CmsDNDController controller : m_controllers) {
101            result &= controller.onDragStart(draggable, target, handler);
102        }
103        return result;
104    }
105
106    /**
107     * @see org.opencms.gwt.client.dnd.I_CmsDNDController#onDrop(org.opencms.gwt.client.dnd.I_CmsDraggable, org.opencms.gwt.client.dnd.I_CmsDropTarget, org.opencms.gwt.client.dnd.CmsDNDHandler)
108     */
109    public void onDrop(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
110
111        for (I_CmsDNDController controller : m_controllers) {
112            controller.onDrop(draggable, target, handler);
113        }
114    }
115
116    /**
117     * @see org.opencms.gwt.client.dnd.I_CmsDNDController#onPositionedPlaceholder(org.opencms.gwt.client.dnd.I_CmsDraggable, org.opencms.gwt.client.dnd.I_CmsDropTarget, org.opencms.gwt.client.dnd.CmsDNDHandler)
118     */
119    public void onPositionedPlaceholder(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
120
121        for (I_CmsDNDController controller : m_controllers) {
122            controller.onPositionedPlaceholder(draggable, target, handler);
123        }
124    }
125
126    /**
127     * @see org.opencms.gwt.client.dnd.I_CmsDNDController#onTargetEnter(org.opencms.gwt.client.dnd.I_CmsDraggable, org.opencms.gwt.client.dnd.I_CmsDropTarget, org.opencms.gwt.client.dnd.CmsDNDHandler)
128     */
129    public boolean onTargetEnter(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
130
131        boolean result = true;
132        for (I_CmsDNDController controller : m_controllers) {
133            result &= controller.onTargetEnter(draggable, target, handler);
134        }
135        return result;
136    }
137
138    /**
139     * @see org.opencms.gwt.client.dnd.I_CmsDNDController#onTargetLeave(org.opencms.gwt.client.dnd.I_CmsDraggable, org.opencms.gwt.client.dnd.I_CmsDropTarget, org.opencms.gwt.client.dnd.CmsDNDHandler)
140     */
141    public void onTargetLeave(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
142
143        for (I_CmsDNDController controller : m_controllers) {
144            controller.onTargetLeave(draggable, target, handler);
145        }
146    }
147
148}