From ebecc7b8ace38fae21d93c0d4d57f2d8f39d51b6 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Wed, 18 Sep 2013 17:22:50 +0400 Subject: [PATCH] J2K: Convert a Java code from clipboard only when paste it (to Kotlin file) instead of when copy to clipboard. --- .../{ConvertedCode.java => CopiedCode.java} | 25 ++++-- .../copy/JavaCopyPastePostProcessor.java | 88 +++++++++---------- 2 files changed, 62 insertions(+), 51 deletions(-) rename idea/src/org/jetbrains/jet/plugin/conversion/copy/{ConvertedCode.java => CopiedCode.java} (70%) diff --git a/idea/src/org/jetbrains/jet/plugin/conversion/copy/ConvertedCode.java b/idea/src/org/jetbrains/jet/plugin/conversion/copy/CopiedCode.java similarity index 70% rename from idea/src/org/jetbrains/jet/plugin/conversion/copy/ConvertedCode.java rename to idea/src/org/jetbrains/jet/plugin/conversion/copy/CopiedCode.java index e9af4d9cebc..e16de5af9ee 100644 --- a/idea/src/org/jetbrains/jet/plugin/conversion/copy/ConvertedCode.java +++ b/idea/src/org/jetbrains/jet/plugin/conversion/copy/CopiedCode.java @@ -17,17 +17,22 @@ package org.jetbrains.jet.plugin.conversion.copy; import com.intellij.codeInsight.editorActions.TextBlockTransferableData; +import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; import java.awt.datatransfer.DataFlavor; -class ConvertedCode implements TextBlockTransferableData { +class CopiedCode implements TextBlockTransferableData { @NotNull public static final DataFlavor DATA_FLAVOR = new DataFlavor(JavaCopyPastePostProcessor.class, "class: JavaCopyPastePostProcessor"); - private final String data; + private final PsiFile file; + private final int[] startOffsets; + private final int[] endOffsets; - ConvertedCode(String data) { - this.data = data; + public CopiedCode(PsiFile file, int[] startOffsets, int[] endOffsets) { + this.file = file; + this.startOffsets = startOffsets; + this.endOffsets = endOffsets; } @NotNull @@ -51,7 +56,15 @@ class ConvertedCode implements TextBlockTransferableData { return index; } - public String getData() { - return data; + public PsiFile getFile() { + return file; + } + + public int[] getStartOffsets() { + return startOffsets; + } + + public int[] getEndOffsets() { + return endOffsets; } } diff --git a/idea/src/org/jetbrains/jet/plugin/conversion/copy/JavaCopyPastePostProcessor.java b/idea/src/org/jetbrains/jet/plugin/conversion/copy/JavaCopyPastePostProcessor.java index 976a91b5e3c..c93195cbe68 100644 --- a/idea/src/org/jetbrains/jet/plugin/conversion/copy/JavaCopyPastePostProcessor.java +++ b/idea/src/org/jetbrains/jet/plugin/conversion/copy/JavaCopyPastePostProcessor.java @@ -25,10 +25,7 @@ import com.intellij.openapi.editor.RangeMarker; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.PsiDocumentManager; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiJavaFile; +import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.lang.psi.JetFile; @@ -40,28 +37,16 @@ import java.util.List; public class JavaCopyPastePostProcessor implements CopyPastePostProcessor { private static final Logger LOG = Logger.getInstance("#org.jetbrains.jet.plugin.conversion.copy.JavaCopyPastePostProcessor"); + private static final String EOL = System.getProperty("line.separator"); @Override public TextBlockTransferableData collectTransferableData(@NotNull PsiFile file, Editor editor, @NotNull int[] startOffsets, @NotNull int[] endOffsets) { - try { - if (!(file instanceof PsiJavaFile)) { - return null; - } - String eol = System.getProperty("line.separator"); - List buffer = getSelectedElements(file, startOffsets, endOffsets); - StringBuilder result = new StringBuilder(); - - for (PsiElement e : buffer) { - String converted = new Converter(file.getProject()).elementToKotlin(e); - if (!converted.isEmpty()) { - result.append(converted).append(eol); - } - } - return new ConvertedCode(StringUtil.convertLineSeparators(result.toString())); - } catch (Throwable t) { - LOG.error(t); + if (!(file instanceof PsiJavaFile)) { + return null; } - return null; + + PsiFile lightFile = PsiFileFactory.getInstance(file.getProject()).createFileFromText(file.getText(), file); + return new CopiedCode(lightFile, startOffsets, endOffsets); } @NotNull @@ -91,8 +76,8 @@ public class JavaCopyPastePostProcessor implements CopyPastePostProcessor indented, @NotNull TextBlockTransferableData value) { - try { - final PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()); - if (!(file instanceof JetFile)) { - return; + if (!(value instanceof CopiedCode)) return; + + final PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()); + if (!(file instanceof JetFile)) return; + + JetEditorOptions jetEditorOptions = JetEditorOptions.getInstance(); + boolean needConvert = jetEditorOptions.isEnableJavaToKotlinConversion() && (jetEditorOptions.isDonTShowConversionDialog() || okFromDialog(project)); + if (needConvert) { + final String text = convertCopiedCodeToKotlin((CopiedCode) value, file); + + if (!text.isEmpty()) { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + editor.getDocument().replaceString(bounds.getStartOffset(), bounds.getEndOffset(), text); + editor.getCaretModel().moveToOffset(bounds.getStartOffset() + text.length()); + PsiDocumentManager.getInstance(file.getProject()).commitDocument(editor.getDocument()); + } + }); } - JetEditorOptions jetEditorOptions = JetEditorOptions.getInstance(); - boolean needConvert = jetEditorOptions.isEnableJavaToKotlinConversion() && (jetEditorOptions.isDonTShowConversionDialog() || okFromDialog(project)); - if (needConvert) { - if (value instanceof ConvertedCode) { - final String text = ((ConvertedCode) value).getData(); - ApplicationManager.getApplication().runWriteAction(new Runnable() { - @Override - public void run() { - editor.getDocument().replaceString(bounds.getStartOffset(), bounds.getEndOffset(), text); - editor.getCaretModel().moveToOffset(bounds.getStartOffset() + text.length()); - PsiDocumentManager.getInstance(file.getProject()).commitDocument(editor.getDocument()); - } - }); - } - } - } catch (Throwable t) { - LOG.error(t); } } + private static String convertCopiedCodeToKotlin(CopiedCode code, PsiFile file) { + List buffer = getSelectedElements(code.getFile(), code.getStartOffsets(), code.getEndOffsets()); + + Project project = file.getProject(); + StringBuilder result = new StringBuilder(); + for (PsiElement e : buffer) { + String converted = new Converter(project).elementToKotlin(e); + if (!converted.isEmpty()) { + result.append(converted).append(EOL); + } + } + + return StringUtil.convertLineSeparators(result.toString()); + } + private static boolean okFromDialog(@NotNull Project project) { KotlinPasteFromJavaDialog dialog = new KotlinPasteFromJavaDialog(project); dialog.show();