// Carnegie Mellon University
//   Information Networking Institute and
//   School of Computer Science
//
// Master Thesis: A Monitoring Tool for Overlay Network
// By: TungFai Chan and Annie Cheng
//
// File: ListControlManager.java
// Path: userInterfaces/componentManager/
// Description: Manageing list control and interact with database


package userInterfaces.componentManagers;

import eventbase.*;
import eventbase.event.*;
import userInterfaces.*;
import userInterfaces.images.*;

import java.awt.*;
import java.util.*;
import javax.swing.*;

public class ListControlManager {

    final static Color NORMAL_COLOR = Color.black;
    final static Color DEAD_COLOR = Color.red;
    final static Color LEAVE_COLOR = Color.blue;

    JList listControl = null;
    DefaultListModel listModel = null;
    MainScreen mainScreen = null;

    Vector nodesList = null;
    Vector labelsList = null;

    public ListControlManager(JList list, MainScreen mScreen) {
        listControl = list;
        listModel = new DefaultListModel();
        mainScreen = mScreen;

        listControl.setModel(listModel);
        listControl.setCellRenderer(new LabelListCellRenderer());

        clearAll();
    }

    public void updateListControl(EventTableEntry tableEntry) {
        switch (tableEntry.getEvent().getEventId()) {
            case EventType.JOIN_GROUP:
                {
                    JoinGroupEvent event = (JoinGroupEvent)tableEntry.getEvent();
                    addToList(event.getSourceHost());
                }
                break;
            case EventType.ADD_LINK:
                {
                    AddLinkEvent event = (AddLinkEvent)tableEntry.getEvent();
                    addToList(event.getSourceHost());
                    addToList(event.getTargetHost());
                }
                break;
            case EventType.LEAVE_GROUP:
                {
                    indicateRemoveFromList(tableEntry.getEvent().getSourceHost(), false);
                }
                break;
            case EventType.DETECT_DEAD_HOST:
                {
                    indicateRemoveFromList(tableEntry.getEvent().getTargetHost(), true);
                }
                break;

        }


    }

    public void clearAll() {
        nodesList = new Vector();
        labelsList = new Vector();
        listModel.removeAllElements();
    }

    public int getSelectedNodeID() {

        if (listControl.getSelectedIndex() >= 0)
            return ((OverlayHost)nodesList.elementAt(listControl.getSelectedIndex())).getID();

        return -1;
    }

    public void setSelectedNodeID(int id) {
        String name = nodeExists(id);
        if (name != null)
            listControl.setSelectedIndex(listModel.indexOf(name));

    }

    private void addToList(OverlayHost host) {
        if (nodeExists(host.getID()) == null) {
            nodesList.addElement(host);
            LightWeightLabel label = new LightWeightLabel(host.getName(),
                                                          NORMAL_COLOR,
                                                          ImagesList.computerImage);
            listModel.addElement(label);
            labelsList.addElement(label);
        }
    }

    private void indicateRemoveFromList(OverlayHost host, boolean dead) {
        int ind = 0;
        for (Enumeration e = nodesList.elements();
             e.hasMoreElements(); ind ++)
            if (((OverlayHost)e.nextElement()).getID() == host.getID()) {
                LightWeightLabel label = (LightWeightLabel)labelsList.elementAt(ind);
                if (dead) {
                    label.color = DEAD_COLOR;
                    label.icon = ImagesList.computerDeadImage;
                }
                else {
                    label.color = DEAD_COLOR;
                    label.icon = ImagesList.computerLeaveImage;
                }

                break;
            }

        listControl.repaint();

    }

    private String nodeExists(int id) {

        for (int i = 0; i < nodesList.size(); i++) {
            OverlayHost host = (OverlayHost)nodesList.elementAt(i);
            if (host.getID() == id)
                return host.getName();
        }

        return null;
    }

}


