1 package com
.intellij
.ide
;
3 import com
.intellij
.lang
.StdLanguages
;
4 import com
.intellij
.openapi
.actionSystem
.DataContext
;
5 import com
.intellij
.openapi
.actionSystem
.DataKeys
;
6 import com
.intellij
.openapi
.application
.ApplicationManager
;
7 import com
.intellij
.openapi
.command
.CommandProcessor
;
8 import com
.intellij
.openapi
.editor
.Document
;
9 import com
.intellij
.openapi
.fileEditor
.OpenFileDescriptor
;
10 import com
.intellij
.openapi
.ide
.CopyPasteManager
;
11 import com
.intellij
.openapi
.project
.Project
;
12 import com
.intellij
.openapi
.util
.TextRange
;
13 import com
.intellij
.psi
.*;
14 import com
.intellij
.psi
.codeStyle
.CodeStyleManager
;
15 import com
.intellij
.util
.IncorrectOperationException
;
16 import org
.jetbrains
.annotations
.Nullable
;
18 import java
.awt
.datatransfer
.DataFlavor
;
19 import java
.awt
.datatransfer
.Transferable
;
24 public class JavaFilePasteProvider
implements PasteProvider
{
25 public void performPaste(final DataContext dataContext
) {
26 final Project project
= DataKeys
.PROJECT
.getData(dataContext
);
27 final IdeView ideView
= DataKeys
.IDE_VIEW
.getData(dataContext
);
28 if (project
== null || ideView
== null) return;
29 final PsiJavaFile javaFile
= createJavaFileFromClipboardContent(project
);
30 if (javaFile
== null) return;
31 final PsiClass
[] classes
= javaFile
.getClasses();
32 if (classes
.length
!= 1) return;
33 final PsiDirectory targetDir
= ideView
.getOrChooseDirectory();
34 if (targetDir
== null) return;
35 ApplicationManager
.getApplication().runWriteAction(new Runnable() {
39 file
= targetDir
.createFile(classes
[0].getName() + ".java");
41 catch (IncorrectOperationException e
) {
44 final Document document
= PsiDocumentManager
.getInstance(project
).getDocument(file
);
45 document
.setText(javaFile
.getText());
46 PsiDocumentManager
.getInstance(project
).commitDocument(document
);
47 if (file
instanceof PsiJavaFile
) {
48 updatePackageStatement((PsiJavaFile
) file
, targetDir
);
50 new OpenFileDescriptor(project
, file
.getVirtualFile()).navigate(true);
55 private static void updatePackageStatement(final PsiJavaFile javaFile
, final PsiDirectory targetDir
) {
56 final PsiPackage aPackage
= JavaDirectoryService
.getInstance().getPackage(targetDir
);
57 if (aPackage
== null) return;
58 final PsiPackageStatement oldStatement
= javaFile
.getPackageStatement();
59 final Project project
= javaFile
.getProject();
60 if ((oldStatement
!= null && !oldStatement
.getPackageName().equals(aPackage
.getQualifiedName()) ||
61 (oldStatement
== null && aPackage
.getQualifiedName().length() > 0))) {
62 CommandProcessor
.getInstance().executeCommand(project
, new Runnable() {
65 PsiElementFactory factory
= JavaPsiFacade
.getInstance(project
).getElementFactory();
66 final PsiPackageStatement newStatement
= factory
.createPackageStatement(aPackage
.getQualifiedName());
67 if (oldStatement
!= null) {
68 oldStatement
.replace(newStatement
);
71 final PsiElement addedStatement
= javaFile
.addAfter(newStatement
, null);
72 final TextRange textRange
= addedStatement
.getTextRange();
73 // ensure line break is added after the statement
74 CodeStyleManager
.getInstance(project
).reformatRange(javaFile
, textRange
.getStartOffset(), textRange
.getEndOffset()+1);
77 catch (IncorrectOperationException e
) {
81 }, "Updating package statement", null);
85 public boolean isPastePossible(final DataContext dataContext
) {
89 public boolean isPasteEnabled(final DataContext dataContext
) {
90 final Project project
= DataKeys
.PROJECT
.getData(dataContext
);
91 final IdeView ideView
= DataKeys
.IDE_VIEW
.getData(dataContext
);
92 if (project
== null || ideView
== null || ideView
.getDirectories().length
== 0) {
95 PsiJavaFile file
= createJavaFileFromClipboardContent(project
);
96 return file
!= null && file
.getClasses().length
== 1;
100 private static PsiJavaFile
createJavaFileFromClipboardContent(final Project project
) {
101 PsiJavaFile file
= null;
102 Transferable content
= CopyPasteManager
.getInstance().getContents();
103 if (content
!= null) {
106 text
= (String
)content
.getTransferData(DataFlavor
.stringFlavor
);
108 catch (Exception e
) {
112 file
= (PsiJavaFile
) PsiFileFactory
.getInstance(project
).createFileFromText("A.java", StdLanguages
.JAVA
, text
);