package cn.yiiguxing.plugin.translate.ui;
import cn.yiiguxing.plugin.translate.AppStorage;
import cn.yiiguxing.plugin.translate.Settings;
import cn.yiiguxing.plugin.translate.Utils;
import cn.yiiguxing.plugin.translate.action.AutoSelectionMode;
import cn.yiiguxing.plugin.translate.compat.IdeaCompat;
import com.intellij.icons.AllIcons;
import com.intellij.ide.browsers.BrowserLauncher;
import com.intellij.ide.browsers.WebBrowser;
import com.intellij.ide.browsers.WebBrowserManager;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.ui.FontComboBox;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.ListCellRendererWrapper;
import com.intellij.ui.components.labels.ActionLink;
import com.intellij.ui.components.labels.LinkLabel;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ui.JBUI;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
/**
* 设置页
*/
@SuppressWarnings("Since15")
public class SettingsPanel {
private static final String API_KEY_URL = "http://fanyi.youdao.com/openapi?path=data-mode";
private static final int INDEX_INCLUSIVE = 0;
private static final int INDEX_EXCLUSIVE = 1;
private JPanel mWholePanel;
private JPanel mSelectionSettingsPanel;
private JPanel mApiKeySettingsPanel;
private JComboBox<String> mSelectionMode;
private JTextField mKeyNameField;
private JTextField mKeyValueField;
private JCheckBox mDefaultApiKey;
private LinkLabel mGetApiKeyLink;
private JLabel mMessage;
private JPanel mHistoryPanel;
private ComboBox mMaxHistoriesSize;
private JButton mClearHistoriesButton;
private JPanel mFontPanel;
private JCheckBox mFontCheckBox;
private FontComboBox mPrimaryFontComboBox;
private FontComboBox mPhoneticFontComboBox;
private JTextPane mFontPreview;
private JLabel mPrimaryFontLabel;
private JLabel mPhoneticFontLabel;
private Settings mSettings;
private AppStorage mAppStorage;
public JComponent createPanel(@NotNull Settings settings, @NotNull AppStorage appStorage) {
mSettings = settings;
mAppStorage = appStorage;
setTitles();
setRenderer();
setListeners();
return mWholePanel;
}
private void createUIComponents() {
mGetApiKeyLink = new ActionLink("", new AnAction() {
@Override
public void actionPerformed(AnActionEvent anActionEvent) {
obtainApiKey();
}
});
mGetApiKeyLink.setIcon(AllIcons.Ide.Link);
mPrimaryFontComboBox = new FontComboBox();
if (IdeaCompat.BUILD_NUMBER >= IdeaCompat.Version.IDEA2017_1) {
mPhoneticFontComboBox = new FontComboBox(false, true);
} else {
mPhoneticFontComboBox = new FontComboBox();
}
fixFontComboBoxSize(mPrimaryFontComboBox);
fixFontComboBoxSize(mPhoneticFontComboBox);
}
private void fixFontComboBoxSize(FontComboBox fontComboBox) {
Dimension size = fontComboBox.getPreferredSize();
size.width = size.height * 8;
fontComboBox.setPreferredSize(size);
}
private void setTitles() {
mSelectionSettingsPanel.setBorder(IdeBorderFactory.createTitledBorder("取词模式"));
mFontPanel.setBorder(IdeBorderFactory.createTitledBorder("字体"));
mHistoryPanel.setBorder(IdeBorderFactory.createTitledBorder("历史记录"));
mApiKeySettingsPanel.setBorder(IdeBorderFactory.createTitledBorder("有道 API KEY"));
}
private void setRenderer() {
mSelectionMode.setRenderer(new ListCellRendererWrapper<String>() {
@Override
public void customize(JList list, String value, int index, boolean selected, boolean hasFocus) {
setText(value);
if (index == INDEX_INCLUSIVE) {
setToolTipText("以最大范围取最近的所有词");
} else if (index == INDEX_EXCLUSIVE) {
setToolTipText("取最近的单个词");
}
}
});
}
private void setListeners() {
mDefaultApiKey.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
switchKey();
}
});
mFontCheckBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
final boolean selected = mFontCheckBox.isSelected();
mPrimaryFontComboBox.setEnabled(selected);
mPhoneticFontComboBox.setEnabled(selected);
mFontPreview.setEnabled(selected);
mPrimaryFontLabel.setEnabled(selected);
mPhoneticFontLabel.setEnabled(selected);
}
});
mPrimaryFontComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
previewPrimaryFont(mPrimaryFontComboBox.getFontName());
}
}
});
mPhoneticFontComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
previewPhoneticFont(mPhoneticFontComboBox.getFontName());
}
}
});
mClearHistoriesButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mAppStorage.clearHistories();
}
});
}
private void previewPrimaryFont(String primary) {
if (Utils.isEmptyOrBlankString(primary)) {
mFontPreview.setFont(JBUI.Fonts.label(14));
} else {
mFontPreview.setFont(JBUI.Fonts.create(primary, 14));
}
}
private void previewPhoneticFont(String primary) {
final StyledDocument document = mFontPreview.getStyledDocument();
Font font;
if (Utils.isEmptyOrBlankString(primary)) {
font = JBUI.Fonts.label(14);
} else {
font = JBUI.Fonts.create(primary, 14);
}
final SimpleAttributeSet attributeSet = new SimpleAttributeSet();
StyleConstants.setFontFamily(attributeSet, font.getFamily());
document.setCharacterAttributes(4, 41, attributeSet, true);
}
private static void obtainApiKey() {
WebBrowser browser = WebBrowserManager.getInstance().getFirstActiveBrowser();
if (browser != null) {
BrowserLauncher.getInstance()
.browseUsingPath(API_KEY_URL, null, browser, null, ArrayUtil.EMPTY_STRING_ARRAY);
}
}
private void switchKey() {
if (mDefaultApiKey.isSelected()) {
useDefaultKey();
} else {
useCustomKey();
}
}
private void useDefaultKey() {
if (Utils.isEmptyOrBlankString(mKeyNameField.getText())
&& Utils.isEmptyOrBlankString(mKeyValueField.getText())) {
mSettings.setApiKeyName(null);
mSettings.setApiKeyValue(null);
}
mKeyNameField.setText("Default");
mKeyNameField.setEnabled(false);
mKeyValueField.setText("Default");
mKeyValueField.setEnabled(false);
mMessage.setVisible(true);
}
private void useCustomKey() {
mKeyNameField.setText(mSettings.getApiKeyName());
mKeyNameField.setEnabled(true);
mKeyValueField.setText(mSettings.getApiKeyValue());
mKeyValueField.setEnabled(true);
mMessage.setVisible(false);
}
@NotNull
private AutoSelectionMode getAutoSelectionMode() {
if (mSelectionMode.getSelectedIndex() == INDEX_INCLUSIVE) {
return AutoSelectionMode.INCLUSIVE;
} else {
return AutoSelectionMode.EXCLUSIVE;
}
}
private int getMaxHistorySize() {
final Object size = mMaxHistoriesSize.getEditor().getItem();
if (size instanceof String) {
try {
return Integer.parseInt((String) size);
} catch (NumberFormatException e) {
/*no-op*/
}
}
return -1;
}
public boolean isModified() {
return (!Utils.isEmptyOrBlankString(mKeyNameField.getText())
&& !Utils.isEmptyOrBlankString(mKeyValueField.getText()))
|| mSettings.getAutoSelectionMode() != getAutoSelectionMode()
|| getMaxHistorySize() != mAppStorage.getMaxHistorySize()
|| mFontCheckBox.isSelected() != mSettings.isOverrideFont()
|| (mSettings.getPrimaryFontFamily() != null
&& mSettings.getPrimaryFontFamily().equals(mPrimaryFontComboBox.getFontName()))
|| (mSettings.getPhoneticFontFamily() != null
&& mSettings.getPhoneticFontFamily().equals(mPhoneticFontComboBox.getFontName()));
}
public void apply() {
final int maxHistorySize = getMaxHistorySize();
if (maxHistorySize >= 0) {
mAppStorage.setMaxHistorySize(maxHistorySize);
}
mSettings.setOverrideFont(mFontCheckBox.isSelected());
mSettings.setPrimaryFontFamily(mPrimaryFontComboBox.getFontName());
mSettings.setPhoneticFontFamily(mPhoneticFontComboBox.getFontName());
boolean validKey = !Utils.isEmptyOrBlankString(mKeyNameField.getText())
&& !Utils.isEmptyOrBlankString(mKeyValueField.getText());
boolean useDefault = mDefaultApiKey.isSelected();
if (!useDefault) {
mSettings.setApiKeyName(mKeyNameField.getText());
mSettings.setApiKeyValue(mKeyValueField.getText());
}
mSettings.setUseDefaultKey(useDefault || !validKey);
mSettings.setAutoSelectionMode(getAutoSelectionMode());
}
public void reset() {
mFontCheckBox.setSelected(mSettings.isOverrideFont());
mPrimaryFontComboBox.setFontName(mSettings.getPrimaryFontFamily());
mPhoneticFontComboBox.setFontName(mSettings.getPhoneticFontFamily());
previewPrimaryFont(mSettings.getPrimaryFontFamily());
previewPhoneticFont(mSettings.getPhoneticFontFamily());
mMaxHistoriesSize.getEditor().setItem(Integer.toString(mAppStorage.getMaxHistorySize()));
mDefaultApiKey.setSelected(mSettings.isUseDefaultKey());
mSelectionMode.setSelectedIndex(mSettings.getAutoSelectionMode() == AutoSelectionMode.INCLUSIVE
? INDEX_INCLUSIVE : INDEX_EXCLUSIVE);
}
}