package com.airlock.iam.plugin.configeditor.field;

import com.airlock.iam.plugin.configeditor.ConfigEditorApplication;
import com.airlock.iam.plugin.configeditor.data.tree.PluginConfigurationTreeItem;
import com.airlock.iam.plugin.framework.application.configuration.MutablePluginConfiguration;
import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.event.dd.DropHandler;
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Notification.Type;
import com.vaadin.v7.event.DataBoundTransferable;
import com.vaadin.v7.ui.ComboBox;

public class PluginDropHandler implements DropHandler {
   private final ConfigEditorApplication app;
   private final ComboBox innerField;

   public PluginDropHandler(ConfigEditorApplication app, ComboBox innerField) {
      this.app = app;
      this.innerField = innerField;
   }

   public void drop(DragAndDropEvent event) {
      DataBoundTransferable transferable = (DataBoundTransferable)event.getTransferable();
      Object itemId = transferable.getItemId();
      if (itemId instanceof PluginConfigurationTreeItem) {
         if (!this.innerField.isReadOnly()) {
            MutablePluginConfiguration pc = ((PluginConfigurationTreeItem)itemId).getPluginConfiguration();
            if (this.innerField.containsId(pc)) {
               this.innerField.setValue(pc);
            } else {
               Notification.show("<i>" + pc.toString() + "</i> can not be assigned to the target field.", Type.HUMANIZED_MESSAGE);
            }
         }
      }
   }

   public AcceptCriterion getAcceptCriterion() {
      return this.app.getPluginTreeUI().getDnDAcceptCriterion();
   }
}
