/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.ui.navigator.model; import static org.teiid.designer.ui.navigator.model.ModelNavigatorMessages.dotProjectResourceDropErrorMessage; import static org.teiid.designer.ui.navigator.model.ModelNavigatorMessages.dotProjectResourceDropErrorTitle; import static org.teiid.designer.ui.navigator.model.ModelNavigatorMessages.invalidProjectErrorTitle; import static org.teiid.designer.ui.navigator.model.ModelNavigatorMessages.mixedDropQuestion; import java.util.ArrayList; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.TransferData; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.ui.actions.WorkspaceModifyOperation; import org.eclipse.ui.navigator.CommonDropAdapter; import org.eclipse.ui.navigator.CommonDropAdapterAssistant; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.workspace.DotProjectUtils; import org.teiid.designer.ui.common.widget.ListMessageDialog; public class ModelNavigatorDropAssistant extends CommonDropAdapterAssistant { private void createExistingProject( String projectFolder ) { try { final IProjectDescription description = ModelerCore.getWorkspace().loadProjectDescription(new Path(projectFolder + "//.project")); //$NON-NLS-1$ final IProject project = ModelerCore.getWorkspace().getRoot().getProject(description.getName()); // create the new project operation WorkspaceModifyOperation op = new WorkspaceModifyOperation() { /** * {@inheritDoc} * * @see org.eclipse.ui.actions.WorkspaceModifyOperation#execute(org.eclipse.core.runtime.IProgressMonitor) */ @Override protected void execute( IProgressMonitor monitor ) throws CoreException { monitor.beginTask("", 2000); //$NON-NLS-1$ project.create(description, new SubProgressMonitor(monitor, 1000)); if (monitor.isCanceled()) { throw new OperationCanceledException(); } project.open(new SubProgressMonitor(monitor, 1000)); } }; // run the new project creation operation ProgressMonitorDialog dialog = new ProgressMonitorDialog(getShell()); dialog.run(true, true, op); } catch (Exception e) { e.printStackTrace(); } } /** * {@inheritDoc} * * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#handleDrop(org.eclipse.ui.navigator.CommonDropAdapter, * org.eclipse.swt.dnd.DropTargetEvent, java.lang.Object) */ @Override public IStatus handleDrop( CommonDropAdapter aDropAdapter, DropTargetEvent aDropTargetEvent, Object aTarget ) { Object data = aDropTargetEvent.data; try { if (data instanceof IResource) { if (DotProjectUtils.getDotProjectCount((IResource)data, true, false) > 0) { ErrorDialog.openError(getShell(), dotProjectResourceDropErrorTitle, dotProjectResourceDropErrorMessage, null); aDropTargetEvent.detail = DND.DROP_NONE; } else { // TODO fix this // performDrop(data); } } else { String[] files = (String[])data; ArrayList projects = new ArrayList(); ArrayList nonProjectFiles = new ArrayList(); ArrayList invalidProjects = new ArrayList(); for (String file : files) { // Check For Top Level .project int projectCount = DotProjectUtils.getDotProjectCount(file, true, false); if (projectCount == 1) { if (DotProjectUtils.getDotProjectCount(file, false, false) == 1) { if (file.indexOf(DotProjectUtils.DOT_PROJECT) > 0) { invalidProjects.add(file); } else { projects.add(file); } } } else if (projectCount == 0) { nonProjectFiles.add(file); } else { invalidProjects.add(file); } } if ((nonProjectFiles.size() > 0) && ((projects.size() > 0) || (invalidProjects.size() > 0))) { MessageBox messageBox = new MessageBox(getShell(), SWT.ICON_QUESTION | SWT.YES | SWT.NO); messageBox.setMessage(mixedDropQuestion); int rc = messageBox.open(); if (rc == SWT.YES) { handleProjectImport(projects, invalidProjects); } else { aDropTargetEvent.detail = DND.DROP_NONE; } } else { if (nonProjectFiles.size() > 0) { // TODO fix this // performDrop(nonProjectFiles.toArray(new String[0])); } else { handleProjectImport(projects, invalidProjects); } } } } catch (Exception ce) { aDropTargetEvent.detail = DND.DROP_NONE; } return null; } private void handleProjectImport( ArrayList projects, ArrayList invalidProjects ) { for (Object project : projects) { createExistingProject((String)project); } if (invalidProjects.size() > 0) { ListMessageDialog.openError(getShell(), invalidProjectErrorTitle, null, invalidProjectErrorTitle, invalidProjects, null); } } /** * {@inheritDoc} * * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#validateDrop(java.lang.Object, int, * org.eclipse.swt.dnd.TransferData) */ @Override public IStatus validateDrop( Object target, int operation, TransferData transferType ) { return null; } }