package cn.yiiguxing.plugin.translate;
import cn.yiiguxing.plugin.translate.ui.TranslationBalloon;
import cn.yiiguxing.plugin.translate.ui.TranslationDialog;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.RangeMarker;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* UI管理器
*/
@SuppressWarnings("WeakerAccess")
public class TranslationUiManager {
private TranslationBalloon myShowingBalloon;
private TranslationDialog myShowingDialog;
private TranslationUiManager() {
}
/**
* @return {@link TranslationUiManager} 实例
*/
public static TranslationUiManager getInstance() {
return ServiceManager.getService(TranslationUiManager.class);
}
/**
* 显示翻译气泡
*
* @param editor 编辑器
* @param caretRangeMarker 光标范围
* @param queryText 查询客串
* @return 气泡实例
*/
public TranslationBalloon showTranslationBalloon(@NotNull Editor editor,
@NotNull RangeMarker caretRangeMarker,
@NotNull String queryText) {
if (myShowingBalloon != null) {
myShowingBalloon.hide();
}
myShowingBalloon = new TranslationBalloon(editor, caretRangeMarker);
Disposer.register(myShowingBalloon.getDisposable(), new Disposable() {
@Override
public void dispose() {
myShowingBalloon = null;
}
});
myShowingBalloon.showAndQuery(queryText);
return myShowingBalloon;
}
/**
* 显示对话框
*
* @return 对话框实例
*/
@NotNull
public TranslationDialog showTranslationDialog(@Nullable Project project) {
if (myShowingDialog == null) {
myShowingDialog = new TranslationDialog(project);
Disposer.register(myShowingDialog.getDisposable(), new Disposable() {
@Override
public void dispose() {
myShowingDialog = null;
}
});
}
myShowingDialog.show();
return myShowingDialog;
}
/**
* 测试是否有正在显示的对话框
*/
public boolean hasTranslationDialogShowing() {
return myShowingDialog != null && myShowingDialog.isShowing();
}
/**
* 更新当前显示的对话框
*/
public void updateCurrentShowingTranslationDialog() {
if (hasTranslationDialogShowing()) {
myShowingDialog.update();
}
}
/**
* 如果有对话框正在显示,则返回当前显示的对话框,否则返回null.
*/
@Nullable
public TranslationDialog getCurrentShowingDialog() {
if (hasTranslationDialogShowing()) {
return myShowingDialog;
}
return null;
}
}