/**
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 *
 * Copyright (C)
 * <a href="http://www.inab.org">Spanish National Institute of Bioinformatics (INB)</a>
 * <a href="http://www.bsc.es">Barcelona Supercomputing Center (BSC)</a>
 * <a href="http://inb.bsc.es">Computational Node 6</a>
 */

package org.inb.biomoby.central.gui;

import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import org.inb.biomoby.central.gui.model.ServicesTreeModel;
import org.inb.biomoby.shared.registry.Service;
import org.inb.swing.ImageLoader;

/**
 * Abstract implementation of BioMoby services tree component
 * 
 * @author dmitry Repchevsky
 */

public abstract class AbstractMobyServicesTreePanel extends AbstractEntityTreePanel
{
    public AbstractMobyServicesTreePanel()
    {
        tree.setShowsRootHandles(false);
        setBackgroundImage(ImageLoader.read("images/moby_services.png"));
    }

    JTree createTreeComponent()
    {
        JTree treeComponent = new JTree(new ServicesTreeModel());
        treeComponent.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

        return treeComponent;
    }

    JPanel createControlComponent()
    {
        JPanel panel = new JPanel(new GridLayout(0, 2, 1, 1));
        panel.setOpaque(false);

        return panel;
    }

    /**
     * Method returns all currently selected services.
     *
     * @return - a list of selected services
     */
    protected List<Service> getSelectedServices()
    {
        List<Service> services = new ArrayList<Service>();

        TreePath[] paths = tree.getSelectionPaths();
        if (paths != null)
        {
            for (TreePath path : paths)
            {
                DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
                Object userObject = node.getUserObject();

                if (userObject instanceof Service)
                {
                    services.add((Service)userObject);
                }
                else
                {
                    for (int i = 0, n = node.getChildCount(); i < n; i++)
                    {
                        DefaultMutableTreeNode child = (DefaultMutableTreeNode)node.getChildAt(i);
                        userObject = child.getUserObject();

                        if (userObject instanceof Service)
                        {
                            services.add((Service)userObject);
                        }
                    }
                }
            }
        }

        return services;
    }
}
