/*
 * Copyright (c) 2012, 2015 Eike Stepper (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.emf.cdo.transfer.internal.ui;

import org.eclipse.emf.cdo.spi.transfer.FileSystemTransferSystem;
import org.eclipse.emf.cdo.transfer.CDOTransferElement;
import org.eclipse.emf.cdo.transfer.CDOTransferSystem;
import org.eclipse.emf.cdo.transfer.spi.ui.TransferUIProvider;
import org.eclipse.emf.cdo.ui.shared.SharedIcons;

import org.eclipse.net4j.util.factory.ProductCreationException;

import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.graphics.Image;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Eike Stepper
 */
public class FileSystemUIProvider implements TransferUIProvider
{
  public FileSystemUIProvider()
  {
  }

  public ILabelProvider createLabelProvider(CDOTransferSystem system)
  {
    return new LabelProvider()
    {
      @Override
      public Image getImage(Object element)
      {
        if (element instanceof File)
        {
          File file = (File)element;
          if (file.isDirectory())
          {
            return SharedIcons.getImage(SharedIcons.OBJ_RESOURCE_FOLDER);
          }

          return SharedIcons.getImage(SharedIcons.OBJ_FILE_RESOURCE);
        }

        return super.getImage(element);
      }
    };
  }

  public void addSupportedTransfers(List<Transfer> transfers)
  {
    transfers.add(FileTransfer.getInstance());
  }

  public List<CDOTransferElement> convertTransferData(Object data)
  {
    if (data instanceof String[])
    {
      String[] paths = (String[])data;
      List<CDOTransferElement> result = new ArrayList<CDOTransferElement>(paths.length);
      for (int i = 0; i < paths.length; i++)
      {
        String path = paths[i];
        CDOTransferElement element = FileSystemTransferSystem.INSTANCE.getElement(path);
        result.add(element);
      }

      return result;
    }

    return null;
  }

  public CDOTransferElement convertTransferTarget(Object target)
  {
    // System.out.println(target.getClass().getName());
    // if (target instanceof String)
    // {
    // String path = (String)target;
    // }

    // TODO: implement FileSystemUIProvider.convertTransferTarget(target)
    return null;
  }

  public Object convertSelection(IStructuredSelection selection)
  {
    // TODO: implement FileSystemUIProvider.convertSelection(selection)
    return null;
  }

  @Override
  public String toString()
  {
    return getClass().getSimpleName();
  }

  /**
   * @author Eike Stepper
   */
  public static class Factory extends TransferUIProvider.Factory
  {
    public Factory()
    {
      super(FileSystemTransferSystem.TYPE);
    }

    @Override
    public TransferUIProvider create(String description) throws ProductCreationException
    {
      return new FileSystemUIProvider();
    }
  }
}
