/*
* 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.plugin;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import icy.gui.frame.ActionFrame;
import icy.gui.util.GuiUtil;
import icy.plugin.PluginDescriptor;
import icy.plugin.PluginUpdater;
import icy.system.thread.ThreadUtil;
import icy.util.StringUtil;
/**
* @author Stephane
*/
public class PluginUpdateFrame extends ActionFrame
{
JList pluginList;
private DefaultListModel listModel;
public PluginUpdateFrame(final List<PluginDescriptor> toInstallPlugins)
{
super("Plugin Update", true);
setPreferredSize(new Dimension(640, 500));
final JPanel titlePanel = GuiUtil.createCenteredBoldLabel("Select the plugin(s) to update in the list");
titlePanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
final JTextArea changeLogArea = new JTextArea();
changeLogArea.setEditable(false);
final JLabel changeLogTitleLabel = GuiUtil.createBoldLabel("Change log :");
listModel = new DefaultListModel();
pluginList = new JList(listModel);
for (PluginDescriptor plugin : toInstallPlugins)
listModel.addElement(plugin);
pluginList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
pluginList.getSelectionModel().addListSelectionListener(new ListSelectionListener()
{
@Override
public void valueChanged(ListSelectionEvent e)
{
final PluginDescriptor plugin = (PluginDescriptor) pluginList.getSelectedValue();
if (plugin != null)
{
// plugin.loadChangeLog() can take lot of time, better to do that in background...
ThreadUtil.bgRun(new Runnable()
{
@Override
public void run()
{
plugin.loadChangeLog();
final String changeLog = plugin.getChangeLog();
if (StringUtil.isEmpty(changeLog))
changeLogArea.setText("no change log");
else
changeLogArea.setText(changeLog);
changeLogArea.setCaretPosition(0);
changeLogTitleLabel.setText(plugin.getName() + " change log");
}
});
}
}
});
pluginList.setSelectionInterval(0, toInstallPlugins.size() - 1);
getOkBtn().setText("Update");
getCancelBtn().setText("Close");
setCloseAfterAction(false);
setOkAction(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
// launch update
doUpdate();
}
});
final JScrollPane medScrollPane = new JScrollPane(pluginList);
final JScrollPane changeLogScrollPane = new JScrollPane(GuiUtil.createTabArea(changeLogArea, 4));
final JPanel bottomPanel = GuiUtil.createPageBoxPanel(Box.createVerticalStrut(4),
GuiUtil.createCenteredLabel(changeLogTitleLabel), Box.createVerticalStrut(4), changeLogScrollPane);
final JPanel mainPanel = getMainPanel();
final JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, medScrollPane, bottomPanel);
mainPanel.add(titlePanel, BorderLayout.NORTH);
mainPanel.add(splitPane, BorderLayout.CENTER);
pack();
addToDesktopPane();
setVisible(true);
center();
requestFocus();
// set splitter to middle
splitPane.setDividerLocation(0.5d);
}
/**
* update selected plugins
*/
protected void doUpdate()
{
final ArrayList<PluginDescriptor> plugins = new ArrayList<PluginDescriptor>();
for (Object value : pluginList.getSelectedValues())
plugins.add((PluginDescriptor) value);
for (PluginDescriptor plugin : plugins)
listModel.removeElement(plugin);
// no more plugin to update ? close frame
if (listModel.isEmpty())
close();
// process plugins update in background
ThreadUtil.bgRun(new Runnable()
{
@Override
public void run()
{
if (!plugins.isEmpty())
PluginUpdater.updatePlugins(plugins, true);
}
});
}
}