
import java.awt.GridLayout;

import java.awt.Rectangle;

import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;


import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.filechooser.FileNameExtensionFilter;


import ij.ImagePlus;
import ij.gui.ImageCanvas;
import ij.gui.ImageWindow;
import ij.plugin.PlugIn;

import ij.process.ImageProcessor;

public class Picture_In_Picture implements PlugIn, ActionListener, MouseListener{
	
	private File input = null;
	private ImagePlus img;
	private ImageCanvas canvas;
	private int firstX = 0;
	private int firstY = 0;
	private int secondX = 0;
	private int secondY = 0;
	private int width = 0;
	private int height = 0;
	private int rectX = 0;
	private int rectY = 0;
	Rectangle sourcePip = new Rectangle();
	private ImageProcessor PiP;
	ImageProcessor ip;
	private int count_img = 0;
	private JFileChooser chooser;
	private int returnVal;
	private ImageWindow win;
	
	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		resetCoord();
		firstX = e.getX();
		firstY = e.getY();
	}

	private void resetCoord() {
		// TODO Auto-generated method stub
		firstX = 0;
		firstY = 0;
		secondX = 0;
		secondY = 0;
		width = 0;
		height = 0;
		rectX = 0;
		rectY = 0;
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println("ENTRY to MouseReleased");
		secondX = e.getX();
		secondY = e.getY();
		
		width = Math.abs(firstX - secondX);
		height = Math.abs(firstY - secondY);
		
		if(firstX < secondX)
			rectX = firstX;
		else
			rectX = secondX;
		
		if(firstY < secondY)
			rectY = firstY;
		else
			rectY = secondY;
		
		img.setRoi(rectX, rectY, width, height);
		
		System.out.println("firstX "+firstX);
		System.out.println("firstY "+firstY);
		System.out.println("secondX "+secondX);
		System.out.println("secondY "+secondY);
		System.out.println("width "+width);
		System.out.println("height "+height);
		System.out.println("rectX "+rectX);
		System.out.println("rectY "+rectY);
		System.out.println("EXIT to MouseReleased");
	}

	public void run(String arg) {
		chooser = new JFileChooser();
		FileNameExtensionFilter filter = new FileNameExtensionFilter("Images", "jpg", "jpeg", "JPG", "JPEG", "png", "PNG", "bmp", "BMP");
		chooser.setFileFilter(filter);
		returnVal = chooser.showOpenDialog(null);
		if(returnVal == JFileChooser.APPROVE_OPTION) {
			input = chooser.getSelectedFile(); //in input we find the path of image select
			img = new ImagePlus(input.getPath());
			img.show();
			System.out.println(input.getPath());
		}
		else {
			return;
		}
		win = img.getWindow();
		canvas = win.getCanvas();
		canvas.addMouseListener(this);
		startGUI();
	}

	private void startGUI() {
		int risolutionW = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
		//int risolutionH = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
		int widthGUI = 200;
		int heightGUI = 300;
		GridLayout grid = new GridLayout(5,2,10,10);
		// TODO Auto-generated method stub
		JFrame GUI = new JFrame("GUI");
		ImageIcon icon_info = new ImageIcon("src/icon_info.png");
		ImageIcon icon_info_prj = new ImageIcon("src/icon_info_prj.png");
		ip = img.getProcessor();
		
		GUI.setLocation(risolutionW-(widthGUI + 50), 100);
		GUI.setSize(widthGUI, heightGUI);
		GUI.setLayout(grid);
		
		JButton firstPiP = new JButton("PiP Part");
		firstPiP.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {

				makePIP();
				
				ImagePlus origin_img = new ImagePlus(input.getPath());
				ImageProcessor output = origin_img.getProcessor();
				
				BufferedImage prova = PiP.getBufferedImage(); //questo per vedere se tagliavo
				new ImagePlus("Crop_PiP_"+count_img, prova).show();        //bene il PiP e lo stampo
				
				for(int i = 0; i < width; i++){
					for(int j = 0; j < height; j++){
						output.putPixel(rectX+i, rectY+j, PiP.getPixel(i, j));
					}
				}
				
				BufferedImage output_buff = output.getBufferedImage();
				new ImagePlus("PictureInPicture_"+count_img+"_"+input.getName(), output_buff).show();
				count_img++; 
				
			}
		});
		
		JButton secondPiP = new JButton("PiP Hor");
		secondPiP.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				
				ImagePlus origin_img = new ImagePlus(input.getPath());
				ImageProcessor origin_ip = origin_img.getProcessor();
				
				ImageProcessor output = origin_ip;

				ImageProcessor resize_output = output.resize(2*output.getWidth(), output.getHeight());
				
				for(int i = 0; i < output.getWidth(); i++){
					for(int j = 0; j < output.getHeight(); j++){
						resize_output.putPixel(i, j, output.getPixel(i, j));
					}
				}
				
				for(int i = output.getWidth(); i < resize_output.getWidth(); i++){
					for(int j = 0; j < output.getHeight(); j++){
						resize_output.putPixel(i, j, ip.getPixel(i-output.getWidth(), j));
					}
				}

				BufferedImage output_buff = resize_output.getBufferedImage();
				new ImagePlus("PictureInPicture_"+count_img+"_"+input.getName(), output_buff).show();
				count_img++;
				
			}
		});
		
		JButton thirdPiP = new JButton("PiP Vert");
		thirdPiP.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				
				ImagePlus origin_img = new ImagePlus(input.getPath());
				ImageProcessor origin_ip = origin_img.getProcessor();
				
				ImageProcessor output = origin_ip;

				ImageProcessor resize_output = output.resize(output.getWidth(), 2*output.getHeight());
				
				for(int i = 0; i < output.getWidth(); i++){
					for(int j = 0; j < output.getHeight(); j++){
						resize_output.putPixel(i, j, output.getPixel(i, j));
					}
				}
				
				for(int i = 0; i < output.getWidth(); i++){
					for(int j = output.getHeight(); j < resize_output.getHeight(); j++){
						resize_output.putPixel(i, j, ip.getPixel(i, j-output.getHeight()));
					}
				}

				BufferedImage output_buff = resize_output.getBufferedImage();
				new ImagePlus("PictureInPicture_"+count_img+"_"+input.getName(), output_buff).show();
				count_img++;
				
			}
		});
		
		JButton viewOriginalImage = new JButton("View Original Image");
		viewOriginalImage.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				ImagePlus origin_img = new ImagePlus(input.getPath());
				origin_img.show();
			}
		});
		
		JButton infoFirst = new JButton("Help PiP Part");
		infoFirst.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				JOptionPane.showMessageDialog(null, "Questa modalitˆ di PictureInPicture\n" +
						"evidenzia sulla stessa immagine originale\n" +
						"la parte modificata con i filtri dall'utente");
			}
		});
		
		JButton infoSecond = new JButton("Help PiP Hor");
		infoSecond.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				JOptionPane.showMessageDialog(null, "Questa modalitˆ di PictureInPicture\n" +
						"affianca in orizzontale l'immagine originale e quella filtrata");
			}
		});
		
		JButton infoThird = new JButton("Help PiP Vert");
		infoThird.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				JOptionPane.showMessageDialog(null, "Questa modalitˆ di PictureInPicture\n" +
						"affianca in verticale l'immagine originale e quella filtrata");
			}
		});
		
		JButton infoProject = new JButton("Info Project");
		infoProject.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				JOptionPane.showMessageDialog(null, "Progetto Realizzato da\n" +
						"Nicotra Gabriele - M01000253\n" +
						"---------------------------------------\n" +
						"Il progetto consiste nella creazione di un tool per ImageJ\n" +
						"che permetta di realizzare il concetto di PictureInPicture\n" +
						"per creare le immagini da inserire in una relazione forense");
			}
		});
		
		JButton openImage = new JButton("Open Image");
		openImage.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {				
				//win.close();
				chooser = new JFileChooser();
				FileNameExtensionFilter filter = new FileNameExtensionFilter("Images", "jpg", "jpeg", "JPG", "JPEG", "png", "PNG", "bmp", "BMP");
				chooser.setFileFilter(filter);
				returnVal = chooser.showOpenDialog(null);
				if(returnVal == JFileChooser.APPROVE_OPTION) {
					input = chooser.getSelectedFile(); //in input we find the path of image select
					img = new ImagePlus(input.getPath());
					img.show();
					System.out.println(input.getPath());
				}
				else {
					return;
				}
				win = img.getWindow();
				canvas = win.getCanvas();
				MakeListMouse();
			}	
		});
		
		
		GUI.add(openImage);
		GUI.add(infoProject);
		GUI.add(firstPiP);
		GUI.add(infoFirst);
		GUI.add(secondPiP);
		GUI.add(infoSecond);
		GUI.add(thirdPiP);
		GUI.add(infoThird);
		GUI.add(viewOriginalImage);
		GUI.pack();
		GUI.setVisible(true);
		
	}
	
	public void MakeListMouse(){
		canvas.addMouseListener(this);
	}
	
	public void makePIP() {
		sourcePip = new Rectangle();
		sourcePip.x = rectX;
		sourcePip.y = rectY;
		sourcePip.width = width;
		sourcePip.height = height;
		ip = img.getProcessor();
		ip.setRoi(sourcePip);
		PiP = ip.crop();
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	

}
