package Addiks.WindowTunnel;

import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.FlowLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.lang.Runnable;

public class Application
{
    private static Application instance;
    private Robot robot;
    
    public Application() throws Exception
    {
        robot = new Robot();
        robot.setAutoDelay(10);
        robot.setAutoWaitForIdle(true);
    }
    
    public void run() throws Exception
    {
        JLabel label=new JLabel();
        
        JFrame frame=new JFrame();
        frame.setLayout(new FlowLayout());
        frame.setLocation(400, 400);
        frame.add(label);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Window-Tunnel");
        
        JFrame frameA=new JFrame();
        frameA.setSize(100, 10);
        frameA.setLocation(300, 300);
        frameA.setVisible(true);
        frameA.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frameA.setTitle("[TL]");
        
        JFrame frameB=new JFrame();
        frameB.setSize(100, 10);
        frameB.setLocation(900, 900);
        frameB.setVisible(true);
        frameB.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frameB.setTitle("[BR]");
        
        ComponentAdapter adapter = new ComponentAdapter() {
            
            @Override
            public void componentMoved(ComponentEvent event) {
                
                int xA = frameA.getX() + frameA.getWidth();
                int yA = frameA.getY() + frameA.getHeight();
                int xB = frameB.getX();
                int yB = frameB.getY();
                
                if (xA > xB) {
                    xA = frameB.getX() + frameB.getWidth();
                    xB = frameA.getX();
                }
                
                if (yA > yB) {
                    yA = frameB.getY() + frameB.getHeight();
                    yB = frameA.getY();
                }
                
                int width = xB - xA;
                int height = yB - yA;
                
                Rectangle screenSize = new Rectangle(
                    xA, 
                    yA, 
                    width, 
                    height
                );
                
                BufferedImage screenshot = robot.createScreenCapture(screenSize);
                
                label.setIcon(new ImageIcon(screenshot));
                frame.setSize(width, height + 34);
            }
            
        };
        
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        
        ScheduledFuture<?> handle = scheduler.scheduleAtFixedRate(
            new Runnable() {
                public void run() {
                    adapter.componentMoved(null);
                }
            }, 
            100, 
            100, 
            TimeUnit.MILLISECONDS
        );
    }
    
    public static void main(String[] args) throws Exception
    {
        try {
            Application.instance = new Application();
            Application.instance.run();
            
        } catch (Exception exception) {
            System.out.println(String.format(
                " Uncatched %s: '%s'",
                exception.getClass(),
                exception.toString()
            ));
            exception.printStackTrace();
            Thread.sleep(3000);
        }
    }
    
}
