1 package com
.intellij
.ide
;
3 import com
.intellij
.openapi
.actionSystem
.DataContext
;
4 import com
.intellij
.openapi
.actionSystem
.PlatformDataKeys
;
5 import com
.intellij
.openapi
.actionSystem
.ex
.DataConstantsEx
;
6 import com
.intellij
.openapi
.extensions
.ExtensionPointName
;
7 import com
.intellij
.openapi
.extensions
.Extensions
;
8 import com
.intellij
.openapi
.project
.Project
;
9 import com
.intellij
.psi
.PsiDirectory
;
10 import com
.intellij
.psi
.PsiDirectoryContainer
;
11 import com
.intellij
.psi
.PsiElement
;
12 import com
.intellij
.psi
.PsiManager
;
13 import com
.intellij
.refactoring
.copy
.CopyHandler
;
14 import com
.intellij
.refactoring
.move
.MoveCallback
;
15 import com
.intellij
.refactoring
.move
.MoveHandler
;
16 import org
.jetbrains
.annotations
.NotNull
;
20 public abstract class CopyPasteDelegator
implements CopyPasteSupport
{
21 private static final ExtensionPointName
<PasteProvider
> EP_NAME
= ExtensionPointName
.create("com.intellij.filePasteProvider");
23 private final Project myProject
;
24 private final JComponent myKeyReceiver
;
25 private final MyEditable myEditable
;
27 public CopyPasteDelegator(Project project
, JComponent keyReceiver
) {
29 myKeyReceiver
= keyReceiver
;
30 myEditable
= new MyEditable();
34 protected abstract PsiElement
[] getSelectedElements();
37 private PsiElement
[] getValidSelectedElements() {
38 PsiElement
[] selectedElements
= getSelectedElements();
39 for (PsiElement element
: selectedElements
) {
40 if (element
== null || !element
.isValid()) {
41 return PsiElement
.EMPTY_ARRAY
;
44 return selectedElements
;
47 private void updateView() {
48 myKeyReceiver
.repaint();
51 public CopyProvider
getCopyProvider() {
55 public CutProvider
getCutProvider() {
59 public PasteProvider
getPasteProvider() {
63 private class MyEditable
implements CutProvider
, CopyProvider
, PasteProvider
{
64 public void performCopy(DataContext dataContext
) {
65 PsiElement
[] elements
= getValidSelectedElements();
66 PsiCopyPasteManager
.getInstance().setElements(elements
, true);
70 public boolean isCopyEnabled(DataContext dataContext
) {
71 PsiElement
[] elements
= getValidSelectedElements();
72 return CopyHandler
.canCopy(elements
);
75 public boolean isCopyVisible(DataContext dataContext
) {
79 public void performCut(DataContext dataContext
) {
80 PsiElement
[] elements
= getValidSelectedElements();
81 if (MoveHandler
.adjustForMove(myProject
, elements
, null) == null) {
84 // 'elements' passed instead of result of 'adjustForMove' because otherwise ProjectView would
85 // not recognize adjusted elements when graying them
86 PsiCopyPasteManager
.getInstance().setElements(elements
, false);
90 public boolean isCutEnabled(DataContext dataContext
) {
91 final PsiElement
[] elements
= getValidSelectedElements();
92 return elements
.length
!= 0 && MoveHandler
.canMove(elements
, null);
95 public boolean isCutVisible(DataContext dataContext
) {
99 public void performPaste(DataContext dataContext
) {
100 if (!performDefaultPaste(dataContext
)) {
101 for(PasteProvider provider
: Extensions
.getExtensions(EP_NAME
)) {
102 if (provider
.isPasteEnabled(dataContext
)) {
103 provider
.performPaste(dataContext
);
109 private boolean performDefaultPaste(final DataContext dataContext
) {
110 final boolean[] isCopied
= new boolean[1];
111 final PsiElement
[] elements
= PsiCopyPasteManager
.getInstance().getElements(isCopied
);
112 if (elements
== null) return false;
114 PsiElement target
= (PsiElement
)dataContext
.getData(DataConstantsEx
.PASTE_TARGET_PSI_ELEMENT
);
116 PsiDirectory targetDirectory
= target
instanceof PsiDirectory ?
(PsiDirectory
)target
: null;
117 if (targetDirectory
== null && target
instanceof PsiDirectoryContainer
) {
118 final PsiDirectory
[] directories
= ((PsiDirectoryContainer
)target
).getDirectories();
119 if (directories
.length
> 0) {
120 targetDirectory
= directories
[0];
123 if (CopyHandler
.canCopy(elements
)) {
124 CopyHandler
.doCopy(elements
, targetDirectory
);
127 else if (MoveHandler
.canMove(elements
, target
)) {
128 MoveHandler
.doMove(myProject
, elements
, target
, new MoveCallback() {
129 public void refactoringCompleted() {
130 PsiCopyPasteManager
.getInstance().clear();
144 public boolean isPastePossible(DataContext dataContext
) {
148 public boolean isPasteEnabled(DataContext dataContext
){
149 if (isDefaultPasteEnabled(dataContext
)) {
152 for(PasteProvider provider
: Extensions
.getExtensions(EP_NAME
)) {
153 if (provider
.isPasteEnabled(dataContext
)) {
160 private boolean isDefaultPasteEnabled(final DataContext dataContext
) {
161 Project project
= PlatformDataKeys
.PROJECT
.getData(dataContext
);
162 if (project
== null) {
166 Object target
= dataContext
.getData(DataConstantsEx
.PASTE_TARGET_PSI_ELEMENT
);
167 if (target
== null) {
170 PsiElement
[] elements
= PsiCopyPasteManager
.getInstance().getElements(new boolean[]{false});
171 if (elements
== null) {
175 // disable cross-project paste
176 for (PsiElement element
: elements
) {
177 PsiManager manager
= element
.getManager();
178 if (manager
== null || manager
.getProject() != project
) {