package org.lucci.madhoc.gui;

import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.swing.JTree;
import javax.swing.border.EtchedBorder;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.DefaultTreeSelectionModel;
import javax.swing.tree.TreeModel;

import org.lucci.madhoc.simulation.Monitor;

/*
 * Created on May 5, 2005
 */

/**
 * @author luc.hogie
 */
public class MonitorTree extends JTree
{
    private ProjectionComponent projectionFrame;
    
    public MonitorTree()
    {
        setModel(null);
        getSelectionModel().setSelectionMode(DefaultTreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
        setCellRenderer(new ApplicationViewTreeCellRenderer());
        setBorder(new EtchedBorder());
    }

    public void setProjectionFrame(ProjectionComponent projectionFrame)
    {
        if (projectionFrame == null)
            throw new IllegalArgumentException();

        this.projectionFrame = projectionFrame;
        DefaultMutableTreeNode root = new DefaultMutableTreeNode(projectionFrame.getProjection());
        TreeModel model = new DefaultTreeModel(root);

        
        List<Monitor> monitors = new Vector<Monitor>(projectionFrame.getProjection().getNetwork().getMonitorMap().values());
        Collections.sort(monitors, new Comparator<Monitor>()
                {
                    public int compare(Monitor arg0, Monitor arg1)
                    {
                        return arg0.getName().compareTo(arg1.getName());
                    }
                });

        for (Monitor application : monitors)
        {
            buildSimulationApplicationNode(root, application);
        }

        setModel(model);
    }

    private void buildSimulationApplicationNode(DefaultMutableTreeNode root, Monitor application)
    {
        DefaultMutableTreeNode node = new DefaultMutableTreeNode(application);
        root.add(node);

        for (MonitorView view : projectionFrame.getMonitorViews().values())
        {
            if (view.getMonitor() == application)
            {
                buildApplicationViewNode(node, view);
            }
        }
    }

    private void buildApplicationViewNode(DefaultMutableTreeNode root, MonitorView view)
    {
        DefaultMutableTreeNode node = new DefaultMutableTreeNode(view);
        root.add(node);
    }
}