package mods.custom_flags.utils.swing;
import net.minecraft.util.StatCollector;
import javax.swing.*;
import javax.swing.GroupLayout.Alignment;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
public class ImageSplitDialog extends JDialog {
private final JPanel contentPanel = new JPanel();
private JLabel imageLabel;
public BufferedImage imageSection;
private BufferedImage image;
private JSlider y2slider;
private JSlider x2slider;
private JSlider x1slider;
private JSlider y1slider;
/**
* Create the dialog.
*/
public ImageSplitDialog(BufferedImage bi) {
setBounds(100, 100, 453, 470);
image = bi;
setModal(true);
this.setAlwaysOnTop(true);
getContentPane().setLayout(new BorderLayout());
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(contentPanel, BorderLayout.CENTER);
JLabel lblNewLabel = new JLabel(StatCollector.translateToLocal("gui.splitter.number.x.sections"));
lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout(0, 0));
imageLabel = new JLabel("");
panel.add(imageLabel, BorderLayout.CENTER);
x2slider = new JSlider();
x2slider.setValue(1);
x2slider.setPaintTicks(true);
x2slider.setSnapToTicks(true);
x2slider.setPaintLabels(true);
x2slider.setMajorTickSpacing(1);
x2slider.setMinorTickSpacing(1);
x2slider.setMinimum(1);
x2slider.setMaximum(4);
x1slider = new JSlider();
x1slider.setValue(4);
x1slider.setSnapToTicks(true);
x1slider.setPaintTicks(true);
x1slider.setPaintLabels(true);
x1slider.setMinorTickSpacing(1);
x1slider.setMinimum(1);
x1slider.setMaximum(4);
x1slider.setMajorTickSpacing(1);
JLabel lblNewLabel_1 = new JLabel(StatCollector.translateToLocal("gui.splitter.x.section"));
lblNewLabel_1.setHorizontalAlignment(SwingConstants.CENTER);
y2slider = new JSlider();
y2slider.setValue(1);
y2slider.setInverted(true);
y2slider.setMajorTickSpacing(1);
y2slider.setMinorTickSpacing(1);
y2slider.setMinimum(1);
y2slider.setMaximum(4);
y2slider.setSnapToTicks(true);
y2slider.setPaintTicks(true);
y2slider.setPaintLabels(true);
y2slider.setOrientation(SwingConstants.VERTICAL);
JLabel lblYSection = new JLabel(StatCollector.translateToLocal("gui.splitter.y.section"));
lblYSection.setHorizontalAlignment(SwingConstants.CENTER);
y1slider = new JSlider();
y1slider.setValue(4);
y1slider.setSnapToTicks(true);
y1slider.setPaintTicks(true);
y1slider.setPaintLabels(true);
y1slider.setOrientation(SwingConstants.VERTICAL);
y1slider.setMinorTickSpacing(1);
y1slider.setMinimum(1);
y1slider.setMaximum(4);
y1slider.setMajorTickSpacing(1);
String[] split = StatCollector.translateToLocal("gui.splitter.number.y.sections").split("\\*");
JLabel lblNewLabel_2 = new JLabel();
JLabel lblYSections = new JLabel();
if(split.length > 1){
lblNewLabel_2.setText(split[0]);
lblYSections.setText(split[1]);
}else{
lblYSections.setText(split[0]);
}
lblNewLabel_2.setHorizontalAlignment(SwingConstants.CENTER);
lblYSections.setHorizontalAlignment(SwingConstants.CENTER);
GroupLayout gl_contentPanel = new GroupLayout(contentPanel);
gl_contentPanel.setHorizontalGroup(
gl_contentPanel.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPanel.createSequentialGroup()
.addContainerGap()
.addGroup(gl_contentPanel.createParallelGroup(Alignment.TRAILING, false)
.addComponent(lblNewLabel, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(x1slider, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(lblNewLabel_1, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(x2slider, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(panel, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 226, Short.MAX_VALUE))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING, false)
.addComponent(y2slider, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(lblYSection, GroupLayout.DEFAULT_SIZE, 77, Short.MAX_VALUE))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING, false)
.addComponent(lblNewLabel_2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(y1slider, GroupLayout.DEFAULT_SIZE, 77, Short.MAX_VALUE)
.addComponent(lblYSections, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap(44, Short.MAX_VALUE))
);
gl_contentPanel.setVerticalGroup(
gl_contentPanel.createParallelGroup(Alignment.TRAILING)
.addGroup(gl_contentPanel.createSequentialGroup()
.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(lblNewLabel)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(x1slider, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(lblNewLabel_1)
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPanel.createSequentialGroup()
.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
.addComponent(x2slider, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(lblYSection)
.addGroup(gl_contentPanel.createSequentialGroup()
.addComponent(lblNewLabel_2)
.addPreferredGap(ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(lblYSections)))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
.addComponent(y2slider, GroupLayout.DEFAULT_SIZE, 220, Short.MAX_VALUE)
.addComponent(panel, GroupLayout.PREFERRED_SIZE, 220, GroupLayout.PREFERRED_SIZE)))
.addComponent(y1slider, Alignment.TRAILING, GroupLayout.PREFERRED_SIZE, 220, GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);
x1slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider)e.getSource();
x2slider.setMaximum((int)source.getValue());
resetImage();
}
});
x2slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
resetImage();
}
});
y1slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider)e.getSource();
y2slider.setMaximum((int)source.getValue());
resetImage();
}
});
y2slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
resetImage();
}
});
contentPanel.setLayout(gl_contentPanel);
{
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
getContentPane().add(buttonPane, BorderLayout.SOUTH);
{
JButton okButton = new JButton("OK");
buttonPane.add(okButton);
getRootPane().setDefaultButton(okButton);
okButton.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
imageSection =
image.getSubimage(
(int)(((float)(getX2slider().getValue()-1) / getX1slider().getValue())*image.getWidth()),
(int)(((float)(getY2slider().getValue()-1) / getY1slider().getValue())*image.getHeight()),
(int)(((float)(image.getWidth() / getX1slider().getValue()))),
(int)(((float)(image.getHeight() / getY1slider().getValue()))));
setVisible(false);
}
});
}
{
JButton cancelButton = new JButton("Cancel");
buttonPane.add(cancelButton);
cancelButton.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
});
}
}
resetImage();
}
private void resetImage(){
BufferedImage before = image.getSubimage(0, 0, image.getWidth(), image.getHeight());
BufferedImage scaled = before;
int width = 250;
int height = 250;
if(before.getWidth() != width || before.getHeight() != height){ //If the hight of the image is not our targert
scaled = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); //Create a new empty image of the target size
AffineTransform at = new AffineTransform(); //Create a new Affine Transform
at.scale((float)width / before.getWidth(), (float)height / before.getHeight()); //Scale the image to the size we want
AffineTransformOp scaleOp =
new AffineTransformOp(at, AffineTransformOp.TYPE_BICUBIC); // use the bi linear transfomation mode
scaled = scaleOp.filter(before, scaled); //Scale it
}
int xBound = 250 / this.getX1slider().getValue();
int yBound = 250 / this.getY1slider().getValue();
for(int x = 0; x < width; x++){
if(x > xBound*(getX2slider().getValue()-1) && x < xBound*(getX2slider().getValue())){
for(int y = 0; y < height; y++){
if(! (y > yBound*(getY2slider().getValue()-1) && y < yBound*(getY2slider().getValue()))){
scaled.setRGB(x, y, ((scaled.getRGB(x, y) & 0xfefefe) >> 1) | 0xFF000000);
}
}
}else{
for(int y = 0; y < height; y++)
scaled.setRGB(x, y, ((scaled.getRGB(x, y) & 0xfefefe) >> 1) | 0xFF000000);
}
}
ImageIcon icon = new ImageIcon(scaled);
imageLabel.setIcon(icon);
}
public JSlider getY2slider() {
return y2slider;
}
public JSlider getX2slider() {
return x2slider;
}
public JSlider getX1slider() {
return x1slider;
}
public JSlider getY1slider() {
return y1slider;
}
}