package org.lucci.madhoc.gui.runtime;

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


/*
 * Created on May 8, 2005
 */

/**
 * @author luc.hogie
 */
public class WindowShorcutComponent extends RuntimeComponentElement
{
    private JLabel windowNameLabel;
    private ButtonHandler buttonHandler = new ButtonHandler();
    private JDesktopPane desktopPane;

    private JPanel buttonPanel;

    public WindowShorcutComponent()
    {
        windowNameLabel = new JLabel("<html>Projection name");
        buttonPanel = new JPanel();

        
        
        
        JPanel p = new JPanel(new BorderLayout());
        p.add(buttonPanel, BorderLayout.CENTER);
        p.add(windowNameLabel, BorderLayout.SOUTH);

        setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        add(p, c);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.lucci.madhoc.gui.SimulationRuntimeListener#stateChanged()
     */
    public void stateChanged()
    {
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.lucci.madhoc.gui.SimulationRuntimeListener#iterationPerformed()
     */
    public void iterationPerformed()
    {
    }

    public JDesktopPane getDesktopPane()
    {
        return desktopPane;
    }

    public void setDesktopPane(JDesktopPane desktopPane)
    {
        this.desktopPane = desktopPane;
        JInternalFrame[] frames = desktopPane.getAllFrames();
        buttonPanel.setLayout(new GridLayout(2, Math.max(frames.length / 2, 4)));   
        
        for (int i = 0; i < frames.length; ++i)
        {
            JInternalFrame frame = frames[i];
            FrameButton b = new FrameButton();
            b.setFrame(frame);
            b.addActionListener(buttonHandler);
            b.addMouseListener(this.buttonHandler);
            buttonPanel.add(b);
        }

        for (int i = frames.length; i < 8; ++i)
        {
            FrameButton b = new FrameButton();
            b.setEnabled(false);
            buttonPanel.add(b);
        }
        
        getParent().doLayout();
    }
    
    private class ButtonHandler implements ActionListener, MouseListener
    {
        public void actionPerformed(ActionEvent e)
        {
            FrameButton b = (FrameButton) e.getSource();
            desktopPane.setSelectedFrame(b.getFrame());
            b.getFrame().moveToFront();
        }

        /* (non-Javadoc)
         * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
         */
        public void mouseClicked(MouseEvent arg0)
        {
        }

        /* (non-Javadoc)
         * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
         */
        public void mouseEntered(MouseEvent e)
        {
            FrameButton b = (FrameButton) e.getSource();
            windowNameLabel.setText("<html>" + b.getFrame().getTitle());
        }

        /* (non-Javadoc)
         * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
         */
        public void mouseExited(MouseEvent arg0)
        {
            windowNameLabel.setText("<html><i>Projection name");
        }

        /* (non-Javadoc)
         * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
         */
        public void mousePressed(MouseEvent arg0)
        {
        }

        /* (non-Javadoc)
         * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
         */
        public void mouseReleased(MouseEvent arg0)
        {
        }
    }

    private class FrameButton extends JButton
    {
        private JInternalFrame frame;

        
        public JInternalFrame getFrame()
        {
            return frame;
        }

        public void setFrame(JInternalFrame frame)
        {
            this.frame = frame;
        }
    }
}