cc.kune.core.client.dnd.AbstractDropController.java Source code

Java tutorial

Introduction

Here is the source code for cc.kune.core.client.dnd.AbstractDropController.java

Source

/*
 *
 * Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under
 * one or more contributor license agreements (see COPYRIGHT for details).
 * The CA licenses this file to you under the GNU Affero General Public
 * License version 3, (the "License"); you may not use this file except in
 * compliance with the License. This file is part of kune.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
package cc.kune.core.client.dnd;

import java.util.ArrayList;
import java.util.List;

import cc.kune.common.client.actions.ui.descrip.DropTarget;

import com.allen_sauer.gwt.dnd.client.DragContext;
import com.allen_sauer.gwt.dnd.client.VetoDragException;
import com.allen_sauer.gwt.dnd.client.drop.SimpleDropController;
import com.google.gwt.event.logical.shared.AttachEvent;
import com.google.gwt.event.logical.shared.AttachEvent.Handler;
import com.google.gwt.user.client.ui.Widget;

// TODO: Auto-generated Javadoc
/**
 * The Class AbstractDropController.
 * 
 * @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
 */
public abstract class AbstractDropController implements DropTarget {

    /** The accepted types (which one we allow to drop here). */
    private final List<Class<?>> acceptedTypes;

    /** The drag controller. */
    private final KuneDragController dragController;

    /** The drop controller. */
    private SimpleDropController dropController;

    /** The target. */
    private Object target;

    /**
     * Instantiates a new abstract drop controller.
     * 
     * @param dragController
     *          the drag controller
     */
    public AbstractDropController(final KuneDragController dragController) {
        this.dragController = dragController;
        acceptedTypes = new ArrayList<Class<?>>();
    }

    /**
     * Gets the target.
     * 
     * @return the target
     */
    public Object getTarget() {
        return target;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * cc.kune.common.client.actions.ui.descrip.DropTarget#init(com.google.gwt
     * .user.client.ui.Widget)
     */
    @Override
    public void init(final Widget dropTarget) {
        dropController = new SimpleDropController(dropTarget) {

            @Override
            public void onDrop(final DragContext context) {
                boolean droppedSomething = false;
                super.onDrop(context);
                for (final Widget widget : context.selectedWidgets) {
                    if (acceptedTypes.contains(widget.getClass())) {
                        onDropAllowed(widget, this);
                        droppedSomething = true;
                    }
                }
                if (droppedSomething) {
                    onGroupDropFinished(this);
                }
            }

            @Override
            public void onEnter(final DragContext context) {
                super.onEnter(context);
                for (final Widget widget : context.selectedWidgets) {
                    if (acceptedTypes.contains(widget.getClass())) {
                        onEnterAllowed(this);
                    }
                }
            }

            @Override
            public void onLeave(final DragContext context) {
                super.onLeave(context);
                for (final Widget widget : context.selectedWidgets) {
                    if (acceptedTypes.contains(widget.getClass())) {
                        onLeaveAllowed(this);
                    }
                }
            }

            @Override
            public void onPreviewDrop(final DragContext context) throws VetoDragException {
                for (final Widget widget : context.selectedWidgets) {
                    if (acceptedTypes.contains(widget.getClass())) {
                        onPreviewAllowed(widget, this);
                    } else {
                        throw new VetoDragException();
                    }
                }
                super.onPreviewDrop(context);
            }
        };

        dropTarget.addStyleName("k-drop-allowed");

        if (dropTarget.isAttached()) {
            dragController.registerDropController(dropController);
        }

        dropTarget.addAttachHandler(new Handler() {
            @Override
            public void onAttachOrDetach(final AttachEvent event) {
                if (!event.isAttached()) {
                    dragController.unregisterDropController(dropController);
                } else {
                    dragController.registerDropController(dropController);
                }
            }
        });
    }

    /**
     * On drop allowed.
     * 
     * @param widget
     *          the widget
     * @param dropController
     *          the drop controller
     */
    public abstract void onDropAllowed(Widget widget, final SimpleDropController dropController);

    /**
     * On enter allowed.
     * 
     * @param dropController
     *          the drop controller
     */
    public void onEnterAllowed(final SimpleDropController dropController) {
        dropController.getDropTarget().addStyleName("k-drop-allowed-hover");
    }

    /**
     * On group drop finished, is fired when all the widgets are dropped (at the
     * end).
     * 
     * @param dropController
     *          the drop controller
     */
    public void onGroupDropFinished(final SimpleDropController dropController) {

    }

    /**
     * On leave allowed.
     * 
     * @param dropController
     *          the drop controller
     */
    public void onLeaveAllowed(final SimpleDropController dropController) {
        dropController.getDropTarget().removeStyleName("k-drop-allowed-hover");
    }

    /**
     * On preview allowed.
     * 
     * @param widget
     *          the widget
     * @param dropController
     *          the drop controller
     * @throws VetoDragException
     *           the veto drag exception
     */
    public void onPreviewAllowed(final Widget widget, final SimpleDropController dropController)
            throws VetoDragException {
        dropController.getDropTarget().removeStyleName("k-drop-allowed-hover");
    }

    /**
     * Register type to accept this kind of widgets to be dropped here.
     * 
     * @param classType
     *          the class type
     */
    public void registerType(final Class<?> classType) {
        acceptedTypes.add(classType);
    }

    /**
     * Sets the target (for instance a StateToken id, to perform operations),
     * because with the widget we don't have all the info.
     * 
     * @param target
     *          the new target
     */
    public void setTarget(final Object target) {
        this.target = target;
    }

}