public void drop(final DropTargetDropEvent dtde) {
    if (dragHandler == null) {
      dtde.rejectDrop();
      return;
    }
    try {
      if (ElementMetaDataTransferable.ELEMENT_FLAVOR.equals(getFlavor())) {
        final ElementMetaData metaData = (ElementMetaData) getTransferData();
        dragHandler.drop(dtde, editorContext, metaData, null);
        return;
      }

      if (FieldDescriptionTransferable.ELEMENT_FLAVOR.equals(getFlavor())) {
        final String fieldName = (String) getTransferData();
        final ElementMetaData metaData = createMetaData(fieldName);
        dragHandler.drop(dtde, editorContext, metaData, fieldName);
        return;
      }
      dtde.rejectDrop();
    } finally {
      editorContext.getRepresentationContainer().revalidate();
      editorContext.getRepresentationContainer().repaint();
      dragHandler = null;
    }
  }
  /**
   * Called while a drag operation is ongoing, when the mouse pointer has exited the operable part
   * of the drop site for the <code>DropTarget</code> registered with this listener.
   *
   * @param dte the <code>DropTargetEvent</code>
   */
  public void dragExit(final DropTargetEvent dte) {
    if (dragHandler == null) {
      super.dragExit(dte);
      return;
    }
    dragHandler.dragAborted(dte, editorContext);
    dragHandler = null;
    super.dragExit(dte);

    editorContext.getRepresentationContainer().revalidate();
    editorContext.getRepresentationContainer().repaint();
  }
  private ElementMetaData createMetaData(final String fieldName) {

    final ContextAwareDataSchemaModel model =
        editorContext.getRenderContext().getReportDataSchemaModel();
    final DataSchema dataSchema = model.getDataSchema();
    final DataAttributes attributes = dataSchema.getAttributes(fieldName);
    final DataAttributeContext dataAttributeContext = new DefaultDataAttributeContext();
    if (attributes == null) {
      return null;
    }
    final ElementType type = AutoGeneratorUtility.createFieldType(attributes, dataAttributeContext);
    if (type == null) {
      return null;
    }
    return type.getMetaData();
  }
  protected int updateDragOver(final DropTargetDragEvent event) {
    try {
      if (ElementMetaDataTransferable.ELEMENT_FLAVOR.equals(getFlavor())) {
        final ElementMetaData data = (ElementMetaData) getTransferData();
        if (data == null) {
          return DnDConstants.ACTION_NONE;
        }

        if (dragHandler == null) {
          dragHandler = createDragHandler(data);
          if (dragHandler == null) {
            return DnDConstants.ACTION_NONE;
          }
          return dragHandler.dragStarted(event, editorContext, data, null);
        } else {
          return dragHandler.dragUpdated(event, editorContext, data, null);
        }
      }

      if (FieldDescriptionTransferable.ELEMENT_FLAVOR.equals(getFlavor())) {
        final String fieldName = (String) getTransferData();
        final ElementMetaData data = createMetaData(fieldName);
        if (data == null) {
          return DnDConstants.ACTION_NONE;
        }

        if (dragHandler == null) {
          dragHandler = createDragHandler(data);
          if (dragHandler == null) {
            return DnDConstants.ACTION_NONE;
          }
          return dragHandler.dragStarted(event, editorContext, data, fieldName);
        } else {
          return dragHandler.dragUpdated(event, editorContext, data, fieldName);
        }
      }

      return DnDConstants.ACTION_NONE;
    } finally {
      editorContext.getRepresentationContainer().revalidate();
      editorContext.getRepresentationContainer().repaint();
    }
  }