// **********************************************************************
//
// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
package IceGridGUI.LiveDeployment;

import java.awt.Component;

import javax.swing.Icon;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;

import java.util.Enumeration;

import IceGrid.*;
import IceGridGUI.*;


class Adapter extends TreeNode
{
    public Editor getEditor()
    {
        if(_editor == null)
        {
            _editor = new AdapterEditor();
        }
        _editor.show(this);
        return _editor;
    }

    public Component getTreeCellRendererComponent(
        JTree tree,
        Object value,
        boolean sel,
        boolean expanded,
        boolean leaf,
        int row,
        boolean hasFocus) 
    {
        if(_cellRenderer == null)
        {
            _cellRenderer = new DefaultTreeCellRenderer();
            _activeIcon = Utils.getIcon("/icons/16x16/adapter_active.png");
            _inactiveIcon = Utils.getIcon("/icons/16x16/adapter_inactive.png");
        }

        if(_currentEndpoints == null || _currentEndpoints.length() == 0)
        {
            _cellRenderer.setLeafIcon(_inactiveIcon);
        }
        else
        {
            _cellRenderer.setLeafIcon(_activeIcon);
        }

        _cellRenderer.setToolTipText(_toolTip);
        return _cellRenderer.getTreeCellRendererComponent(
            tree, value, sel, expanded, leaf, row, hasFocus);
    }

    Adapter(TreeNode parent, String adapterName, Utils.Resolver resolver,
            String adapterId, AdapterDescriptor descriptor, Ice.ObjectPrx proxy)
    {
        super(parent, adapterName);
        _resolver = resolver;
        _adapterId = adapterId;
        _descriptor = descriptor;

        setCurrentEndpoints(proxy);
    }

    AdapterDescriptor getDescriptor()
    {
        return _descriptor;
    }
    
    Utils.Resolver getResolver()
    {
        return _resolver;
    }

    String getCurrentEndpoints()
    {
        return _currentEndpoints;
    }

    java.util.Map getProperties()
    {
        if(_parent instanceof Server)
        {
            return ((Server)_parent).getProperties();
        }
        else
        {
            return ((Service)_parent).getProperties();
        }
    }

    boolean update(AdapterDynamicInfo info)
    {
        if(info == null)
        {
            setCurrentEndpoints(null);
            getRoot().getTreeModel().nodeChanged(this);
            return true;
        }
        else if(info.id.equals(_adapterId))
        {
            setCurrentEndpoints(info.proxy);
            getRoot().getTreeModel().nodeChanged(this);
            return true;
        }
        else
        {
            return false;
        }
    }

    boolean update(java.util.List infoList)
    {
        java.util.Iterator p = infoList.iterator();
        while(p.hasNext())
        {
            AdapterDynamicInfo info = (AdapterDynamicInfo)p.next();
            if(update(info))
            {
                return true;
            }
        }
        return false;
    }

    private void setCurrentEndpoints(Ice.ObjectPrx proxy)
    {
        if(proxy == null)
        {
            _currentEndpoints = null;
            _toolTip = "Inactive";
        }
        else
        {
            String str = proxy.toString();
            int index = str.indexOf(':');
            if(index == -1 || index == str.length() - 1)
            {
                _currentEndpoints = "";
            }
            else
            {
                _currentEndpoints = str.substring(index + 1);
            }
            _toolTip = "Published endpoints: " + _currentEndpoints;
        }
    }


    private AdapterDescriptor _descriptor;
    private Utils.Resolver _resolver;
    private String _adapterId;

    private String _currentEndpoints;
    private String _toolTip;

    static private DefaultTreeCellRenderer _cellRenderer;
    static private Icon _activeIcon;
    static private Icon _inactiveIcon;

    static private AdapterEditor _editor;
}
