package cnp.ew.lightweight;

import java.awt.*;
import java.util.*;
import cnp.ew.util.*;
import cnp.ew.text.*;

public class CpLcDialog extends Dialog implements CpObserver, CpObservable
{
    CpLcPanel lcPanel;
    Vector observers;
    boolean isModal;

    public CpLcDialog(Frame parentFrame, String title, boolean isModal)
    {
        super(parentFrame, title, false);
        this.isModal = isModal;
        if (isModal) {
            parentFrame.disable();
        }
        setResizable(false);
        lcPanel = new CpLcPanel();
        super.add("Center", lcPanel);
    }

    public synchronized void show()
    {
        pack();
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {}
        getRootPanel().requestFocus();
        getRootPanel().gotFocus(new Event(null, 0, null), null);
        resize(preferredSize());
        centerDialog();
        super.show();
    }

    void centerDialog()
    {
        Dimension preferredSize = preferredSize();
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        move(
            (screenSize.width - preferredSize.width) / 2,
            (screenSize.height - preferredSize.height) / 2
        );
    }
/*
    public void layout()
    {
        if (lcPanel != null) {
            Insets insets = insets();
            lcPanel.reshape(insets.left, insets.top, size().width - insets.left - insets.right, size().height - insets.top - insets.bottom);
        }
    }
*/
    public CpLcPanel getRootPanel()
    {
        return lcPanel;
    }

    public void setLc(CpLightweightComponent lc)
    {
        lcPanel.setLc(lc);
    }

    public void add(CpLightweightComponent lc)
    {
        lcPanel.add(lc);
    }

    public void update(CpObservable target, int facet, Object arg)
    {
    }

    public void closeWindow()
    {
        hide();
        dispose();
        if (isModal) {
            getParent().enable();
        }
    }


    public Vector getObservers()
    {
        if (observers == null) {
            observers = new Vector();
        }
        return observers;
    }

    // Q: Why is this synchronized?
    public synchronized void addObserver(CpObserver o)
    {
        getObservers().addElement(o);
    }


    synchronized public void removeObserver(CpObserver o)
    {
        getObservers().removeElement(o);
    }

    public void notifyObservers()
    {
        notifyObservers(0, null);
    }

    public void notifyObservers(Object arg)
    {
        notifyObservers(0, arg);
    }

    public void notifyObservers(int facet)
    {
        notifyObservers(facet, null);
    }

    public void notifyObservers(int facet, Object arg)
    {
        CpObserver o;

        for (int i = 0; i < getObservers().size(); i++) {
            o = (CpObserver)getObservers().elementAt(i);
            o.update(this, facet, arg);
        }
    }
}