package magic.ui.screen.images.download;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ItemEvent;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import magic.data.GeneralConfig;
import magic.translate.MText;
import magic.ui.CardTextLanguage;
import magic.ui.dialog.prefs.ImageSizePresets;
import net.miginfocom.swing.MigLayout;
@SuppressWarnings("serial")
class OptionsPanel extends JPanel {
private static final String _S2 = "Preferred card text:";
private static final String _S3 = "Display card image as:";
private static final String _S4 = "Preferred card text language";
private static final String _S5 = "If a language other than English is selected then Magarena will first try to download a card image with text in that language. If no image is found then it will download the default English card image instead.";
private static final String _S6 = "Download on demand:";
private static final String _S7 = "Downloads card images as needed. Recommended if you have a fast internet connection.";
private static final String _S8 = "Preferred display size:";
private static final String _S9 = "Sets the size of the card image displayed in card explorer and deck editor as well as popup images during a game. Select 'Default' to display the card image at its native size. Otherwise it will be scaled up or down to the selected preset.";
private static final String _S10 = "*** This has no affect on the size of an image that is downloaded ***";
private static final String _S11 = "*** Not applicable to rendered proxy images ***";
private static final String _S12 = "Yes";
private static final String _S13 = "No";
private final GeneralConfig CONFIG = GeneralConfig.getInstance();
private final JComboBox<CardTextLanguage> cboCardText = new JComboBox<>();
private final JComboBox<CardImageDisplayMode> cboDisplayMode = new JComboBox<>();
private final DirectoryChooser imagesFolderChooser;
private final JComboBox<Boolean> cboOnDemand = new JComboBox<>();
private final JComboBox<ImageSizePresets> cboDisplaySize = new JComboBox<>();
private final DialogMainPanel listener;
OptionsPanel(DialogMainPanel listener) {
this.listener = listener;
imagesFolderChooser = getImagesFolderChooser();
imagesFolderChooser.setBold(true);
setDisplayModeCombo();
setDisplaySizeCombo();
setCardTextCombo();
setOnDemandCombo();
setLayout(new MigLayout("wrap 2, insets 0", "[right, 40%][60%]"));
add(imagesFolderChooser, "w 100%, spanx 2");
add(getBoldLabel(MText.get(_S3)));
add(cboDisplayMode);
add(getBoldLabel(MText.get(_S2)));
add(cboCardText);
add(getBoldLabel(MText.get(_S8)));
add(cboDisplaySize);
add(getBoldLabel(MText.get(_S6)));
add(cboOnDemand);
setOptionsState();
}
private JLabel getBoldLabel(String text) {
final JLabel lbl = new JLabel(text);
lbl.setFont(lbl.getFont().deriveFont(Font.BOLD));
return lbl;
}
void saveSettings() {
CONFIG.setCardImageDisplayMode(getCardImageDisplayMode());
CONFIG.setPreferredImageSize(getPreferredImageSize());
CONFIG.setImagesOnDemand(isOnDemand());
if (getCardImageDisplayMode() == CardImageDisplayMode.PRINTED) {
CONFIG.setCardTextLanguage(getCardTextLanguage());
}
}
private DirectoryChooser getImagesFolderChooser() {
final DirectoryChooser chooser = new DirectoryChooser(CONFIG.getCardImagesPath());
chooser.setFocusable(false);
chooser.addPropertyChangeListener(DirectoryChooser.CP_FOLDER_CHANGED, (e) -> {
CONFIG.setCardImagesPath(chooser.getPath());
listener.doOnImageFolderChanged();
});
return chooser;
}
private void setCardTextCombo() {
cboCardText.setModel(new DefaultComboBoxModel<>(CardTextLanguage.values()));
cboCardText.setSelectedItem(CONFIG.getCardTextLanguage());
cboCardText.addItemListener((final ItemEvent e) -> {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (getCardImageDisplayMode() == CardImageDisplayMode.PRINTED) {
CONFIG.setCardTextLanguage(getCardTextLanguage());
}
}
});
}
private void setOptionsState() {
if (getCardImageDisplayMode() == CardImageDisplayMode.PROXY) {
cboCardText.setSelectedItem(CardTextLanguage.ENGLISH);
cboCardText.setEnabled(false);
} else {
cboCardText.setSelectedItem(CONFIG.getCardTextLanguage());
cboCardText.setEnabled(true);
}
}
private void doDisplayModeChanged() {
setOptionsState();
listener.doOnDisplayModeChanged();
}
private void doOnDemandChanged() {
CONFIG.setImagesOnDemand(isOnDemand());
listener.doOnDemandChanged();
}
private void setOnDemandCombo() {
cboOnDemand.setModel(new DefaultComboBoxModel<>(new Boolean[]{true, false}));
cboOnDemand.getModel().setSelectedItem(CONFIG.getImagesOnDemand());
cboOnDemand.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
setText((Boolean) value == true ? MText.get(_S12) : MText.get(_S13));
setForeground(cboOnDemand.isEnabled() ? getForeground() : Color.GRAY);
return this;
}
});
cboOnDemand.addItemListener((final ItemEvent e) -> {
if (e.getStateChange() == ItemEvent.SELECTED) {
doOnDemandChanged();
}
});
}
private void setDisplayModeCombo() {
cboDisplayMode.setModel(new DefaultComboBoxModel<>(CardImageDisplayMode.values()));
cboDisplayMode.getModel().setSelectedItem(CONFIG.getCardImageDisplayMode());
cboDisplayMode.addItemListener((final ItemEvent e) -> {
if (e.getStateChange() == ItemEvent.SELECTED) {
doDisplayModeChanged();
}
});
}
private void setDisplaySizeCombo() {
cboDisplaySize.setModel(new DefaultComboBoxModel<>(ImageSizePresets.values()));
cboDisplaySize.getModel().setSelectedItem(CONFIG.getPreferredImageSize());
}
void addHintSources(HintPanel hintPanel) {
imagesFolderChooser.addHintSources(hintPanel);
hintPanel.addHintSource(cboCardText, String.format("<b>%s</b><br>%s<br><br><b>%s</b>",
MText.get(_S4), MText.get(_S5), MText.get(_S11)
));
hintPanel.addHintSource(cboOnDemand, String.format("<b>%s</b><br>%s",
MText.get(_S6), MText.get(_S7)
));
hintPanel.addHintSource(cboDisplaySize, String.format("<b>%s</b><br>%s<br><br><b>%s</b>",
MText.get(_S8), MText.get(_S9), MText.get(_S10)
));
}
boolean isOnDemand() {
return (Boolean) cboOnDemand.getSelectedItem();
}
CardTextLanguage getCardTextLanguage() {
return (CardTextLanguage) cboCardText.getSelectedItem();
}
CardImageDisplayMode getCardImageDisplayMode() {
return (CardImageDisplayMode) cboDisplayMode.getSelectedItem();
}
private ImageSizePresets getPreferredImageSize() {
return (ImageSizePresets) cboDisplaySize.getSelectedItem();
}
@Override
public void setEnabled(boolean b) {
super.setEnabled(b);
imagesFolderChooser.setEnabled(b);
cboDisplayMode.setEnabled(b);
cboCardText.setEnabled(b && getCardImageDisplayMode() == CardImageDisplayMode.PRINTED);
cboDisplaySize.setEnabled(b);
cboOnDemand.setEnabled(b);
}
}