open dropped files in correct frame (IDEA-80230)

This commit is contained in:
Dmitry Jemerov
2012-01-23 19:27:07 +01:00
parent 445ef70792
commit 019b7e709c
5 changed files with 54 additions and 12 deletions
@@ -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);
}
@@ -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;
}
@@ -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;
@@ -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<File> fileList = FileCopyPasteUtil.getFileList(t);
if (fileList != null) {
openFiles(project, fileList);
openFiles(project, fileList, editorWindow);
}
}
private static void openFiles(final Project project, final List<File> fileList) {
private void openFiles(final Project project, final List<File> 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;
}
}
@@ -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;