/* Author: Jeff Dalton <J.Dalton@ed.ac.uk>
 * Updated: Mon Dec  3 20:47:54 2001 by Jeff Dalton
 * Copyright: (c) 2001, AIAI, University of Edinburgh
 */

package ix.ileed;

import javax.swing.*;

import java.awt.Toolkit;
import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Color;

import java.awt.event.*;

import ix.ip2.*;

import ix.ideel.IssueViewer;
import ix.ideel.IssueViewingTable;

import ix.iview.*;
import ix.iface.util.LogoPanel;
import ix.util.*;

/**
 * The main frame of the I-LEED user interface.
 */
class IleedFrame extends Ip2Frame implements ActionListener {

    BasicIleed ileed;

    Container contentPane;

    IssueViewingTable issueViewer;    // s.b. just IssueViewer? /\/
    SimpleProcessViewer processViewer; // s.b. something more generic /\/

    IleedFrame(BasicIleed ileed) {
	super(ileed.displayName);
	this.ileed = ileed;
	setUp();
    }

    protected void setUp() {
	issueViewer = (IssueViewingTable)ileed.issueViewer;
	processViewer = (SimpleProcessViewer)ileed.processViewer;

	contentPane = getContentPane();

	// Layout manager defaults to BorderLayout,
	// but we want a BoxLayout.
	// contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
	contentPane.setLayout(new BorderLayout());

	// Menu Bar
	setJMenuBar(makeMenuBar());

	// Package issue viewer
	JPanel issuePanel = new JPanel();
	issuePanel.add(issueViewer);
	JScrollPane issueScroll = new JScrollPane(issuePanel);
// 	issueScroll.setHorizontalScrollBarPolicy
// 	    (JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
// 	issueScroll.setVerticalScrollBarPolicy
// 	    (JScrollPane.VERTICAL_SCROLLBAR_NEVER);
	issueScroll.setBorder(BorderFactory.createTitledBorder("Issues"));


	// JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
	split.setTopComponent(processViewer);
	split.setBottomComponent(issueScroll);
	split.setDividerLocation(0.80);	// the one in pack() matters /\/
	contentPane.add(split);

	// Add something that identifies the system and mentions AIAI
	contentPane.add(ileed.makeLogoPanel(), BorderLayout.SOUTH);

    }

    JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
    
    public void pack() {
	super.pack();
	// Keep the frame from being too tall.
	// The way to do it is somewhat empirical ... /\/
	Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
	Dimension size = getSize();
	int width = (int)Math.round(size.getWidth());
	int height = (int)Math.round(size.getHeight());
	int maxHeight = (int)((7.0 / 8.0) * screenSize.getHeight());
	int scrollWidth = 30;	// scrollbar will appear /\/
	if (height > maxHeight)
	    setSize(new Dimension(width + scrollWidth, maxHeight));
	super.validate();
	split.setDividerLocation(0.80);
	// super.validate();
    }

    protected void ensureDomainEditor() {
	if (domainEditor == null) {
	    domainEditor = makeDomainEditor(ileed, ileed.issueDomain);
	}
	domainEditor.setVisible(true);
    }


    /*
     * Menu Bar
     */

    protected JMenuBar makeMenuBar() {
	JMenuBar bar = new JMenuBar();

	// File menu
	JMenu fileMenu = new JMenu("File");
	bar.add(fileMenu);
	fileMenu.add(makeMenuItem("Load or Edit Domain"));
	fileMenu.add(makeMenuItem("Reset"));
	fileMenu.addSeparator();
	fileMenu.add(makeMenuItem("Exit"));

	// Issue menu
	JMenu issueMenu = new JMenu("Issue");
	bar.add(issueMenu);
	issueMenu.add(makeMenuItem("New Issue"));
	issueMenu.add(makeMenuItem("New Issue Expansion"));

	bar.add(Box.createHorizontalGlue()); // let later items move right

	// Test menu
	JMenu testMenu = new JMenu("Test");
	bar.add(testMenu);
	ileed.autoTester.addTestMenuItems(testMenu);
	testMenu.addSeparator();
	issueViewer.addTestMenuItems(testMenu);

	return bar;
    }

    protected JMenuItem makeMenuItem(String text) {
	JMenuItem item = new JMenuItem(text);
	item.addActionListener(this);
	return item;
    }


    /*
     * Action interpreter
     */

    public void actionPerformed(ActionEvent e) {
	String command = e.getActionCommand();
	Debug.noteln("I-LEED action:", command);
	if (command.equals("Exit")) {
	    System.exit(0);
	}
	else if (command.equals("Reset")) {
	    ileed.reset();
	}
	else if (command.equals("Load or Edit Domain")) {
	    ensureDomainEditor();
	}
	else if (command.equals("New Issue Expansion")) {
	    ensureDomainEditor();
	}
	else if (command.equals("New Issue")) {
	    issueViewer.ensureIssueEditor();
	}
	else
	    Debug.noteln("Nothing to do for", command);
    }

}

