/*
 * $Id$
 *
 * Copyright 1996-2008 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Sun designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Sun in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */
package com.sun.javatest.exec;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ComponentListener;
import java.awt.event.ComponentEvent;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import com.sun.javatest.tool.UIFactory;

import com.sun.javatest.util.Debug;

/** 
 * This panel shows information when multiple nodes are selected in the tree.
 */
class MultiSelectPanel
    extends JPanel
    //implements FilterSelectionHandler.Observer 
{
    MultiSelectPanel(UIFactory uif, TreePanelModel model, TestTreeModel ttm) {
	this.uif = uif;
	this.tpm = model;
	this.ttm = ttm;

	initGUI();
    }

    // XXX use TreePath[] as parameter?
    void setNodes(Object[] nodes) {
	this.nodes =nodes;
	updatePanel(nodes);
    }

    /**
     * This method should only be called to indicate that a change has occured
     * which replaces the active TRT.  Changes to the parameters (filters,
     * initial URLs, etc... should propagate thru the FilterConfig system.
     *
     * @param p A validated set of parameters.
     * @see com.sun.javatest.exec.FilterConfig
    void setParameters(Parameters p) {
	this.params = p;

	TestResultTable newTrt = null;
	if (p.getWorkDirectory() != null) {
	    newTrt = p.getWorkDirectory().getTestResultTable();
	}
    }

    void dispose() {
	// stop counter thread
	summPanel.dispose();
    }
     */

    protected void initGUI() {
	setName("multiselect");
	setLayout(new GridBagLayout());
	setMinimumSize(new Dimension(150, 100));

	listModel = new DefaultListModel();
	nodeList = uif.createList("ms.nlist", listModel);
	GridBagConstraints gbc = new GridBagConstraints();
	gbc.weightx= 1.0;
	gbc.gridy = 0;
	gbc.gridx = 0;
	gbc.anchor = GridBagConstraints.CENTER;

	// add inline help
	gbc.fill = GridBagConstraints.HORIZONTAL;
	add(uif.createMessageArea("ms.help"), gbc);

	gbc.weighty = 9.0;
	gbc.gridy = 1;
	gbc.fill = GridBagConstraints.BOTH;
	nodeList.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createEmptyBorder(10, 5, 5, 5),
            uif.createTitledBorder("ms.nlist"))
	);

	nodeList.setCellRenderer(RenderingUtilities.createTRTNodeRenderer());

	add(new JScrollPane(nodeList), gbc);

        // --- anonymous class ---
	ComponentListener cl = new ComponentListener() {
	    public void componentResized(ComponentEvent e) {
	    }

	    public void componentMoved(ComponentEvent e) {
	    }

	    public void componentShown(ComponentEvent e) {
		if (needToUpdateGUIWhenShown) {
		    updateGUI();
		    needToUpdateGUIWhenShown = false;
		}
	    }
	    public void componentHidden(ComponentEvent e) {
	    }
	};
	addComponentListener(cl);
    }

    protected void updatePanel(Object[] nodes) {
	if (isVisible())
	    updateGUI();
	else
	    needToUpdateGUIWhenShown = true;
    }

    Object[] getNodes() {
	return nodes;
    }

    /**
     * Call when the target node or tree data have changed.  This is called
     * internally to force updates when filters have changed.
     */
    protected void updateGUI() {
	listModel.removeAllElements();

	if (nodes == null)
	    return;

	for (int i = 0; i < nodes.length; i++)
	    listModel.addElement(nodes[i]);
    }

    protected void finalize() throws Throwable {
	super.finalize();
    }

    private TestTreeModel ttm;
    private TreePanelModel tpm;
    private JList nodeList;
    private DefaultListModel listModel;
    private Object[] nodes;

    private UIFactory uif;

    private volatile boolean needToUpdateGUIWhenShown;

    private static boolean debug = Debug.getBoolean(MultiSelectPanel.class);
}
