package org.plantuml.idea.intentions; import com.intellij.codeInsight.intention.impl.BaseIntentionAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiFile; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.plantuml.idea.lang.PlantUmlFileType; import org.plantuml.idea.lang.annotator.LanguageDescriptor; public class AddPartialRenderOptionIntention extends BaseIntentionAction { public static final Logger logger = Logger.getInstance(AddPartialRenderOptionIntention.class); public AddPartialRenderOptionIntention() { } @NotNull @Override public String getFamilyName() { return "Enable partial rendering"; } @NotNull protected String option() { return LanguageDescriptor.IDEA_PARTIAL_RENDER; } @NotNull @Override public String getText() { return getFamilyName(); } @Override public boolean isAvailable(@NotNull Project project, final Editor editor, PsiFile file) { if (!file.getFileType().equals(PlantUmlFileType.PLANTUML_FILE_TYPE)) return false; int offset = editor.getCaretModel().getOffset(); return new AddPartialRenderCommand(editor, offset).isAvailable(); } @Override public void invoke(@NotNull Project project, final Editor editor, PsiFile psiFile) throws IncorrectOperationException { new AddPartialRenderCommand(editor, editor.getCaretModel().getOffset()).invoke(); } private class AddPartialRenderCommand { private Editor editor; protected int caretOffset; public AddPartialRenderCommand(Editor editor, int caretOffset) { this.editor = editor; this.caretOffset = caretOffset; } public boolean isAvailable() { return invoke(true); } public boolean invoke() { return invoke(false); } private boolean invoke(boolean validateOnly) { Document document = editor.getDocument(); int lineNumber = document.getLineNumber(caretOffset); int lineStartOffset = document.getLineStartOffset(lineNumber); int lineEndOffset = document.getLineEndOffset(lineNumber); String line = document.getText(TextRange.create(lineStartOffset, lineEndOffset)); boolean start = line.contains("@startuml") || line.contains("startuml") || line.contains("@startditaa") || line.contains("@startdot"); if (!validateOnly && start) { document.replaceString(lineEndOffset, lineEndOffset, "\n'" + option()); } return start; } } }