package com.uvigo.mhp;

import java.util.*;

// La clase ContextManager centraliza la comunicacion de eventos de cambio de contexto
// entre los objetos registrados. El registro tiene lugar en el metodo setContextManager
// de cada ContextHandler, por medio del metodo add de ContextManager.
// La utilizacion de esta clase simplifica la programacion visual, al tiempo que
// permite definir varios ContextManager de forma que puede haber varios grupos
// de objetos ligados por contextos, no necesariamente todos los grupos en el mismo.

public class ContextManager implements ContextListener,java.io.Serializable
{
    private Vector handlers;
    
    public ContextManager()
    {
        handlers=new Vector();
    }
    
    public void contextChanged(ContextEvent e)
    {
        // Cuando cambia el contexto de uno de los handlers registrados, se avisa
        // a los demas. Para evitar invocaciones inutiles, no se avisa a un objeto
        // si ya esta en el nuevo contexto.
        
        ContextHandler source=e.getSource();
        String newContext=e.getContext();
        //System.out.println("CAMBIO->"+newContext);
        
        synchronized (handlers)
        {
            for (int i=0;i<handlers.size();i++)
            {
                ContextHandler c=(ContextHandler) handlers.get(i);
                if (c==source) continue;
                if (c.getContext().equals(newContext)) continue;
                c.setContext(newContext);
            }
        }
    }
    
    public void add(ContextHandler c)
    {
        synchronized(handlers)
        {
            if (!(handlers.contains(c)))
                handlers.add(c);
        }
    }
    
    public void remove(ContextHandler c)
    {
        synchronized(handlers)
        {
            if (handlers.contains(c))
                handlers.remove(c);
        }
    }
    
    public void subcontextEntered(ContextEvent e)
    {
    }
}
