/**
 * 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.generator.gui;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.SwingWorker;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreePath;
import org.inb.biomoby.central.MobyCentral;
import org.inb.biomoby.central.model.MobyCentralModel;
import org.inb.biomoby.central.model.ServicesModel;
import org.inb.biomoby.central.gui.AbstractMobyServicesTreePanel;
import org.inb.biomoby.central.gui.renderer.EntityTreeCellRenderer;
import org.inb.biomoby.shared.registry.Service;
import org.inb.swing.ImageLoader;
import org.inb.swing.LabelButton;

/**
 * @author Dmitry Repchevsky
 */

public abstract class AbstractServiceModelPanel extends AbstractMobyServicesTreePanel
        implements PropertyChangeListener, TreeSelectionListener
{   
    protected LabelButton reloadButton;
    protected LabelButton generateButton;
    
    protected String filePath;

    public AbstractServiceModelPanel()
    {
        tree.setCellRenderer(new EntityTreeCellRenderer());
        tree.addTreeSelectionListener(this);

        reloadButton = new LabelButton(new ImageIcon(ImageLoader.read("images/reload.png")));
        reloadButton.setEnabled(false);
        
        reloadButton.setToolTipText("completely reload services' information from a server");
        reloadButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                try
                {
                    ServicesModel.instance().reload();
                }
                catch(Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        });

        generateButton = new LabelButton(new ImageIcon(ImageLoader.read("images/save.png")));
        generateButton.setEnabled(false);

        generateButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                try
                {
                    generate();
                }
                catch(Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        });

        control.add(reloadButton);
        control.add(generateButton);
    }

    private void generate()
    {        
        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        chooser.setDialogTitle("Directory Selection");
        chooser.setApproveButtonText("Select");
        chooser.setApproveButtonToolTipText("Select the directory where to put generated files");
        
        int returnVal = chooser.showOpenDialog(this);
        
        if(returnVal == JFileChooser.APPROVE_OPTION)
        {
            generateButton.setEnabled(false);

            File file = chooser.getSelectedFile();
            List<Service> services = getSelectedServices();
            generate(file, services);
        }
    }

    protected abstract void generate(File file, List<Service> services);

    public void valueChanged(TreeSelectionEvent e)
    {
        TreePath path = tree.getSelectionPath();
        generateButton.setEnabled(path != null);
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt)
    {
        Object value = evt.getNewValue();

        if (SwingWorker.StateValue.DONE.equals(value))
        {
            TreePath path = tree.getSelectionPath();
            generateButton.setEnabled(path != null);
        }
    }

    @Override
    public void modelCleared()
    {
        super.modelCleared();

        if (generateButton != null)
        {
            TreePath path = tree.getSelectionPath();
            MobyCentral central = MobyCentralModel.instance().getSelectedCentral();
            generateButton.setEnabled(path != null && central != null);
        }
    }
}
