package cn.yiiguxing.plugin.translate.action;
import cn.yiiguxing.plugin.translate.TranslationUiManager;
import cn.yiiguxing.plugin.translate.Utils;
import cn.yiiguxing.plugin.translate.ui.Icons;
import cn.yiiguxing.plugin.translate.ui.TranslationBalloon;
import com.intellij.codeInsight.highlighting.HighlightManager;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.RangeMarker;
import com.intellij.openapi.editor.markup.EffectType;
import com.intellij.openapi.editor.markup.RangeHighlighter;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.TextRange;
import com.intellij.ui.JBColor;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
import java.util.ArrayList;
/**
* 翻译动作
*/
@SuppressWarnings("WeakerAccess")
public class TranslateAction extends AutoSelectAction implements DumbAware {
private static final TextAttributes HIGHLIGHT_ATTRIBUTES;
static {
TextAttributes attributes = new TextAttributes();
attributes.setBackgroundColor(new JBColor(new Color(0xFFE4E4FF), new Color(0xFF344134)));
attributes.setEffectType(EffectType.LINE_UNDERSCORE);
attributes.setEffectColor(new JBColor(0xFFEE6000, 0xFFCC7832));
HIGHLIGHT_ATTRIBUTES = attributes;
}
/**
* @param checkSelection 指定是否检查手动选择的文本。<code>true</code> - 如果有手动选择文本,
* 则忽略<code>autoSelectionMode</code>, <code>false</code> - 将忽略手动选择的文本。
*/
public TranslateAction(boolean checkSelection) {
super(Icons.Translate, checkSelection);
}
/**
* 自动从最大范围内取词,忽略选择
*/
@SuppressWarnings("unused")
public TranslateAction() {
this(false);
}
/**
* 返回取词模式
*/
@NotNull
@Override
protected AutoSelectionMode getAutoSelectionMode() {
return AutoSelectionMode.INCLUSIVE;
}
@Override
protected void onUpdate(AnActionEvent e, boolean active) {
e.getPresentation().setEnabledAndVisible(active);
}
@Override
protected void onActionPerformed(AnActionEvent e, @NotNull final Editor editor, @NotNull TextRange selectionRange) {
final String queryText = Utils.splitWord(editor.getDocument().getText(selectionRange));
if (!Utils.isEmptyOrBlankString(queryText)) {
final Project project = editor.getProject();
final ArrayList<RangeHighlighter> highlighters = new ArrayList<RangeHighlighter>();
final HighlightManager highlightManager = project == null ? null : HighlightManager.getInstance(project);
if (highlightManager != null) {
highlightManager.addRangeHighlight(editor, selectionRange.getStartOffset(),
selectionRange.getEndOffset(), HIGHLIGHT_ATTRIBUTES, true, highlighters);
}
RangeMarker caretRangeMarker = createCaretRangeMarker(editor, selectionRange);
TranslationBalloon translationBalloon = TranslationUiManager.getInstance()
.showTranslationBalloon(editor, caretRangeMarker, queryText);
if (!highlighters.isEmpty() && highlightManager != null) {
Disposer.register(translationBalloon.getDisposable(), new Disposable() {
@Override
public void dispose() {
for (RangeHighlighter highlighter : highlighters) {
highlighter.dispose();
}
}
});
}
}
}
@NotNull
private RangeMarker createCaretRangeMarker(@NotNull Editor editor, @NotNull TextRange selectionRange) {
RangeMarker myCaretRangeMarker = editor.getDocument().createRangeMarker(selectionRange);
myCaretRangeMarker.setGreedyToLeft(true);
myCaretRangeMarker.setGreedyToRight(true);
return myCaretRangeMarker;
}
}