import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/*
 * Created on 02.07.2004
 */

/**
 * 
 * @author Andreas Pleuß
 */
public class ImageFrame extends JFrame {

	private String imgPath = "C:/Dokumente und Einstellungen/Andreas Pleuß/Eigene Dateien/Eigene Bilder/long-pic2.jpg";
	private BufferedImage originalImg =  new BufferedImage(2000, 600, BufferedImage.TYPE_3BYTE_BGR);
	private BufferedImage transferredImg = new BufferedImage(500, 600, BufferedImage.TYPE_3BYTE_BGR);
	private JPanel controlPanel = new JPanel();
	private JSlider focusSlider = new JSlider(600, 1400, 1000);
	private int focusX = 1000;
	private boolean continuousFunction = false;

	public static void main(String[] args) {
		ImageFrame frame = new ImageFrame();
		frame.show();
	}
	
	public ImageFrame() {
		// init UI
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
		setSize(508, 620);
		getContentPane().add(new ImagePanel(), BorderLayout.CENTER);
		getContentPane().add(controlPanel, BorderLayout.SOUTH);
		initSlider();
		initRadioButtons();
		//load image
		Image tmpImg = java.awt.Toolkit.getDefaultToolkit().createImage(imgPath);
		if (tmpImg == null) System.out.println("Error: could not load image");
		setIconImage(tmpImg);
		//trick to easily convert Image into a BufferedImage by
		//drawing the Image into the BufferedImage
		originalImg.getGraphics().drawImage(tmpImg, 0, 0, this);
		calculateTransformation();
	}
	
	private void initSlider() {
		focusSlider.setMinorTickSpacing(50);
		focusSlider.setMajorTickSpacing(200);
		focusSlider.setPaintTicks(true);
		focusSlider.setPaintLabels(true);
		focusSlider.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				JSlider source = (JSlider) e.getSource();
				if (!source.getValueIsAdjusting()) {
					focusX = (int) source.getValue();
					calculateTransformation();
				}
			}

		});
		controlPanel.add(focusSlider);
	}
	
	private void initRadioButtons() {
		JRadioButton bifButton = new JRadioButton("Bifocal");
		JRadioButton contButton = new JRadioButton("Continuous");
		bifButton.setActionCommand("Bifocal");
		contButton.setActionCommand("Continuous");
		bifButton.setSelected(true);
		ActionListener buttonListener = new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(e.getActionCommand().equals("Continuous")) {
					continuousFunction = true;
					focusSlider.setEnabled(false);
				} 
				else {
					continuousFunction = false;
					focusSlider.setEnabled(true);
				} 
				calculateTransformation();
			}
		};
		bifButton.addActionListener(buttonListener);
		contButton.addActionListener(buttonListener);
		ButtonGroup bGroup = new ButtonGroup();
		bGroup.add(bifButton);
		controlPanel.add(bifButton);
		bGroup.add(contButton);
		controlPanel.add(contButton);
		
	}

	private void calculateTransformation() {
		for (int x = 0; x < originalImg.getWidth(); x++) {
			for (int y = 0; y < originalImg.getHeight(); y++) {
				int rgbValue = originalImg.getRGB(x, y);
				int newX;
				if(continuousFunction) newX = continuousFunction(x);
				else newX = bifocalFunction(x);
				try{
					transferredImg.setRGB(newX, y, rgbValue);
				}
				catch (Exception ex){
					System.out.println("Fehler: newX = " + newX);
				
				}
			}
		}
		repaint();
	}
	
	private int bifocalFunction (int x) {
		int y = x / 4;
		return y;
	}
	
	private int continuousFunction (int x) {
		int y = x / 4;
		return y;
	}

	class ImagePanel extends JPanel {
		
		public void paint(Graphics g) {
			g.drawImage(transferredImg, 0, 0, this);
		}
	}
}

