blob: 51f9d8219a2eace38e460375691cee5dcea3efd9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.ide;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.util.Assert;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.EditorInputTransfer;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.MarkerTransfer;
import org.eclipse.ui.part.ResourceTransfer;
/**
* An editor area drop adapter to handle transfer types
* <code>EditorInputTransfer</code>, <code>MarkerTransfer</code>,
* and <code>ResourceTransfer</code>.
*/
public class EditorAreaDropAdapter extends DropTargetAdapter {
private IWorkbenchWindow window;
/**
* Constructs a new EditorAreaDropAdapter.
* @param window the workbench window
*/
public EditorAreaDropAdapter(IWorkbenchWindow window) {
this.window = window;
}
public void dragEnter(DropTargetEvent event) {
// always indicate a copy
event.detail = DND.DROP_COPY;
}
public void dragOperationChanged(DropTargetEvent event) {
// always indicate a copy
event.detail = DND.DROP_COPY;
}
public void drop(final DropTargetEvent event) {
Display d = window.getShell().getDisplay();
final IWorkbenchPage page = window.getActivePage();
if (page != null) {
d.asyncExec(new Runnable() {
public void run() {
asyncDrop(event, page);
}
});
}
}
private void asyncDrop(DropTargetEvent event, IWorkbenchPage page) {
/* Open Editor for generic IEditorInput */
if (EditorInputTransfer.getInstance().isSupportedType(
event.currentDataType)) {
/* event.data is an array of EditorInputData, which contains an IEditorInput and
* the corresponding editorId */
Assert
.isTrue(event.data instanceof EditorInputTransfer.EditorInputData[]);
EditorInputTransfer.EditorInputData[] editorInputs = (EditorInputTransfer.EditorInputData []) event.data;
for (int i = 0; i < editorInputs.length; i++) {
IEditorInput editorInput = editorInputs[i].input;
String editorId = editorInputs[i].editorId;
openNonExternalEditor(page, editorInput, editorId);
}
}
/* Open Editor for Marker (e.g. Tasks, Bookmarks, etc) */
else if (MarkerTransfer.getInstance().isSupportedType(
event.currentDataType)) {
Assert.isTrue(event.data instanceof IMarker[]);
IMarker[] markers = (IMarker[]) event.data;
for (int i = 0; i < markers.length; i++) {
openNonExternalEditor(page, markers[i]);
}
}
/* Open Editor for resource */
else if (ResourceTransfer.getInstance().isSupportedType(
event.currentDataType)) {
Assert.isTrue(event.data instanceof IResource[]);
IResource[] files = (IResource[]) event.data;
for (int i = 0; i < files.length; i++) {
if (files[i] instanceof IFile) {
IFile file = (IFile) files[i];
openNonExternalEditor(page, file);
}
}
}
}
/**
* Opens an editor for the given file on the given workbench page in response
* to a drop on the workbench editor area. In contrast to other ways of opening
* an editor, we never open an external editor in this case (since external
* editors appear in their own window and not in the editor area).
* The operation fails silently if there is no suitable editor to open.
*
* @param page the workbench page
* @param file the file to open
* @return the editor part that was opened, or <code>null</code> if no editor
* was opened
*/
private IEditorPart openNonExternalEditor(IWorkbenchPage page, IFile file) {
IEditorPart result;
try {
// find out which editor we would normal open
IEditorDescriptor defaultEditorDesc = IDE.getDefaultEditor(file);
if (defaultEditorDesc != null
&& !defaultEditorDesc.isOpenExternal()) {
// open an internal or in-place editor
result = IDE.openEditor(page, file, true);
} else {
// never open an external editor in response to a drop
// check the OS for in-place editor (OLE on Win32)
IEditorRegistry editorReg = PlatformUI.getWorkbench()
.getEditorRegistry();
IEditorDescriptor editorDesc = null;
if (editorReg.isSystemInPlaceEditorAvailable(file.getName())) {
editorDesc = editorReg
.findEditor(IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID);
}
// next lookup the default text editor
if (editorDesc == null) {
editorDesc = editorReg
.findEditor(IDEWorkbenchPlugin.DEFAULT_TEXT_EDITOR_ID);
}
// if no valid editor found, bail out
if (editorDesc == null) {
throw new PartInitException(IDEWorkbenchMessages.IDE_noFileEditorFound);
}
// open the editor on the file
result = page.openEditor(new FileEditorInput(file), editorDesc
.getId(), true);
}
} catch (PartInitException e) {
// silently ignore problems opening the editor
result = null;
}
return result;
}
/**
* Opens an editor for the given marker on the given workbench page in response
* to a drop on the workbench editor area. In contrast to other ways of opening
* an editor, we never open an external editor in this case (since external
* editors appear in their own window and not in the editor area).
* The operation fails silently if there is no suitable editor to open.
*
* @param page the workbench page
* @param marker the marker to open
* @return the editor part that was opened, or <code>null</code> if no editor
* was opened
*/
private IEditorPart openNonExternalEditor(IWorkbenchPage page,
IMarker marker) {
IEditorPart result;
try {
// get the marker resource file
if (!(marker.getResource() instanceof IFile)) {
return null;
}
IFile file = (IFile) marker.getResource();
// get the preferred editor id from the marker
IEditorDescriptor editorDesc = null;
try {
String editorID = (String) marker
.getAttribute(IDE.EDITOR_ID_ATTR);
if (editorID != null) {
IEditorRegistry editorReg = PlatformUI.getWorkbench()
.getEditorRegistry();
editorDesc = editorReg.findEditor(editorID);
}
} catch (CoreException e) {
// ignore problems with getting the marker
}
// open the editor on the marker resource file
if (editorDesc != null && !editorDesc.isOpenExternal()) {
result = page.openEditor(new FileEditorInput(file), editorDesc
.getId(), true);
} else {
result = openNonExternalEditor(page, file);
}
// get the editor to update its position based on the marker
if (result != null) {
IDE.gotoMarker(result, marker);
}
} catch (PartInitException e) {
// silently ignore problems opening the editor
result = null;
}
return result;
}
/**
* Opens an editor for the given editor input and editor id combination on the
* given workbench page in response to a drop on the workbench editor area.
* In contrast to other ways of opening an editor, we never open an external
* editor in this case (since external editors appear in their own window and
* not in the editor area). The operation fails silently if the editor
* cannot be opened.
*
* @param page the workbench page
* @param editorInput the editor input
* @param editorId the editor id
* @return the editor part that was opened, or <code>null</code> if no editor
* was opened
*/
private IEditorPart openNonExternalEditor(IWorkbenchPage page,
IEditorInput editorInput, String editorId) {
IEditorPart result;
try {
IEditorRegistry editorReg = PlatformUI.getWorkbench()
.getEditorRegistry();
IEditorDescriptor editorDesc = editorReg.findEditor(editorId);
if (editorDesc != null && !editorDesc.isOpenExternal()) {
result = page.openEditor(editorInput, editorId);
} else {
result = null;
}
} catch (PartInitException e) {
// silently ignore problems opening the editor
result = null;
}
return result;
}
}