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    /**
064     * @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)
065     */
066    public void onAnimationStart(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
067
068        for (I_CmsDNDController controller : m_controllers) {
069            controller.onAnimationStart(draggable, target, handler);
070        }
071    }
072
073    /**
074     * @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)
075     */
076    public boolean onBeforeDrop(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
077
078        boolean result = true;
079        for (I_CmsDNDController controller : m_controllers) {
080            result &= controller.onBeforeDrop(draggable, target, handler);
081        }
082        return result;
083    }
084
085    /**
086     * @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)
087     */
088    public void onDragCancel(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
089
090        for (I_CmsDNDController controller : m_controllers) {
091            controller.onDragCancel(draggable, target, handler);
092        }
093    }
094
095    /**
096     * @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)
097     */
098    public boolean onDragStart(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
099
100        boolean result = true;
101        for (I_CmsDNDController controller : m_controllers) {
102            result &= controller.onDragStart(draggable, target, handler);
103        }
104        return result;
105    }
106
107    /**
108     * @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)
109     */
110    public void onDrop(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
111
112        for (I_CmsDNDController controller : m_controllers) {
113            controller.onDrop(draggable, target, handler);
114        }
115    }
116
117    /**
118     * @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)
119     */
120    public void onPositionedPlaceholder(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
121
122        for (I_CmsDNDController controller : m_controllers) {
123            controller.onPositionedPlaceholder(draggable, target, handler);
124        }
125    }
126
127    /**
128     * @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)
129     */
130    public boolean onTargetEnter(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
131
132        boolean result = true;
133        for (I_CmsDNDController controller : m_controllers) {
134            result &= controller.onTargetEnter(draggable, target, handler);
135        }
136        return result;
137    }
138
139    /**
140     * @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)
141     */
142    public void onTargetLeave(I_CmsDraggable draggable, I_CmsDropTarget target, CmsDNDHandler handler) {
143
144        for (I_CmsDNDController controller : m_controllers) {
145            controller.onTargetLeave(draggable, target, handler);
146        }
147    }
148
149    /**
150     * @see org.opencms.gwt.client.dnd.I_CmsDNDController#postClear(org.opencms.gwt.client.dnd.I_CmsDraggable, org.opencms.gwt.client.dnd.I_CmsDropTarget)
151     */
152    @Override
153    public void postClear(I_CmsDraggable draggable, I_CmsDropTarget target) {
154        m_controllers.forEach(controller -> {
155            controller.postClear(draggable, target);
156
157        });
158    }
159
160    /**
161     * @see org.opencms.gwt.client.dnd.I_CmsDNDController#startPlacementMode(org.opencms.gwt.client.dnd.I_CmsDraggable, org.opencms.gwt.client.dnd.CmsDNDHandler)
162     */
163    @Override
164    public boolean startPlacementMode(I_CmsDraggable draggable, CmsDNDHandler handler) {
165        for (I_CmsDNDController controller: m_controllers) {
166            if (controller.startPlacementMode(draggable, handler)) {
167                return true;
168            }
169        }
170        return false;
171    }
172
173}