Skip to content

Commit

Permalink
Optimize the behavior of the 'Translate Document' action
Browse files Browse the repository at this point in the history
issue: #5973
  • Loading branch information
YiiGuxing committed Sep 16, 2024
1 parent bbfbea4 commit 35c7047
Show file tree
Hide file tree
Showing 10 changed files with 117 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,9 @@ import com.intellij.openapi.util.registry.Registry
import com.intellij.openapi.wm.ToolWindowId
import com.intellij.openapi.wm.ToolWindowManager
import com.intellij.util.concurrency.AppExecutorUtil
import icons.TranslationIcons
import javax.swing.Icon

open class ToggleQuickDocTranslationAction :
FixedIconToggleAction(
TranslationIcons.Documentation,
{ adaptedMessage("action.ToggleQuickDocTranslationAction.text") }
),
ToggleableTranslationAction(),
HintManagerImpl.ActionToIgnore,
ImportantTranslationAction {

Expand All @@ -42,26 +37,27 @@ open class ToggleQuickDocTranslationAction :

private fun documentationBrowser(dc: DataContext): DocumentationBrowserCompat? = DocumentationBrowserCompat.get(dc)

final override fun update(e: AnActionEvent) {
super.update(e)
val project = e.project
final override fun update(event: AnActionEvent, isSelected: Boolean) {
val presentation = event.presentation
presentation.text = adaptedMessage(
if (isSelected) "action.ToggleQuickDocTranslationAction.text.original"
else "action.ToggleQuickDocTranslationAction.text"
)

val project = event.project
if (project == null) {
e.presentation.isEnabled = false
presentation.isEnabled = false
return
}

if (isDocumentationV2) {
e.presentation.isEnabledAndVisible = documentationBrowser(e.dataContext)
presentation.isEnabledAndVisible = documentationBrowser(event.dataContext)
?.targetElement
.let { it != null && DocTranslationService.isSupportedForPsiElement(it) }
return
}

update(project, e)
}

override fun getIcon(place: String, selected: Boolean): Icon? {
return if (ActionPlaces.JAVADOC_TOOLBAR != place && selected) null else icon
update(project, event)
}

private fun update(project: Project, e: AnActionEvent) {
Expand All @@ -82,10 +78,10 @@ open class ToggleQuickDocTranslationAction :
activeDocComponent != null && (isDocMenuPlace || toolWindow == null || toolWindow.isActive)
}

override fun isSelected(e: AnActionEvent): Boolean {
val project = e.project ?: return false
override fun isSelected(event: AnActionEvent): Boolean {
val project = event.project ?: return false
val state = if (isDocumentationV2) {
documentationBrowser(e.dataContext)?.targetElement?.let {
documentationBrowser(event.dataContext)?.targetElement?.let {
DocTranslationService.getTranslationState(it)
}
} else {
Expand All @@ -97,10 +93,10 @@ open class ToggleQuickDocTranslationAction :
return state ?: Settings.getInstance().translateDocumentation
}

override fun setSelected(e: AnActionEvent, state: Boolean) {
val project = e.project ?: return
override fun setSelected(event: AnActionEvent, state: Boolean) {
val project = event.project ?: return
if (isDocumentationV2) {
documentationBrowser(e.dataContext)?.apply {
documentationBrowser(event.dataContext)?.apply {
targetElement?.let { DocTranslationService.setTranslationState(it, state) }
reload()
}
Expand Down Expand Up @@ -143,5 +139,4 @@ open class ToggleQuickDocTranslationAction :
}
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
@file:Suppress("unused")

package cn.yiiguxing.plugin.translate.action

import cn.yiiguxing.intellij.compat.action.UpdateInBackgroundCompatAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.Presentation
import com.intellij.openapi.util.Key
import com.intellij.openapi.util.NlsActions
import icons.TranslationIcons
import java.util.function.Supplier


abstract class ToggleableTranslationAction : UpdateInBackgroundCompatAction {

constructor() : super()

@JvmOverloads
constructor(
text: @NlsActions.ActionText String,
description: @NlsActions.ActionDescription String? = null,
) : this(
text.toPresentationText(),
description.toPresentationText(),
)

@JvmOverloads
constructor(
dynamicText: Supplier<@NlsActions.ActionText String?>,
dynamicDescription: Supplier<@NlsActions.ActionDescription String?> = Presentation.NULL_STRING,
) : super(dynamicText, dynamicDescription, null)

protected abstract fun isSelected(event: AnActionEvent): Boolean

protected abstract fun setSelected(event: AnActionEvent, state: Boolean)

final override fun update(event: AnActionEvent) {
val state = isSelected(event)
with(event.presentation) {
isTranslationSelected = state
icon = if (state) TranslationIcons.Translation else TranslationIcons.TranslationInactivated
}
update(event, state)
}

protected open fun update(event: AnActionEvent, isSelected: Boolean) {
}

final override fun actionPerformed(event: AnActionEvent) {
val state = !isSelected(event)
setSelected(event, state)
event.presentation.isTranslationSelected = state
}

companion object {
private val TRANSLATION_SELECTED_KEY: Key<Boolean> = Key.create("translation-selected")

internal var Presentation.isTranslationSelected: Boolean
set(value) = putClientProperty(TRANSLATION_SELECTED_KEY, value)
get() = getClientProperty(TRANSLATION_SELECTED_KEY) == true

private fun String?.toPresentationText(): Supplier<String?> = when (this) {
null -> Presentation.NULL_STRING
else -> Supplier { this }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,47 +2,46 @@ package cn.yiiguxing.plugin.translate.documentation

import cn.yiiguxing.intellij.compat.DocumentationRenderingCompat
import cn.yiiguxing.intellij.compat.instance
import cn.yiiguxing.plugin.translate.action.FixedIconToggleAction
import cn.yiiguxing.plugin.translate.action.ToggleableTranslationAction
import cn.yiiguxing.plugin.translate.adaptedMessage
import cn.yiiguxing.plugin.translate.util.concurrent.finishOnUiThread
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.Toggleable
import com.intellij.openapi.application.ModalityState
import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiDocCommentBase
import icons.TranslationIcons

internal class TranslateRenderedDocAction(
private val editor: Editor,
private val docComment: PsiDocCommentBase
) : FixedIconToggleAction(
TranslationIcons.Documentation,
{ adaptedMessage("action.TranslateRenderedDocAction.text") }
) {
) : ToggleableTranslationAction() {

private val isEnabled: Boolean by lazy { DocTranslationService.isSupportedForPsiElement(docComment) }

override fun update(e: AnActionEvent) {
super.update(e)
e.presentation.isEnabledAndVisible = isEnabled
override fun update(event: AnActionEvent, isSelected: Boolean) {
val presentation = event.presentation
presentation.isEnabledAndVisible = isEnabled
presentation.text = adaptedMessage(
if (isSelected) "action.TranslateRenderedDocAction.text.original"
else "action.TranslateRenderedDocAction.text"
)
}

override fun isSelected(event: AnActionEvent): Boolean {
return DocTranslationService.isInlayDocTranslated(docComment)
}

override fun setSelected(event: AnActionEvent, value: Boolean) {
override fun setSelected(event: AnActionEvent, state: Boolean) {
val editor = editor.takeUnless { it.isDisposed } ?: return
val file = docComment.containingFile ?: return

DocTranslationService.setInlayDocTranslated(docComment, value)
DocTranslationService.setInlayDocTranslated(docComment, state)
DocumentationRenderingCompat
.instance()
.update(editor, file)
.finishOnUiThread(ModalityState.current()) {
if (it != true) {
DocTranslationService.setInlayDocTranslated(docComment, !value)
Toggleable.setSelected(event.presentation, !value)
DocTranslationService.setInlayDocTranslated(docComment, !state)
event.presentation.isTranslationSelected = !state
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions src/main/kotlin/icons/TranslationIcons.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ object TranslationIcons {
@JvmField
val Translation: Icon = load("/icons/translation.svg")

@JvmField
val TranslationInactivated: Icon = load("/icons/translationInactivated.svg")

@JvmField
val TranslationReplace: Icon = load("/icons/translationReplace.svg")

Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/icons/translationInactivated.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions src/main/resources/icons/translationInactivated_dark.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions src/main/resources/messages/TranslationBundle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,9 @@ action.WhatsNewAction.text=What's New
action.PinBalloonAction.text=Open as Translation Dialog
action.GettingStartedAction.text=Getting Started
action.ToggleQuickDocTranslationAction.text=Translate Documentation
action.ToggleQuickDocTranslationAction.text.original=Show Original Documentation
action.TranslateRenderedDocAction.text=Translate Documentation
action.TranslateRenderedDocAction.text.original=Show Original Documentation
action.TranslateRenderedDocSelectionAction.text=Translate Selection
action.TranslateQuickDocSelectionAction.text=Translate Selection
action.check.configuration=Check configuration
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/messages/TranslationBundle_ja.properties
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,9 @@ action.WhatsNewAction.text=最新の変更
action.PinBalloonAction.text=翻訳ダイアログとして開く
action.GettingStartedAction.text=はじめに
action.ToggleQuickDocTranslationAction.text=ドキュメントを翻訳する
action.ToggleQuickDocTranslationAction.text.original=元のドキュメントを表示
action.TranslateRenderedDocAction.text=ドキュメントを翻訳する
action.TranslateRenderedDocAction.text.original=元のドキュメントを表示
action.TranslateRenderedDocSelectionAction.text=選択したテキストを翻訳する
action.TranslateQuickDocSelectionAction.text=選択したテキストを翻訳する
action.check.configuration=構成を確認してください
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/messages/TranslationBundle_ko.properties
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,9 @@ action.WhatsNewAction.text=최신 변경사항
action.PinBalloonAction.text=번역 대화상자로 열기
action.GettingStartedAction.text=시작하기
action.ToggleQuickDocTranslationAction.text=문서 번역
action.ToggleQuickDocTranslationAction.text.original=원본 문서를 표시
action.TranslateRenderedDocAction.text=문서 번역
action.TranslateRenderedDocAction.text.original=원본 문서를 표시
action.TranslateRenderedDocSelectionAction.text=선택한 텍스트 번역
action.TranslateQuickDocSelectionAction.text=선택한 텍스트 번역
action.check.configuration=구성 확인
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,9 @@ action.WhatsNewAction.text=最新变化
action.PinBalloonAction.text=作为翻译对话框打开
action.GettingStartedAction.text=入门指南
action.ToggleQuickDocTranslationAction.text=翻译文档
action.ToggleQuickDocTranslationAction.text.original=显示原文档
action.TranslateRenderedDocAction.text=翻译文档
action.TranslateRenderedDocAction.text.original=显示原文档
action.TranslateRenderedDocSelectionAction.text=翻译选中的文本
action.TranslateQuickDocSelectionAction.text=翻译选中的文本
action.check.configuration=检查配置
Expand Down

0 comments on commit 35c7047

Please sign in to comment.