diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/EditorDropHandler.java b/platform/platform-impl/src/com/intellij/openapi/editor/EditorDropHandler.java index 067cf5272d73..5e3f93e2ff80 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/EditorDropHandler.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/EditorDropHandler.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.editor; +import com.intellij.openapi.fileEditor.impl.EditorWindow; import com.intellij.openapi.project.Project; import java.awt.datatransfer.DataFlavor; @@ -25,5 +26,5 @@ import java.awt.datatransfer.Transferable; */ public interface EditorDropHandler { boolean canHandleDrop(DataFlavor[] transferFlavors); - void handleDrop(Transferable t, final Project project); + void handleDrop(Transferable t, final Project project, EditorWindow editorWindow); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index aa667d0276cb..7b96a465a25f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -55,8 +55,6 @@ import com.intellij.openapi.editor.markup.*; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.ex.IdeDocumentHistory; import com.intellij.openapi.fileEditor.impl.EditorsSplitters; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.options.FontSize; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; @@ -5599,7 +5597,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi final EditorDropHandler dropHandler = editor.getDropHandler(); if (dropHandler != null && dropHandler.canHandleDrop(t.getTransferDataFlavors())) { - dropHandler.handleDrop(t, editor.getProject()); + dropHandler.handleDrop(t, editor.getProject(), null); return true; } diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorsSplitters.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorsSplitters.java index dd865bb4e251..ea679252f3ae 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorsSplitters.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorsSplitters.java @@ -793,12 +793,12 @@ public class EditorsSplitters extends JPanel { } private final class MyTransferHandler extends TransferHandler { - private final FileDropHandler myFileDropHandler = new FileDropHandler(); + private final FileDropHandler myFileDropHandler = new FileDropHandler(null); @Override public boolean importData(JComponent comp, Transferable t) { if (myFileDropHandler.canHandleDrop(t.getTransferDataFlavors())) { - myFileDropHandler.handleDrop(t, myManager.getProject()); + myFileDropHandler.handleDrop(t, myManager.getProject(), myCurrentWindow); return true; } return false; diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/FileDropHandler.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/FileDropHandler.java index 3145e78fd852..5211c89f57d1 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/FileDropHandler.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/FileDropHandler.java @@ -16,8 +16,13 @@ package com.intellij.openapi.fileEditor.impl.text; import com.intellij.ide.dnd.FileCopyPasteUtil; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorDropHandler; -import com.intellij.openapi.fileEditor.OpenFileDescriptor; +import com.intellij.openapi.fileEditor.*; +import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; +import com.intellij.openapi.fileEditor.impl.EditorWindow; +import com.intellij.openapi.fileEditor.impl.EditorWithProviderComposite; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; @@ -33,28 +38,66 @@ import java.util.List; * @author yole */ public class FileDropHandler implements EditorDropHandler { + private final Editor myEditor; + + public FileDropHandler(Editor editor) { + myEditor = editor; + } + + public boolean canHandleDrop(final DataFlavor[] transferFlavors) { return transferFlavors != null && FileCopyPasteUtil.isFileListFlavorSupported(transferFlavors); } - public void handleDrop(@NotNull final Transferable t, @Nullable final Project project) { + public void handleDrop(@NotNull final Transferable t, @Nullable final Project project, EditorWindow editorWindow) { if (project == null || !FileCopyPasteUtil.isFileListFlavorSupported(t)) { return; } final List fileList = FileCopyPasteUtil.getFileList(t); if (fileList != null) { - openFiles(project, fileList); + openFiles(project, fileList, editorWindow); } } - private static void openFiles(final Project project, final List fileList) { + private void openFiles(final Project project, final List fileList, EditorWindow editorWindow) { + if (editorWindow == null && myEditor != null) { + editorWindow = findEditorWindow(project); + } final LocalFileSystem fileSystem = LocalFileSystem.getInstance(); for (File file : fileList) { final VirtualFile vFile = fileSystem.refreshAndFindFileByIoFile(file); + final FileEditorManagerEx fileEditorManager = (FileEditorManagerEx) FileEditorManager.getInstance(project); if (vFile != null) { - new OpenFileDescriptor(project, vFile).navigate(true); + if (editorWindow != null) { + fileEditorManager.openFileWithProviders(vFile, true, editorWindow); + } + else { + new OpenFileDescriptor(project, vFile).navigate(true); + } } } } + + @Nullable + private EditorWindow findEditorWindow(Project project) { + final Document document = myEditor.getDocument(); + final VirtualFile file = FileDocumentManager.getInstance().getFile(document); + if (file != null) { + final FileEditorManagerEx fileEditorManager = (FileEditorManagerEx) FileEditorManager.getInstance(project); + final EditorWindow[] windows = fileEditorManager.getWindows(); + for (EditorWindow window : windows) { + final EditorWithProviderComposite composite = window.findFileComposite(file); + if (composite == null) { + continue; + } + for (FileEditor editor : composite.getEditors()) { + if (editor instanceof TextEditor && ((TextEditor)editor).getEditor() == myEditor) { + return window; + } + } + } + } + return null; + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java index 5bd2ae4b5407..879a7bbf2d74 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorComponent.java @@ -181,7 +181,7 @@ class TextEditorComponent extends JPanel implements DataProvider{ editor.getSelectionModel().addSelectionListener(myEditorSelectionListener); ((EditorEx)editor).addPropertyChangeListener(myEditorPropertyChangeListener); - ((EditorImpl) editor).setDropHandler(new FileDropHandler()); + ((EditorImpl) editor).setDropHandler(new FileDropHandler(editor)); TextEditorProvider.putTextEditor(editor, myTextEditor); return editor;