package org.bundlemaker.core.ui.projecteditor.filebased; import java.io.File; import java.util.LinkedList; import java.util.List; import org.bundlemaker.core.common.ResourceType; import org.bundlemaker.core.project.AnalyzeMode; import org.bundlemaker.core.project.IModifiableProjectDescription; import org.bundlemaker.core.project.VariablePath; import org.bundlemaker.core.project.filecontent.FileBasedProjectContentProvider; import org.bundlemaker.core.ui.projecteditor.dnd.IProjectEditorDropEvent; import org.bundlemaker.core.ui.projecteditor.dnd.IProjectEditorDropProvider; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jface.util.LocalSelectionTransfer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.dnd.FileTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.widgets.Shell; public class FileBasedContentDropProvider implements IProjectEditorDropProvider { private final Transfer[] SUPPORTED_TYPES = new Transfer[] { // LocalSelectionTransfer.getTransfer(), // FileTransfer.getInstance() // }; private final FileBasedContentCreator _fileBasedContentCreator = new FileBasedContentCreator(); private final ContentTypeDetector _contentTypeDetector = new ContentTypeDetector(); @Override public Transfer[] getSupportedDropTypes() { return SUPPORTED_TYPES; } @Override public boolean canDrop(IProjectEditorDropEvent dropEvent) throws Exception { // if (dropEvent.isTransferType(LocalSelectionTransfer.getTransfer())) { return canDropLocalSelection(dropEvent); } // if (!canDropSelection(dropEvent)) { return false; } // if (!dropEvent.hasTarget()) { return true; } // return (dropEvent.getTarget() instanceof FileBasedProjectContentProvider); } @Override public boolean performDrop(IProjectEditorDropEvent dropEvent) throws Exception { if (dropEvent.isTransferType(FileTransfer.getInstance())) { return performFileTransferDrop(dropEvent); } return performLocalSelectionDrop(dropEvent); } /** * @param dropEvent * @return */ protected boolean performLocalSelectionDrop(IProjectEditorDropEvent dropEvent) { List<?> selectedObjects = getSelectedObjects(dropEvent.getData()); IModifiableProjectDescription modifiableProjectDescription = dropEvent.getBundleMakerProject() .getModifiableProjectDescription(); // Create a list of project-relative paths List<String> projectRelativePaths = new LinkedList<String>(); for (Object object : selectedObjects) { IResource resource = getAsResource(object); if (resource == null) { continue; } String path = FileBasedContentEditorUtils.getProjectRelativePath(resource); projectRelativePaths.add(path); } if (!dropEvent.hasTarget()) { // add as individual file based contents _fileBasedContentCreator.addFiles(modifiableProjectDescription, projectRelativePaths.toArray(new String[0])); // for (String relativePath : projectRelativePaths) { // FileBasedContentProviderFactory.addNewFileBasedContentProvider(modifiableProjectDescription, relativePath); // } } else { // add to selected filebasedcontentprovider FileBasedProjectContentProvider provider = (FileBasedProjectContentProvider) dropEvent .getProjectContentProvider(); addFiles(dropEvent.getShell(), provider, projectRelativePaths.toArray(new String[0])); } return true; } protected IResource getAsResource(Object object) { if (object instanceof IResource) { return (IResource) object; } if (object instanceof IJavaElement) { IJavaElement javaElement = (IJavaElement) object; return javaElement.getResource(); } return null; } protected boolean performFileTransferDrop(IProjectEditorDropEvent dropEvent) throws Exception { if (!dropEvent.hasTarget()) { // add new filebased content return createFileBasedContents(dropEvent); } String[] newFiles = dropEvent.getData(String[].class); FileBasedProjectContentProvider provider = (FileBasedProjectContentProvider) dropEvent.getTarget(); return addFiles(dropEvent.getShell(), provider, newFiles); } protected boolean addFiles(Shell shell, FileBasedProjectContentProvider provider, String[] newFiles) { // Iterate over each dropped file for (String newFile : newFiles) { VariablePath variablePath = new VariablePath(newFile); // Determine ("guess") the content type ResourceType contentType = _contentTypeDetector.detectContentType(variablePath); // add to provider provider.addRootPath(variablePath, contentType); // If sources are added set AnalyzeMode per default to BINARIES_AND_SOURCES if (contentType == ResourceType.SOURCE) { provider.setAnalyzeMode(AnalyzeMode.BINARIES_AND_SOURCES); } } return true; } /** * <p> * </p> * * @param dropEvent * @return */ protected boolean canDropSelection(IProjectEditorDropEvent dropEvent) { String[] fileNames = dropEvent.getData(String[].class); if (fileNames == null) { // cannot determine yet return true; } for (String dropCandidateName : fileNames) { File dropCandidate = new File(dropCandidateName); if (!FileBasedProjectContentHelper.isValidArchive(dropCandidate)) { return false; } } // return true; } /** * @param dropEvent * @return */ protected boolean canDropLocalSelection(IProjectEditorDropEvent dropEvent) { ISelection selection = LocalSelectionTransfer.getTransfer().getSelection(); // get selected objects List<?> selectedObjects = getSelectedObjects(selection); if (selectedObjects == null) { return false; } // drop only possible with folders and files for (Object object : selectedObjects) { // if (object instanceof IFolder) { continue; } // else if (object instanceof IFile) { if (!FileBasedProjectContentHelper.isValidArchive((IFile) object)) { return false; } continue; } if (object instanceof IProject) { // don't add Java projects via this drop adapter return false; } if (object instanceof IJavaElement) { IJavaElement javaElement = (IJavaElement) object; IResource resource = javaElement.getResource(); if (!(resource instanceof IFolder) && !(resource instanceof IFile)) { return false; } } } return true; } /** * Returns the selected objects or null if object is not a supported selection or empty * * @param object * @return */ protected List<?> getSelectedObjects(Object object) { if (!(object instanceof IStructuredSelection)) { return null; } IStructuredSelection structuredSelection = (IStructuredSelection) object; if (structuredSelection.isEmpty()) { return null; } return structuredSelection.toList(); } private boolean createFileBasedContents(IProjectEditorDropEvent dropEvent) { IModifiableProjectDescription modifiableProjectDescription = dropEvent.getBundleMakerProject() .getModifiableProjectDescription(); FileTransfer instance = FileTransfer.getInstance(); if (dropEvent.isTransferType(instance)) { String[] fileNames = dropEvent.getData(String[].class); _fileBasedContentCreator.addFiles(modifiableProjectDescription, fileNames); } return true; } }