All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.lessvoid.nifty.controls.dragndrop.DroppableControl Maven / Gradle / Ivy

There is a newer version: 1.4.3
Show newest version
package de.lessvoid.nifty.controls.dragndrop;

import de.lessvoid.nifty.EndNotify;
import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.controls.*;
import de.lessvoid.nifty.elements.Element;
import de.lessvoid.nifty.input.NiftyInputEvent;
import de.lessvoid.nifty.screen.Screen;
import de.lessvoid.nifty.tools.SizeValue;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

/**
 * The controller class for a droppable element.
 *
 * @author void
 * @author Martin Karing <[email protected]>
 * @deprecated Internal control class. Use {@link de.lessvoid.nifty.controls.Droppable}
 */
@Deprecated
public class DroppableControl extends AbstractController implements Droppable {
  @Nonnull
  private static final Logger log = Logger.getLogger(DroppableControl.class.getName());
  @Nullable
  private Nifty nifty;
  @Nullable
  private List filters;
  @Nullable
  private Element droppableContent;
  @Nullable
  private DraggableControl draggable;

  @Override
  public void bind(
      @Nonnull final Nifty nifty,
      @Nonnull final Screen screen,
      @Nonnull final Element element,
      @Nonnull final Parameters parameter) {
    super.bind(element);
    this.nifty = nifty;
    droppableContent = element.findElementById("#droppableContent");
    if (droppableContent == null) {
      log.severe("Failed to locate content area of the droppable. Droppable element will not work. Looked for: " +
          "#droppableContent");
    }
  }

  @Override
  public void onStartScreen() {
    if (droppableContent == null) {
      log.severe("No droppable content set. The binding failed or did not run at all.");
    } else {
      draggable = findDraggableChild(droppableContent);
      if (draggable != null) {
        Element draggableElement = draggable.getElement();
        if (draggableElement != null) {
          drop(draggable, reactivate(draggableElement), false);
        }
      }
    }
  }

  @Override
  public boolean inputEvent(@Nonnull final NiftyInputEvent inputEvent) {
    return false;
  }

  @Nonnull
  private static EndNotify reactivate(@Nonnull final Element element) {
    return new EndNotify() {
      @Override
      public void perform() {
        element.reactivate();
      }
    };
  }

  @Nullable
  private static DraggableControl findDraggableChild(@Nonnull final Element element) {
    List children = element.getChildren();
    final int childrenCount = children.size();
    for (int i = 0; i < childrenCount; i++) {
      Element child = children.get(i);
      if (isDraggable(child)) {
        return child.getControl(DraggableControl.class);
      }
      final DraggableControl draggable = findDraggableChild(child);
      if (draggable != null) {
        return draggable;
      }
    }
    return null;
  }

  private static boolean isDraggable(@Nonnull final Element element) {
    final NiftyInputControl control = element.getAttachedInputControl();
    if (control != null) {
      return control.getController() instanceof Draggable;
    }
    return false;
  }

  protected void drop(@Nonnull final DraggableControl droppedDraggable, final EndNotify endNotify) {
    drop(droppedDraggable, endNotify, true);
  }

  private void drop(
      @Nonnull final DraggableControl droppedDraggable,
      @Nullable final EndNotify endNotify,
      final boolean notifyObservers) {
    if (droppableContent == null) {
      return;
    }
    draggable = droppedDraggable;
    Element draggableElement = draggable.getElement();
    if (draggableElement != null) {
      draggableElement.setConstraintX(SizeValue.px(0));
      draggableElement.setConstraintY(SizeValue.px(0));
      draggableElement.markForMove(droppableContent, endNotify);
    }

    final Droppable source = droppedDraggable.getDroppable();
    droppedDraggable.setDroppable(this);

    if (notifyObservers) {
      notifyObservers(source, droppedDraggable);
    }
  }

  @Nullable
  public DraggableControl getDraggable() {
    return draggable;
  }

  private void notifyObservers(@Nullable final Droppable source, @Nonnull final Draggable droppedDraggable) {
    if (nifty == null) {
      return;
    }
    String id = getId();
    if (id != null) {
      nifty.publishEvent(id, new DroppableDroppedEvent(source, droppedDraggable, this));
    }
  }

  @Override
  public void addFilter(@Nonnull final DroppableDropFilter filter) {
    if (filters == null) {
      filters = new ArrayList();
    }
    filters.add(filter);
  }

  @Override
  public void removeFilter(@Nonnull final DroppableDropFilter filter) {
    if (filters != null) {
      filters.remove(filter);
      if (filters.isEmpty()) {
        filters = null;
      }
    }
  }

  @Override
  public void removeAllFilters() {
    filters = null;
  }

  protected boolean accept(@Nullable final Droppable source, @Nonnull final Draggable draggable) {
    if (filters == null) {
      return true;
    }

    final int filterCount = filters.size();
    for (int i = 0; i < filterCount; i++) {
      DroppableDropFilter filter = filters.get(i);
      if (!filter.accept(source, draggable, this)) {
        return false;
      }
    }
    return true;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy