package cn.yiiguxing.plugin.translate; import cn.yiiguxing.plugin.translate.model.QueryResult; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.util.List; public class TranslationPresenter implements TranslationContract.Presenter { private final AppStorage mAppStorage; private final Translator mTranslator; private final TranslationContract.View mTranslationView; private String mCurrentQuery; public TranslationPresenter(@NotNull TranslationContract.View view) { mTranslator = Translator.getInstance(); this.mTranslationView = view; mAppStorage = AppStorage.getInstance(); } @NotNull @Override public List<String> getHistory() { return mAppStorage.getHistories(); } @Nullable @Override public QueryResult getCache(String query) { if (Utils.isEmptyOrBlankString(query)) return null; return mTranslator.getCache(query); } @Override public void query(@Nullable String query) { if (Utils.isEmptyOrBlankString(query) || query.equals(mCurrentQuery)) return; query = query.trim(); mAppStorage.addHistory(query); mCurrentQuery = query; // 防止内存泄漏 final Reference<TranslationPresenter> presenterRef = new WeakReference<TranslationPresenter>(this); mTranslator.query(query, new Translator.Callback() { @Override public void onQuery(final String query, final QueryResult result) { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { TranslationPresenter presenter = presenterRef.get(); if (presenter != null) { presenter.onPostResult(query, result); } } }, ModalityState.any()); } }); } private void onPostResult(String query, QueryResult result) { if (Utils.isEmptyOrBlankString(query) || !query.equals(mCurrentQuery)) return; mCurrentQuery = null; String errorMessage = Utils.getErrorMessage(result); if (errorMessage != null) { mTranslationView.showError(query, errorMessage); } else { mTranslationView.showResult(query, result); } } }