package com.ardor3d.example.canvas;

import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.URISyntaxException;

import javax.swing.JFrame;

import com.ardor3d.example.Purpose;
import com.ardor3d.framework.DisplaySettings;
import com.ardor3d.framework.FrameHandler;
import com.ardor3d.framework.jogl.JoglCanvasRenderer;
import com.ardor3d.framework.jogl.awt.JoglAwtCanvas;
import com.ardor3d.image.util.awt.AWTImageLoader;
import com.ardor3d.input.ControllerWrapper;
import com.ardor3d.input.Key;
import com.ardor3d.input.PhysicalLayer;
import com.ardor3d.input.awt.AwtFocusWrapper;
import com.ardor3d.input.awt.AwtKeyboardWrapper;
import com.ardor3d.input.awt.AwtMouseManager;
import com.ardor3d.input.awt.AwtMouseWrapper;
import com.ardor3d.input.logical.DummyControllerWrapper;
import com.ardor3d.input.logical.LogicalLayer;
import com.ardor3d.util.Timer;
import com.ardor3d.util.resource.ResourceLocatorTool;
import com.ardor3d.util.resource.SimpleResourceLocator;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Point;
import javax.swing.JComponent;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class SwingTestTabPane {

    public static void main(final String[] args) throws Exception {
        System.setProperty("ardor3d.useMultipleContexts", "true");

        final Timer timer = new Timer();
        
        final FrameHandler frameWork1 = new FrameHandler(timer);
        final FrameHandler frameWork2 = new FrameHandler(timer);

        final MyExit exit = new MyExit();
        final LogicalLayer logicalLayer = new LogicalLayer();

        final ExampleScene scene1 = new ExampleScene();
        final RotatingCubeGame game1 = new RotatingCubeGame(scene1, exit, logicalLayer, Key.T);

        final ExampleScene scene2 = new ExampleScene();
        final RotatingCubeGame game2 = new RotatingCubeGame(scene2, exit, logicalLayer, Key.G);

        frameWork1.addUpdater(game1);
        frameWork1.addUpdater(game2);
        
        final FrameHandler frameWork = frameWork1;
        
        AWTImageLoader.registerLoader();
        try {
            final SimpleResourceLocator srl = new SimpleResourceLocator(ResourceLocatorTool.getClassPathResource(
                    JoglSwingExample.class, "com/ardor3d/example/media/"));
            ResourceLocatorTool.addResourceLocator(ResourceLocatorTool.TYPE_TEXTURE, srl);
        } catch (final URISyntaxException ex) {
            ex.printStackTrace();
        }        
        
        
        final JTabbedPane outerComp = new JTabbedPane();
        //final JPanel outerComp = new JPanel();

        final JFrame frame = createAndShowFrame("JTabbedPane Test", null, null, new Dimension(400, 400), null, true);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(final WindowEvent e) {
                exit.exit();
            }
        });
        
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
              try {
                 Component canvas1 = getComponent(scene1, logicalLayer, frameWork);
                 outerComp.add(canvas1);
                 
                 Component canvas2 = getComponent(scene2, logicalLayer, frameWork);
                 outerComp.add(canvas2);
                 
                 frame.add(outerComp);
              }
              catch (Exception e) {
                 e.printStackTrace();
              }
            }
        });

        
        game1.init();
        game2.init();

        while (!exit.isExit()) {
            frameWork.updateFrame();
            java.lang.Thread.sleep(200);
        }

        frame.dispose();
        System.exit(0);
    }

    private static Component getComponent(final ExampleScene scene, final LogicalLayer logicalLayer,
            final FrameHandler frameWork) throws Exception {
        final JoglCanvasRenderer canvasRenderer = new JoglCanvasRenderer(scene);

        final DisplaySettings settings = new DisplaySettings(400, 400, 24, 0, 0, 16, 0, 0, false, false);
        final JoglAwtCanvas theCanvas = new JoglAwtCanvas(settings, canvasRenderer);
        

        final AwtKeyboardWrapper keyboardWrapper = new AwtKeyboardWrapper(theCanvas);
        final AwtFocusWrapper focusWrapper = new AwtFocusWrapper(theCanvas);
        final AwtMouseManager mouseManager = new AwtMouseManager(theCanvas);
        final AwtMouseWrapper mouseWrapper = new AwtMouseWrapper(theCanvas, mouseManager);
        final ControllerWrapper controllerWrapper = new DummyControllerWrapper();

        final PhysicalLayer pl = new PhysicalLayer(keyboardWrapper, mouseWrapper, controllerWrapper, focusWrapper);

        logicalLayer.registerInput(theCanvas, pl);

        frameWork.addCanvas(theCanvas);
        
        return theCanvas;
    }   
    
    private static class MyExit implements Exit {
        private volatile boolean exit = false;

        @Override
        public void exit() {
            exit = true;
        }

        public boolean isExit() {
            return exit;
        }
    }
    
    public static JFrame createAndShowFrame(final String title, final Component component, final JMenuBar menuBar, final Dimension size, final Point loc, final boolean exitOnClose) {

        //Schedule a job for the event dispatch thread:
        //creating and showing this application's GUI.
        final JFrame frame = new JFrame(title);
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                //Turn off metal's use of bold fonts
                UIManager.put("swing.boldMetal", Boolean.FALSE);

                //JFrame frame = new JFrame(title);

                if (menuBar != null) {
                  frame.setJMenuBar(menuBar);
                }

                if (exitOnClose) {
                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                }

                //Add content to the window.
                if (component != null) {
                  frame.getContentPane().add(component);
                }

                if (size != null) {
                  frame.setPreferredSize(size);
                }

                if (loc != null) {
                  frame.setLocation(loc.x, loc.y);
                }

                //Display the window.
                frame.pack();
                frame.setVisible(true);
            }
        });
    
      return frame;
    }
}