/*
* Copyright 2010-2015 Institut Pasteur.
*
* This file is part of Icy.
*
* Icy is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Icy is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Icy. If not, see <http://www.gnu.org/licenses/>.
*/
package icy.gui.inspector;
import icy.gui.component.ImageComponent;
import icy.gui.component.button.IcyButton;
import icy.gui.main.GlobalPluginListener;
import icy.gui.util.ComponentUtil;
import icy.main.Icy;
import icy.plugin.PluginDescriptor;
import icy.plugin.abstract_.Plugin;
import icy.resource.ResourceUtil;
import icy.resource.icon.IcyIcon;
import icy.system.thread.ThreadUtil;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.ref.WeakReference;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
/**
* @author Stephane
*/
public class PluginsPanel extends JPanel implements GlobalPluginListener, Runnable
{
private class PluginComponent extends JPanel
{
/**
*
*/
private static final long serialVersionUID = -6723991851130108797L;
// we use a weak reference so the plugin can be released by GC
final WeakReference<Plugin> plugin;
/**
* internals
*/
final PluginDescriptor descriptor;
/**
*
*/
public PluginComponent(Plugin plugin)
{
super(true);
this.plugin = new WeakReference<Plugin>(plugin);
descriptor = plugin.getDescriptor();
setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
setBorder(BorderFactory.createEtchedBorder());
ComponentUtil.setFixedHeight(this, 24);
build();
}
/**
* build the component
*/
private void build()
{
removeAll();
final JComponent image = new ImageComponent(descriptor.getIconAsImage());
ComponentUtil.setFixedSize(image, new Dimension(20, 20));
final JLabel label = new JLabel(descriptor.getName());
label.setToolTipText(descriptor.getName() + " " + descriptor.getVersion());
final IcyButton killButton = new IcyButton(new IcyIcon(ResourceUtil.ICON_CLOSE, 16));
killButton.setFlat(true);
killButton.setEnabled(false);
killButton.setToolTipText("kill plugin");
ComponentUtil.setFixedSize(killButton, new Dimension(18, 18));
killButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
// kill plugin, not possible with our current implementation...
}
});
add(image);
add(Box.createHorizontalStrut(4));
add(label);
add(Box.createHorizontalGlue());
add(killButton);
add(Box.createHorizontalStrut(2));
refresh();
}
void refresh()
{
validate();
}
/**
* @return the plugin
*/
public Plugin getPlugin()
{
return plugin.get();
}
}
/**
*
*/
private static final long serialVersionUID = 8950935360929507468L;
private final JPanel pluginsPanel;
/**
*
*/
public PluginsPanel()
{
super(true);
pluginsPanel = new JPanel(true);
pluginsPanel.setLayout(new BoxLayout(pluginsPanel, BoxLayout.PAGE_AXIS));
setLayout(new BorderLayout());
add(new JScrollPane(pluginsPanel), BorderLayout.CENTER);
rebuildPluginPanel();
validate();
setVisible(true);
}
@Override
public void addNotify()
{
super.addNotify();
Icy.getMainInterface().addGlobalPluginListener(this);
}
@Override
public void removeNotify()
{
Icy.getMainInterface().removeGlobalPluginListener(this);
super.removeNotify();
}
void rebuildPluginPanel()
{
pluginsPanel.removeAll();
for (Plugin plugin : Icy.getMainInterface().getActivePlugins())
pluginsPanel.add(new PluginComponent(plugin));
pluginsPanel.add(Box.createVerticalGlue());
pluginsPanel.validate();
// as we use a scroll pane in tab, not nice...
pluginsPanel.getParent().validate();
pluginsPanel.getParent().repaint();
}
private PluginComponent getPluginComponent(Plugin plugin)
{
for (Component comp : pluginsPanel.getComponents())
{
if (comp instanceof PluginComponent)
{
final PluginComponent pluginComponent = (PluginComponent) comp;
if (pluginComponent.getPlugin() == plugin)
return pluginComponent;
}
}
return null;
}
@Override
public void run()
{
// need to be done on EDT
ThreadUtil.invokeNow(new Runnable()
{
@Override
public void run()
{
rebuildPluginPanel();
}
});
}
@Override
public void pluginStarted(Plugin plugin)
{
ThreadUtil.runSingle(this);
}
@Override
public void pluginEnded(Plugin plugin)
{
ThreadUtil.runSingle(this);
}
}