diff --git a/python/src/META-INF/python-plugin-common.xml b/python/src/META-INF/python-plugin-common.xml index 6a8d177968b3..604fa674b2ce 100644 --- a/python/src/META-INF/python-plugin-common.xml +++ b/python/src/META-INF/python-plugin-common.xml @@ -1001,6 +1001,12 @@ + + + + + diff --git a/python/src/com/jetbrains/python/actions/PyFillParagraphAction.java b/python/src/com/jetbrains/python/actions/PyFillParagraphAction.java new file mode 100644 index 000000000000..c665f6fc4037 --- /dev/null +++ b/python/src/com/jetbrains/python/actions/PyFillParagraphAction.java @@ -0,0 +1,90 @@ +package com.jetbrains.python.actions; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiComment; +import com.intellij.psi.PsiElement; +import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.util.PsiTreeUtil; +import com.jetbrains.python.psi.PyFile; +import com.jetbrains.python.psi.PyStringLiteralExpression; + +/** + * User : ktisha + */ +public class PyFillParagraphAction extends AnAction { + @Override + public void actionPerformed(AnActionEvent e) { + final Project project = e.getData(PlatformDataKeys.PROJECT); + if (project == null) return; + + PsiElement element = e.getData(LangDataKeys.PSI_ELEMENT); + if (element == null) { + final PsiElement file = e.getData(LangDataKeys.PSI_FILE); + Editor editor = e.getData(PlatformDataKeys.EDITOR); + if (file != null && editor != null) { + final int offset = editor.getCaretModel().getOffset(); + element = file.findElementAt(offset); + } + } + + if (!(element instanceof PsiComment)) + element = PsiTreeUtil.getParentOfType(element, PyStringLiteralExpression.class); + + if (element != null) { + final TextRange textRange = getTextRange(element); + final PsiElement finalElement = element; + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + CodeStyleManager.getInstance(project).reformatRange(finalElement.getContainingFile(), textRange.getStartOffset(), + textRange.getEndOffset()); + } + }); + + } + } + + private static TextRange getTextRange(PsiElement element) { + if (element instanceof PyStringLiteralExpression) + return element.getTextRange(); + + PsiElement prev = PsiTreeUtil.skipSiblingsBackward(element, PsiComment.class); + PsiElement next = PsiTreeUtil.skipSiblingsForward(element, PsiComment.class); + + final int startOffset = prev != null? prev.getTextRange().getStartOffset() : element.getTextRange().getStartOffset(); + final int endOffset = next != null? next.getTextRange().getEndOffset() : element.getTextRange().getEndOffset(); + return TextRange.create(startOffset, endOffset); + } + + + @Override + public void update(AnActionEvent e) { + PsiElement element = e.getData(LangDataKeys.PSI_ELEMENT); + final PsiElement file = e.getData(LangDataKeys.PSI_FILE); + if (!(file instanceof PyFile)) { + e.getPresentation().setEnabled(false); + return; + } + if (element == null) { + Editor editor = e.getData(PlatformDataKeys.EDITOR); + if (editor != null) { + final int offset = editor.getCaretModel().getOffset(); + element = file.findElementAt(offset); + } + } + if (element != null) { + final PyStringLiteralExpression stringLiteral = PsiTreeUtil.getParentOfType(element, PyStringLiteralExpression.class); + e.getPresentation().setEnabled(stringLiteral != null || element instanceof PsiComment); + } + else { + e.getPresentation().setEnabled(false); + } + } +}