package org.lucci.madhoc.gui;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Collection;

import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;

import org.lucci.madhoc.Version;
import org.lucci.madhoc.gui.runtime.RuntimeComponent;
import org.lucci.madhoc.gui.runtime.WindowShorcutComponent;
import org.lucci.madhoc.simulation.MadhocSimulation;
import org.lucci.madhoc.simulation.projection.Projection;

/*
 * Created on May 5, 2005
 */

/**
 * @author luc.hogie
 */
public class SimulationFrame extends JFrame
{
    public SimulationFrame(MadhocSimulation simulation)
        throws Throwable
    {
        super("Madhoc - Metropolitan ad hoc network simulator - Release \"" + Version.RELEASE_NAME + "\"");

        Dimension ss = Toolkit.getDefaultToolkit().getScreenSize();
        double ratio = simulation.getConfiguration().getDouble("graphical_window_size_ratio"); 
        setSize((int) (ss.width * ratio), (int) (ss.height * ratio));
        setLocation(ss.width / 2 - getSize().width / 2, ss.height / 2 - getSize().height / 2);
        addWindowListener(new WindowEventHandler());

        RuntimeComponent runtimeComponent = new RuntimeComponent();
        runtimeComponent.setSimulation(simulation);
        
        JDesktopPane desktopPane = new JDesktopPane();

        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(desktopPane, BorderLayout.CENTER);
        contentPane.add(runtimeComponent, BorderLayout.SOUTH);
        setVisible(true);

        Collection<Projection> projections = simulation.getNetwork().getProjectionMap().values();
        
        for (Projection projection : projections)
        {
            ProjectionComponent projectionComponent = new ProjectionComponent();
            projectionComponent.setProjection(projection);
            runtimeComponent.getRuntime().addSimulationRuntimeListener(projectionComponent);

            JInternalFrame internalFrame = new JInternalFrame(projection.getName());
            internalFrame.setContentPane(projectionComponent);

            Dimension ws = desktopPane.getSize();
            double r = 0.8;

            internalFrame.setSize((int) (ws.width * r), (int) (ws.height * r));
            internalFrame.setLocation(ws.width / 2 - internalFrame.getSize().width / 2, ws.width / 2 - internalFrame.getSize().width / 2);
            internalFrame.setResizable(true);
            internalFrame.setClosable(false);
            internalFrame.setIconifiable(true);
            internalFrame.setMaximizable(true);
            desktopPane.add(internalFrame);
            internalFrame.setVisible(true);
        }

        
        ((WindowShorcutComponent) runtimeComponent.getRuntimeComponentElements().get(WindowShorcutComponent.class)).setDesktopPane(desktopPane);
    }

    
    private class WindowEventHandler extends WindowAdapter
    {
        public void windowClosing(WindowEvent event)
        {
            System.exit(0);
        }
    }

}