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}