package de.mprengemann.intellij.plugin.androidicons.dialogs;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.util.Consumer;
import de.mprengemann.intellij.plugin.androidicons.IconApplication;
import de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.BatchScaleImporterController;
import de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.additem.AddItemBatchScaleDialogObserver;
import de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.additem.AddItemBatchScaleImporterController;
import de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.additem.IAddItemBatchScaleImporterController;
import de.mprengemann.intellij.plugin.androidicons.controllers.defaults.IDefaultsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.settings.ISettingsController;
import de.mprengemann.intellij.plugin.androidicons.images.ResizeAlgorithm;
import de.mprengemann.intellij.plugin.androidicons.listeners.SimpleKeyListener;
import de.mprengemann.intellij.plugin.androidicons.model.Format;
import de.mprengemann.intellij.plugin.androidicons.model.ImageInformation;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import de.mprengemann.intellij.plugin.androidicons.widgets.FileBrowserField;
import de.mprengemann.intellij.plugin.androidicons.widgets.ResolutionButtonModel;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
public class EditItemsBatchScaleDialog extends DialogWrapper implements AddItemBatchScaleDialogObserver {
private final Project project;
private final Module module;
private final BatchScaleImporterController batchScaleController;
private final List<String> selectedFiles;
private List<Resolution> sourceResolution;
private final List<List<ImageInformation>> information;
private JPanel uiContainer;
private JCheckBox LDPICheckBox;
private JCheckBox MDPICheckBox;
private JCheckBox HDPICheckBox;
private JCheckBox XHDPICheckBox;
private JCheckBox XXHDPICheckBox;
private JCheckBox XXXHDPICheckBox;
private JCheckBox TVDPICheckBox;
private JComboBox sourceResolutionSpinner;
private FileBrowserField targetRoot;
private JComboBox algorithmSpinner;
private JComboBox methodSpinner;
private JComboBox formatSpinner;
private IAddItemBatchScaleImporterController controller;
private final ActionListener sourceResolutionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
final JComboBox source = (JComboBox) actionEvent.getSource();
final Resolution selectedItem = (Resolution) source.getSelectedItem();
controller.setSourceResolution(selectedItem);
}
};
private final ActionListener algorithmListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
final JComboBox source = (JComboBox) actionEvent.getSource();
final ResizeAlgorithm selectedItem = (ResizeAlgorithm) source.getSelectedItem();
controller.setAlgorithm(selectedItem);
}
};
private final ActionListener methodListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
final JComboBox source = (JComboBox) actionEvent.getSource();
final String selectedItem = (String) source.getSelectedItem();
controller.setMethod(selectedItem);
}
};
private final ActionListener resolutionActionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
final JCheckBox source = (JCheckBox) actionEvent.getSource();
final Resolution resolution = ((ResolutionButtonModel) source.getModel()).getResolution();
if (source.isSelected()) {
controller.addTargetResolution(resolution);
} else {
controller.removeTargetResolution(resolution);
}
}
};
private final ActionListener formatListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final JComboBox source = (JComboBox) e.getSource();
final Format selectedItem = (Format) source.getSelectedItem();
controller.setFormat(selectedItem);
}
};
private ISettingsController settingsController;
private IDefaultsController defaultsController;
public EditItemsBatchScaleDialog(final Project project,
final Module module,
final BatchScaleImporterController batchScaleImporterController,
final List<String> selectedFiles,
final List<Resolution> sourceResolution,
final List<List<ImageInformation>> information) {
super(project);
this.project = project;
this.module = module;
this.batchScaleController = batchScaleImporterController;
this.selectedFiles = selectedFiles;
this.sourceResolution = sourceResolution;
this.information = information;
initRequiredControllers();
initController(sourceResolution.get(0), information.get(0));
initTargetRoot();
initInternal();
}
private void initInternal() {
initCheckBoxes();
initExportRoot();
initAlgorithms();
init();
pack();
controller.addObserver(this);
}
private void initTargetRoot() {
targetRoot.initWithResourceRoot(project, module, settingsController);
targetRoot.setSelectionListener(new Consumer<File>() {
@Override
public void consume(File file) {
controller.setTargetRoot(file.getAbsolutePath());
}
});
}
private void initAlgorithms() {
for (ResizeAlgorithm algorithm : ResizeAlgorithm.values()) {
algorithmSpinner.addItem(algorithm);
}
}
private void initCheckBoxes() {
LDPICheckBox.setModel(new ResolutionButtonModel(Resolution.LDPI));
MDPICheckBox.setModel(new ResolutionButtonModel(Resolution.MDPI));
HDPICheckBox.setModel(new ResolutionButtonModel(Resolution.HDPI));
XHDPICheckBox.setModel(new ResolutionButtonModel(Resolution.XHDPI));
XXHDPICheckBox.setModel(new ResolutionButtonModel(Resolution.XXHDPI));
XXXHDPICheckBox.setModel(new ResolutionButtonModel(Resolution.XXXHDPI));
TVDPICheckBox.setModel(new ResolutionButtonModel(Resolution.TVDPI));
}
private void initExportRoot() {
targetRoot.setText(controller.getExportPath());
targetRoot.addKeyListener(new SimpleKeyListener() {
@Override
public void keyReleased(KeyEvent keyEvent) {
controller.setTargetRoot(((JTextField) keyEvent.getSource()).getText());
}
});
}
private void initRequiredControllers() {
final IconApplication container = ApplicationManager.getApplication().getComponent(IconApplication.class);
settingsController = container.getControllerFactory().getSettingsController();
defaultsController = container.getControllerFactory().getDefaultsController();
}
private void initController(Resolution sourceResolution, List<ImageInformation> information) {
controller = new AddItemBatchScaleImporterController(sourceResolution, information);
}
@Nullable
@Override
protected JComponent createCenterPanel() {
return uiContainer;
}
@Override
protected void doOKAction() {
for (int i = 0; i < selectedFiles.size(); i++) {
final List<ImageInformation> originalImageInformation = information.get(i);
final Resolution originalSourceResolution = sourceResolution.get(i);
final String selectedFile = selectedFiles.get(i);
final List<ImageInformation> imageInformation = controller.getImageInformation(project,
selectedFile,
originalImageInformation,
originalSourceResolution);
batchScaleController.addImage(controller.getSourceResolution(), imageInformation);
}
defaultsController.setAlgorithm(controller.getAlgorithm());
defaultsController.setMethod(controller.getMethod());
defaultsController.setSourceResolution(controller.getSourceResolution());
defaultsController.setResolutions(controller.getTargetResolutions());
super.doOKAction();
}
@Override
public void updated() {
updateSourceResolution();
updateTargetResolutions();
updateAlgorithms();
updateAlgorithmMethod();
updateFormat();
}
private void updateFormat() {
formatSpinner.removeActionListener(formatListener);
formatSpinner.removeAllItems();
for (Format format : Format.nonVectorValues()) {
formatSpinner.addItem(format);
}
formatSpinner.setSelectedItem(controller.getFormat());
formatSpinner.addActionListener(formatListener);
}
private void updateAlgorithms() {
algorithmSpinner.removeActionListener(algorithmListener);
algorithmSpinner.removeAllItems();
for (ResizeAlgorithm algorithm : ResizeAlgorithm.values()) {
algorithmSpinner.addItem(algorithm);
}
algorithmSpinner.setSelectedItem(controller.getAlgorithm());
algorithmSpinner.addActionListener(algorithmListener);
}
private void updateAlgorithmMethod() {
methodSpinner.removeActionListener(methodListener);
methodSpinner.removeAllItems();
final List<String> methods = controller.getMethods();
for (String method : methods) {
methodSpinner.addItem(method);
}
methodSpinner.setSelectedItem(controller.getMethod());
methodSpinner.setEnabled(methods.size() > 1);
methodSpinner.addActionListener(methodListener);
}
private void updateSourceResolution() {
sourceResolutionSpinner.removeActionListener(sourceResolutionListener);
sourceResolutionSpinner.removeAllItems();
for (Resolution resolution : Resolution.nonVectorValues()) {
sourceResolutionSpinner.addItem(resolution);
}
sourceResolutionSpinner.setSelectedItem(controller.getSourceResolution());
sourceResolutionSpinner.addActionListener(sourceResolutionListener);
}
private void updateTargetResolutions() {
final Set<Resolution> resolutions = controller.getTargetResolutions();
for (JCheckBox checkBox : Arrays.asList(LDPICheckBox,
MDPICheckBox,
HDPICheckBox,
XHDPICheckBox,
XXHDPICheckBox,
XXXHDPICheckBox,
TVDPICheckBox)) {
checkBox.removeActionListener(resolutionActionListener);
final Resolution resolution = ((ResolutionButtonModel) checkBox.getModel()).getResolution();
checkBox.setSelected(resolutions.contains(resolution));
checkBox.addActionListener(resolutionActionListener);
}
}
private void createUIComponents() {
targetRoot = new FileBrowserField(FileBrowserField.RESOURCE_DIR_CHOOSER);
}
}